PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Diesen Code verstehe ich nicht ganz.



KRibel
06-01-2006, 09:41
HI Leute!

Also ersteinmal möchte ich allen Danken die Gestern sich bemüht haben meine Probleme zu lösen.
Ich habe hier noch eins.

Undzwar diesen Code:


1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <string.h>

4. #define LSTART -4
5. #define NIMMER 4
6. #define NICHT -2

7. int main(void)
8. {
9. int i;
10. char a='5';
11. printf("a=%c b=%i c=%i\n",a,(int)a, atoi(&a));

12. for (i=LSTART; i<9; i++)
13. {
14. if (i==NICHT) continue;
15. if (i==NIMMER) break;
16. printf("Loop Cnt i=%i\n",i);
17. }
18. }


Das Programm gibt volgendes aus:


a=5 b=53 c=5
Loop Cnt i=-4
Loop Cnt i=-3
Loop Cnt i=-1
Loop Cnt i=0
Loop Cnt i=1
Loop Cnt i=2
Loop Cnt i=3
Speicherzugriffsfehler


Was bedeutet in der Zeile 11 >atoi(&a)<? &a ist die Adresse von a. Heißt dann dass atoi ein Zeiger ist? Wenn ja, wieso funktioniert es? atoi ist nirgends definiert.

Die Zeile 14 ist doch eigentlich unnötig, oder? Ob sie jetzt da ist oder nicht, das Ergebnis wird trotzdem gleich aussehen, oder?

Und die Letzte Frage. Wieso bekomme ich einen Speicherzugriffsfehler am Ende?:confused:


Gruß

Konstantin

bischi
06-01-2006, 09:52
atoi(string) verwandelt einen String in einen Integer...

a ist logischerweise 5.
(int)a gibt 53, da dies der (binäre) wert ist, den das Zeichen (laut ASCII?) a besitzt.
atoi konvertiert wieder richtig.

Warum bei einem Break ein speicherzugriffsfehler auftritt, seh ich aber auch nicht.

MfG Bischi

PS: Speicherzugriffsfehler wahrscheinlich, weil ein return 0; am ende des Programmes fehlt; break bricht die Schleife ab, weiss dann aber wohl nicht genau, wo es hingehen soll... Wundert mich aber, dass da der Compiler nicht meckert...

peschmae
06-01-2006, 10:07
Den Speicherzugriffsfehler seh ich auch nicht - gibts bei mir auch keinen.

Mit atoi solltest du aber Grundsätzlich eher vorsichtig sein bzw. was anderes verwenden weil du bei atoi nicht mitkriegst wenn beim Konvertieren was fehlschlug.

MfG Peschmä

KRibel
06-01-2006, 10:14
Den Speicherzugriffsfehler seh ich auch nicht - gibts bei mir auch keinen.

Warum bei einem Break ein speicherzugriffsfehler auftritt, seh ich aber auch nicht.

Ich habe diesen Fehler gefunden.
Das war nur ein Teil aus einem Programm was ich euch da präsentiert habe. Ich habe im Programmteil davor ein char als ein string eingelesen. Ich habe es jetzt geändert und der Fehler ist weg.

Gruß

Konstantin

ninguno
06-01-2006, 10:22
atoi ist eine funktion die als parameter einen string (char pointer) erwartet, diesen interpretiert und, sofern da ne zahl drin steht, diese als integer wert zurückgibt.
in deinem bsp ist a als variable vom typ char definiert. mit &a wird die adresse von a (also ein char pointer) an atoi übergeben. wie gesagt, atoi verlangt einen char pointer. allerdings ist das fehlerhaft erweise ein pointer auf einen string ohne null zeichen am ende und funktioniert hier nur zufällig, weil offenbar am stack danach gleich ein null zeichen liegt. das kannst du ausprobieren indem du zb eine andere variable vor a definierst
int i;
char c[]="11";
char a='5';
dann kommt bei mir das raus
a=5 b=53 c=511
hängt aber sicher von der version des compilers und von compiler optionen etc. ab, ist also nicht vorhersagbar.
resümee: das programm ist fehlerhaft!

Joghurt
06-01-2006, 13:26
Die Zeile 14 ist doch eigentlich unnötig, oder? Ob sie jetzt da ist oder nicht, das Ergebnis wird trotzdem gleich aussehen, oder?
Nein. Continue heißt: beginnen einen neuen Schleifendurchlauf. Der Rest der Schleife wird nicht ausgeführt:
for(int i=0;i<10;i++){
if (i%2 == 0) continue;
printf("%i\n",i);
}gibt dir nur die ungeraden Zahlen aus.

KRibel
06-01-2006, 13:29
Vielen Dank an alle!!!