Problem mit For-Schleife (Rückgabeparameter)
-
Guten Morgen, ich habe ein kleines Problem. Ich bin in der C-Programmierung leider noch nicht so bewandert, habe lediglich ein Semester Java-Programmieren studiert
Nun habe ich in meinem C-Code ein Problem:if ( RC0 == 1 ) { for ( i = 0; i < y; i++ ) { PutChar(0xAF); __delay_ms(20); if ( RC0 != 1 ) { PutChar(0xC5); return x = 1; } if ( x == 1 ) { return y; } } }
Was ich machen möchte ist folgendes:
Solange die Bedingung RC0 == 1 erfüllt ist, soll eine for-schleife anfangen zu zählen. Die forschleife soll die Funktion PutChar ausführen, 20ms warten und dann prüfen, ob die Bedingung immernoch erfüllt ist. Ist dies nicht der Fall, soll x=1 ausgegeben werden. Nimmt x den Wert 1 an, soll der wert des aktuellen schleifendurchlaufes in y gespeichert werden und von der ersten if-funktion weiterverarbeitet werden.
Nun ist mein Problem, dass das ganze irgendwie nicht so hinhaut, wie ich mir das vorstelle. Ist es überhaupt möglich einen schleifendurchlauf zurückzugeben, oder welchen fehler mache ich? Wäre nett, wenn ihr mir helfen könnt, oder einen beispielcode schreiben könntet.Vielen Dank
-
Mit return wird die aktuelle Funktion beendet und zur aufrufenden Funktion zurück gesprungen (in main wird das Programm beendet)
Wenn du dir for-Schleife abbrechen willst, musst du break nehmen.
Die Variablen behalten dabei ihre Werte.for ( i = 0; i < y; i++ ) { PutChar(0xAF); __delay_ms(20); if ( RC0 != 1 ) { PutChar(0xC5); x = 1; break; } }
Der Wert des aktuelle Schleifendurchlaufs steht aber in i.
Wenni >= y
ist, dann wurde die Schleife nicht vorzeitig beendet.
-
Ich habe den Code jetzt mal angepasst:
if ( RC0 == 1 ) { for ( i = 0; i < 50; i++ ) { PutChar(0xAF); __delay_ms(20); if ( RC0 != 1 ) { PutChar(0xC5); break; } } }
Also ich zähle jetzt bis 50, und wenn ich mit dem zweiten if abbreche, bleibt der aktuelle schleifendurchlauf nicht in int i gespeichert, also sagen wir ich breche bei durchlauf 13 ab, muss ja i = 13 sein. doch ich kann außderhalb der for schleife i nicht verwenden. Was ich explizit machen will ist, die dauer der eingabe von RC0 = 1 in einer variable abspeichern und für spätere verwendungen im code abrufbar machen.
Könnt ihr mir hierbei helfen? Der code oben compiliert, aber i hat keinen wert zugewießen bekommen...
-
ROOT_92 schrieb:
..., aber i hat keinen wert zugewießen bekommen...
Wie stellst du das fest?
Ist das auch wirklich der Code? Mit Copy&Paste aus deinem Programm hier eingefügt?
-
Wie ist RCO deklariert?
-
Hier ist mein code copy/paste:
Init(); if ( RC0 == 1 ) { for ( i = 0; i < 50; i++ ) { PutChar(0xAF); __delay_ms(20); if ( RC0 != 1 ) { PutChar(0xC5); break; } } write.eeprom(i); } if ( RC1 == 1 ) { read.eeprom; switch (i) { case 1: ... case 50: } }
Ich programmiere Microcontroller in C wobei RC0 und RC1 eingänge sind, welche per include definiert sind ...diese können true = 1 oder false = 0 sein.
ICh wende mich an dieses forum, da ich nur syntaktische fragen habe, und keine fachbezogenenwenn ich die schleife z.b. bis 13 zählen lasse, und ich dann mein eeprom über switch ( i) auslese, passiert bei i = 13 nichts
-
naja, nicht ganz copy/paste..hab die funktionsaufrufe bei den cases weggelassen
-
ROOT_92 schrieb:
Ich bin in der C-Programmierung leider noch nicht so bewandert, habe lediglich ein Semester Java-Programmieren studiert
Macht nichts, jeder macht mal Fehler.
Also ich habe deine textuelle Beschreibung nicht wirklich verstanden, aber biete mal an:
int i; for( i = 0; RC0 == 1; i++ ) /* solange RC0 == 1, i hochzählen... */ { PutChar(0xAF); /* ...Ausgabe machen... */ __delay_ms(20); /* ...und 20ms warten */ } /* hier ist jetzt RC0 != 1, da for beendet ist */ PutChar(0xC5); /* i hat hier die Anzahl der obigen for-Durchläufe, also evtl. einfach: */ write.eeprom(i);
-
Danke Wutz,
ich glaube, dass das genau das ist, was ich gesucht habe...werde ich bald ausprobieren, sobald mein kompletter code fertiggestellt ist
-
Hallo, ich hoffe hier antwortet noch jemand, das Thema ist ja schon etwas älter.
Also ich bin jetzt weitgehen fertig mit dem code, nur leider hab ich das folgende problem: hier mein code, copy/paste:while (1) { Init(); if ( RC1 == 1 ) { for( i = 0; RC1 == 1; i++ ) { /* solange RC0 == 1, i hochzählen... */ PutChar(0xAF); /* ...Ausgabe machen... */ __delay_ms(20); /* ...und 20ms warten */ } PutChar(0xCE); __delay_ms(20); break; } /* hier ist jetzt RC0 != 1, da for beendet ist */ if ( RC0 == 1 ) { for( j = 0; j == i; j++ ) { PutChar(0xAF); __delay_ms(20); if ( j == i ) { PutChar(0xCE); __delay_ms(20); } } break; } }
Ich habe das beispiel von Wutz angewandt, doch muss ich feststellen, dass die variable i leer ist.
Nochmal genau was ich machen will:Ich will in der ersten For-Schleife i solange höchzählen, bis die Bedingung RC1 == 1 nicht mehr erfüllt ist. i hat ja danach den Wert des aktuellen schleifendurchgangs, oder nicht?
In der zweiten schleife will ich, dass wenn die Bedingung RC0 == 1 erfüllt ist, eine weitere for-schleife genau an den selben Punkt hinzählt, wie die schleife zuvor, also bis j == i, dann soll sie abbrechen.
Nur funktioniert das ganze leider nicht, an was kann das liegen?
Vielen Dank im vorraus
-
Wenn ich mir den Code so ansehe bedeutet, dass wenn i leer ist, RC1 nie 1 ist.
-
Irgendeinen Wert wird i schon haben, auch wenn er 0 ist.
Dir ist auch klar, dass du mit dem
break;
diewhile
-Schleife beendest?Wie sind RC1 und RC0 definiert? Sind die
volatile
?