Hallo zusammen,
ich scheine wohl die seltsamstem Fehler mit meinem
STM32 zu haben.
so versuche ich eine dämlich schleife
1
int=0;
2
3
for(i=0;ende==1;i++)
4
{
5
if(i==5)
6
{
7
GPIO_SetBits(GPIOE,GPIO_Pin_5);
8
ende=1;
9
}
10
}
das ist eine einfach blöde schleife in der main()
an der der compiler auch nichts auszusetzen hat,
aber es tut sich nichts!
mach ich eine einfach abfrage außerhalb einer schleife z.B.
1
inti=5;
2
3
if(i==5)
4
{
5
GPIO_SetBits(GPIOE,GPIO_Pin_5);
6
}
funktionierst tadellos
was kann denn sein?
ich verstehs einfach nicht
also das ist meine main momentan,
unwichtige sachen habe ich auskommentiert und hier nicht reingesetzt!
das da unten geht zum beispiel auch nicht, warum auch immer
achja, und ihr könnt mich dutzen ;)
oh mann, das war wohl einwenig zuviel desguten heute -_-
hab einen richtig fetten denkfehler gehabt,
wenn etwas ungleich ist, dann ist es ja wahr -_-
schön das man sich mit sowas dann 3std auseinandersetzt
danke für den hinweis
Hmm? Glaub morgen denkst nochmal drüber nach.
Wenn eine Bedingung erfüllt ist (sie führt nicht zum Widerspruch), dann
ist sie wahr.
Es scheint mir eher, dass du hier Schleifenbedingung und
Abbruchbedingung durcheinander bringst. Bei for (<a>;<b>;<c>) steht b
für die Bedingung, die nötig ist um die Schleife zu wiederholen, nicht
jedoch um auszutreten.
> for (i=0; ende == 1; i++)> {> if (i == 5)> {> GPIO_SetBits(GPIOE,GPIO_Pin_5);> ende = 1;> }> }
Programmierer, die mir solchen Code abliefern, bekommen im Allgemeinen
die Höchststrafe ;-) Gründe: Der Code ist so kompliziert wie nur
möglich. Eine For-Schleife mit Abbruchbedingung, die auch noch vom
Schleifenzähler abhängt im Schleifenrumpf. Was soll das? Aber scheinbar
ist der Programmierer ja bereits selbst über dieses Konstrukt
gestolpert.
Just my 2 cents.
huch, da haben ja welche noch geantwortet :)
bin da ein laie,
entwickel noch das feingefühl dafür,
ich sollte mir nochmal die unterlagen rausholen,
weil ich schön regelmäßig dran hängen bleibe :P
Moin,
Ich gehe mal davon aus, das mit "funktionieren Schleife" und ähnlichem
gemeint ist, dass der Pin5 am GPIOE auf High geht.
Das würde ja nur passieren, wenn i==5 ist. Deshalb soll i in der
Schleife ja nach oben gezählt werden (mit i++).
1
for(i=0;ende==1;i++)
2
{
3
if(i==5){
4
GPIO_SetBits(GPIOE,GPIO_Pin_5);
5
ende=1;
6
}
7
}
Da müsste folgendes Passieren:
- Start der Schleife i wird auf 0 gesetzt
- if bedingung (i==5) nicht erfüllt, da i==0
- Schleife wird beendet, da die Wiederholbedingung ende==1 nicht erfüllt
ist
Dass es so nicht geht, wurde ja schon beschrieben. Nun zur nächten
Variante...
1
for(i=0;ende!=1;i++)
2
{
3
if(i==5){
4
GPIO_SetBits(GPIOE,GPIO_Pin_5);
5
ende=1;
6
}
7
}
Da müsste folgendes Passieren:
- Start der Schleife i wird auf 0 gesetzt
- if bedingung (i==5) nicht erfüllt, da i==0
- nächster schleifendurchlauf, i dann 1
- if bedingung (i==5) nicht erfüllt, da i==1
- nächster schleifendurchlauf, i dann 2
- if bedingung (i==5) nicht erfüllt, da i==2
- nächster schleifendurchlauf, i dann 3
- if bedingung (i==5) nicht erfüllt, da i==3
- nächster schleifendurchlauf, i dann 4
- if bedingung (i==5) nicht erfüllt, da i==4
- nächster schleifendurchlauf, i dann 5
- if bedingung (i==5) erfüllt, Set GPIOE_Pin5, ende dann 1
- Schleife wird beendet, da die Wiederholbedingung ende!=1 nicht erfüllt
ist
Hier ein anderes Beispiel.
1
for(i=0;i<6;i++)
2
{
3
if(i==2){
4
i++;
5
continue;//schleifendurchlauf abbrechen und nächsten durchlauf starten
6
}
7
if(i==5){
8
GPIO_SetBits(GPIOE,GPIO_Pin_5);
9
break;//schleifendurchlauf abbrechen und schleife verlassen
10
}
11
}
Da müsste folgendes Passieren:
- Start der Schleife i wird auf 0 gesetzt
- if bedingung (i==2) nicht erfüllt, da i==0
- if bedingung (i==5) nicht erfüllt, da i==0
- nächster schleifendurchlauf, i dann 1
- if bedingung (i==2) nicht erfüllt, da i==1
- if bedingung (i==5) nicht erfüllt, da i==1
- nächster schleifendurchlauf, i dann 2
- if bedingung (i==2) erfüllt, i dann 3, nächster schleifendurchlauf, i
dann 4
- if bedingung (i==2) nicht erfüllt, da i==4
- if bedingung (i==5) nicht erfüllt, da i==4
- nächster schleifendurchlauf, i dann 5
- if bedingung (i==2) nicht erfüllt, da i==5
- if bedingung (i==5) erfüllt, Set GPIOE_Pin5, Schleife wird beendet
(obwohl die schleife weiter laufen werden würde, solange i<9 ist, wird i
nicht höher als 5, da die Schleife mit break verlassen wurde. Einen
Schleifendurchlauf mit i==3 gibt es hier auch nicht.)
Ich hoffe, es hilft weiter...
MFG
High Performer schrieb:> Programmierer, die mir solchen Code abliefern, bekommen im Allgemeinen> die Höchststrafe ;-)
Sehe ich auch so.
Der besseren Verstehbarkeit und vor allem der geringeren
Fehleranfälligkeit wegen, sollten alle 3 Ausdrücke im for die gleiche
Variable benutzen.
Nur weil man einen 32Bit Boliden benutzt, muß man nicht unnütz mit
Variablen um sich schmeißen.
Insbesondere Variablen, die 1000 Zeilen vorher gesetzt werden, verwirren
Dich nur selbst.
Jede Variable muß einen triftigen Grund haben, warum Du sie erzeugst.
Kleiner Code ist oftmals auch einfacher zu verstehen.
Peter
Danke Joe-C für die ausführliche Erklärung.
Sowas hilft echt weiter :)
Werde mal meinen Quellcode dahingegen mal optimieren ;)
Peter, ich hätte auch den Code reingepostet,
der ist bloß inzwischen überdeminsional. :P
Ich schreibe Schleifen gerne abwärts zählend, dann sehe ich sofort im
ersten Ausdruck die Anzahl der Durchläufe.
Auch lege ich die Schleifenvariable im for an, dann weiß der Compiler,
sie ist danach wieder ungültig.
1
for(uint8_ti=123;i;i--){
2
// mache was
3
}
Ich finde das am besten lesbar und am wenigsten fehleranfällig.
Peter
das habe ich auch schon versucht,
nur witzigerweise verweigert mein compiler das,
warum auch immer?!
so muss ich nach funktionsaufruf,
eine lokale variable erstellen,
mit der gearbeitet werden kann.
ich werds mal gleich nochmal ausprobieren,
und die fehlermeldung posten
Will mein Compiler auch nicht, nimmt nur Variablen, die direkt am Anfang
der Funktion erzeugt werden.
void test (){
uint8_t i;
for (i=0;i<20; i++)
{
}
}
wird akzeptiert
void test (){
for (uint8_t i=0;i<20; i++)
{
}
}
das aber nicht.
Gibts da einen Standard? Oder kann das jeder Compilerbauer handhaben wie
er will?
Ist kein wirkliches Problem, nur interessehalber.
H.joachim Seifert schrieb:> Will mein Compiler auch nicht, nimmt nur Variablen, die direkt am Anfang> der Funktion erzeugt werden.
Das geht auch erst mit C99 (oder C++). Kann sein, dass der Compiler das
nicht kennt, kann sein, dass man das erst per Option freigeben muss.
also habe folgendes gemacht,
ich habe eine funktion erstellt
1
voiddelay(intg)
2
{
3
for(intr=0;r!=g;r++)
4
{
5
GPIO_SetBits(GPIOE,GPIO_Pin_4);
6
}
7
8
GPIO_ResetBits(GPIOE,GPIO_Pin_4);
9
}
beim Compilieren kommt folgende Fehlermeldung:
main.c(498): error: #29: expected an expression
main.c(498): error: #20: identifier "r" is undefined
die routine ist eigentlich klar,
mach solange weiter bis r g entspricht,
oder anders gesagt,
mach solange weiter wie r ungleich g ist.
aber folgendes akzeptiert der compiler
A.K.
wenn du mir, ohne mich vorher zu lynchen,
verräts wo man das nachschauen kann,
verrate ich es dir...
habe gerade in keil gesucht,
nichts dazu gefunden (compiler)