Forum: PC-Programmierung Zählvariable in for-schleife springt direkt auf Abbruchbedingung


von J. T. (chaoskind)


Lesenswert?

MoinMoin und n frohes Neues =)

Ich hab ein kleines Problem, ich befasse mich zur Zeit mit der 
Darstellung vom 3dimensionalen auf dem 2dimensionalen Bildschirm. Dazu 
hatte ich auch schon ein paar andere Fragen, bei denen mir geholfen 
wurde.

Nun aber ein rein "programiererisches" Problem. Um meine Körper zu 
verschieben, habe ich eine Funktion geschrieben, die die einzelnen 
Punkte des Körpers im Raum verschiebt. Nun habe ich eine übergeordnete 
Funktion geschrieben um den Körper als ganzes zu verschieben. Dazu rufe 
ich in einer for-Schleife einfach so oft die Punktverschiebung auf, wie 
der Körper Punkte hat. Aber die Zählvariable springt direkt auf die 
Abbruchbedingung.
1
void Koerper_Translation(sVektor* pSchiebevektor, sKoerper* pKoerper)
2
{
3
    uint32_t i = 0;
4
5
    for(i = 0; i < pKoerper->Punktzahl; i++);
6
    {
7
        Translation(pSchiebevektor, &pKoerper->Punkt[i]);
8
    }
9
}

mehr ist das nicht. Wenn ich einfach in der main
1
for(i = 0; i < pKoerper->Punktzahl; i++);
2
    {
3
        Translation(pSchiebevektor, &pKoerper.Punkt[i]);
4
    }

ausführe, klappt es. Über die Koerper_Translation siehts so aus:

Er springt in die Funktion, i wird erzeugt und auf 0 gesetzt. Dann 
springt er in die Schleife und i ist direkt 8. (Mein Kubus besteht aus 8 
Punkten).
Optimierungen sind aus, ich arbeite mit CodeBlocks(GCC)

MfG Chaos

von Mario (Gast)


Lesenswert?

Leere for-Schleife, weil Semikolon am Ende der for-Zeile.

von J. T. (chaoskind)


Lesenswert?

Danke!

von Ich (Gast)


Lesenswert?

Mario schrieb:
> Leere for-Schleife, weil Semikolon am Ende der for-Zeile.

Nicht schlecht, der Mann hat ein Auge für Details!

von Sebastian S. (amateur)


Lesenswert?

Tippfehler beim main()-Beispiel!

Mit dem Semikolon am Ende sollte es auch da nicht gehen.

von Oliver S. (oliverso)


Lesenswert?

Ich vermute dazu noch ein überzähliges &

Oliver

von Tom (Gast)


Lesenswert?

gcc erkennt das Semikolon-vor-Schleife-Problem (mit hochgedrehten 
Warnungen) leider nur bei if und else, nicht bei for und while.

von J. T. (chaoskind)


Lesenswert?

Sebastian S. schrieb:
> Mit dem Semikolon am Ende sollte es auch da nicht gehen.

Copy und Paste. Hatte die Schleife einfach aus dem Text nochmal kopiert 
und aus dem -> ein . gemacht. In der main stand es ohne, daher klappte 
es da auch.

Oliver S. schrieb:
> Ich vermute dazu noch ein überzähliges &

Ne das braucht er. Wird hieran liegen:
1
typedef struct sVektor__
2
{
3
    long double X;
4
    long double Y;
5
    long double Z;
6
}sVektor;
7
8
typedef struct sKante__
9
{
10
    uint32_t Start;
11
    uint32_t Ende;
12
    int Farbe;
13
}sKante;
14
15
typedef struct sKoerper__
16
{
17
    uint32_t Punktzahl;
18
    sVektor* Punkt;
19
    uint32_t Kantenzahl;
20
    sKante*  Kante;
21
}sKoerper;

von Rolf M. (rmagnus)


Lesenswert?

Tom schrieb:
> gcc erkennt das Semikolon-vor-Schleife-Problem (mit hochgedrehten
> Warnungen) leider nur bei if und else, nicht bei for und while.

Nun, während ein if ohne etwas, das auch tatsächlich bedingt ausgeführt 
werden soll, wenig sinnvoll ist, kann es sinnvolle Schleifen ohne 
Schleifenkörper durchaus geben.

von Tom (Gast)


Lesenswert?

Rolf M. schrieb:
> kann es sinnvolle Schleifen ohne
> Schleifenkörper durchaus geben.

clang erkennt das trotzdem und warnt, wenn das Semikolon in der gleichen 
Zeile steht. Echte C-Programmierer (die, die nie Fehler machen und immer 
alles im Block haben) werden sich dadurch natürlich in ihrer Freiheit 
eingeschränkt fühlen ;)
1
#include <stdio.h>
2
3
int main(void)
4
{
5
    size_t i;
6
    for (i = 0; i < 20; ++i);
7
    {
8
        printf("%zu\n", i);
9
    }
10
11
12
    for (i = 0; i < 20; ++i);
13
14
    {
15
        printf("%zu\n", i);
16
    }
17
18
    for (i = 0; i < 20; ++i)
19
        ;
20
    {
21
        printf("%zu\n", i);
22
    }
23
24
    if (i == 0);
25
    {
26
        printf("%zu\n", i);
27
    }
28
29
30
    return 0;
31
}

1
$ gcc -Wall -Wextra -pedantic  1.c 
2
1.c: In function ‘main’:
3
1.c:24:16: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
4
     if (i == 0);

1
$ clang  -Weverything 1.c 
2
1.c:24:16: warning: if statement has empty body [-Wempty-body]
3
    if (i == 0);
4
               ^
5
1.c:24:16: note: put the semicolon on a separate line to silence this warning
6
1.c:6:29: warning: for loop has empty body [-Wempty-body]
7
    for (i = 0; i < 20; ++i);
8
                            ^
9
1.c:6:29: note: put the semicolon on a separate line to silence this warning
10
1.c:12:29: warning: for loop has empty body [-Wempty-body]
11
    for (i = 0; i < 20; ++i);
12
                            ^
13
1.c:12:29: note: put the semicolon on a separate line to silence this warning
14
3 warnings generated.

von Oliver S. (oliverso)


Lesenswert?

J. T. schrieb:
> Oliver S. schrieb:
>> Ich vermute dazu noch ein überzähliges &
>
> Ne das braucht er.

In dem Fall meinte ich das andere ;)

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.