C: Geltungsbereich von Variablen
Schmidt
- programmiertechnik
Hallo
bei folgendem C-Code bekomme ich die Ausgabe
[...]
->8 Stellen: (0) (1) 2 (3) (4) (5) (6) (7) (8)
->8 Stellen: (0) 1 (2) (3) (4) (5) (6) (7) (8)
->8 Stellen: 0 (1) (2) (3) (4) (5) (6) (7) (8)
->9 Stellen: (0) (1) (2) (3) (4) (5) (6) (7) (8)
>Spielvarianten: 0
Variable 'varianten' enthält also den Wert 0 am Ende des Programms (Zeile C), obwohl nach der Initialisierung mit 0 offensichtlich '++varianten';(Zeile A) aufgerufen wurde, denn sonst gäbe es keine Ausgabe von Zeile B.
Wo liegt der Fehler?
Ich kann ihn nicht finden.
Danke.
#include <stdint.h>
#include <stdio.h>
int main(void){
uint8_t logic1;
uint8_t varianten=0;
for(uint8_t stellen=0; stellen<=9; stellen++){
//durchlaufe spielconfigs;
for(uint16_t spielstart=0; spielstart<=511; spielstart++){
logic1=0;
//count logic 1:
for(uint8_t x=0; x<=8; x++){
if( spielstart&(1<<x) ){
logic1++;
}
}
//printf("\n%d ", spielstart);
//print spielconfig
if( logic1==stellen){
++varianten; //Zeile A
printf("\n->%d Stellen: ", stellen); //Zeile B
//configuration ausgeben:
for(uint8_t h=0; h<=8; h++){
if( spielstart&(1<<h) ){
printf( "(%d) ", h );
}else{
printf( "%d ", h );
}
}
}
}
}
printf("\n>Spielvarianten: %d", varianten); //Zeile C
return 0;
}
Bei mir kommt 512 raus, ich hab allerdings die Zahlentypen alle durch int ersetzt.
Und das ist auch schon die Lösung, du zählst bis 512, hast aber nur 256 Plätze frei ;-)
Deine Variable hat also zweimal einen Überlauf und landet dann wieder bei 0.
Musst du so Platz sparen?
Bei mir kommt 512 raus, ich hab allerdings die Zahlentypen alle durch int ersetzt.
Und das ist auch schon die Lösung, du zählst bis 512, hast aber nur 256 Plätze frei ;-)
Deine Variable hat also zweimal einen Überlauf und landet dann wieder bei 0.
Ach natürlich. Wie unangenehm das nicht gesehen zu haben. Vielen Dank.
Musst du so Platz sparen?
Ich programmiere eigentlich für einen Mikrocontroller (ATMEL ATMEGA168PA).
Da ist es schon gut soweit es geht zu sparen.
Allerdings war das nur ein Testprogramm, welches ich auf meinem PC habe laufen lassen. Ich hätte also schon großzügiger sein können mit dem Speicherplatz.
Allerdings finde ich es unangenehm nicht zu wissen was ich nun meinem Variablentyp int hätte alles zutrauen können. Man kann sich ja nur auf die Mindestspeichergröße berufen. uint16_t ist da einfach klar und ohne Geheimnis.
Gruß
Schmidt
Allerdings finde ich es unangenehm nicht zu wissen was ich nun meinem Variablentyp int hätte alles zutrauen können. Man kann sich ja nur auf die Mindestspeichergröße berufen. uint16_t ist da einfach klar und ohne Geheimnis.
Was meinst du damit?