C Programm zur Berechnung von Pi - "Der Bezeichner ist nicht definiert" ?

Cinematic

Lt. Commander
Registriert
Dez. 2010
Beiträge
1.155
Beachte den Scope! wdh wird innerhalb der while-Schleife deklariert, was aber davor gemacht werden muss. Alles innerhalb der Schleife, bleibt innerhalb der Schleife, wie in Vegas. :)
 
Hallo Cinematic!

Die Variable wdh hast du lokal innerhalb der do-while-Schleife angelegt.
Wenn du jetzt zum while(wdh == 1) kommst ist dieses wdh aber nicht mehr bekannt da es mit dem Ende des Blockes also '}' zerstört wird.

Die Lösung ist also ganz simpel.
Du definierst die Variable wdh außerhalb der äußeren do-while-Schleife.

€: War zu langsam
 
Danke schonmal euch beiden, funktioniert nun alles.
Zum Verständnis nochmal kurz:

Werden nach dem Verlassen des Anweisungsblockes alle Änderungen an Variablen "zerstört" ?

Oder nur Deklarationen ?
 
Eine Variable bleibt nur solange im Speicher, bis du den Anweisungsblock verlässt, indem du sie ins Leben gerufen hast.

Die Änderungen, die du an Variablen von übergeordneten Answeisungsblöcken vornimmst, bleiben erhalten.

Also, um es kurz mit deinen Worten auszurücken "Nur Deklarationen" ;)
 
@ Smagjus: Bis auf Pointer - die Daten dessen bleiben so lange erhalten, bis sie wieder freigegeben wurden. Der Zugriff erfolgt dabei aber genauso wie normale Variablen, heißt du kannst zwar auf den Speicher der Variablen x zugreifen, aber nicht mehr auf x selbst. Das wäre ein typisches Speicherleck.
 
Aus Sicht eines Javaianers würde ich sagen, dass beim Verlassen eines scopes einfach sämtliche darin erstellten Referenzen verfallen, was nicht automatisch heißt, dass die darin erstellten Objekte (also irgendwelche Daten in C) ebenfalls verfallen, wie Yuuri ja schon beschrieb.
 
Yuuri schrieb:
@ Smagjus: Bis auf Pointer.
Stimmt, an die hatte ich gerade nicht gedacht.

@Tumbleweed
Ich bin auch "Javaianers" und habe mit C bisher noch nicht programmiert. Aber die zugrundeliegenden Regeln sind wie so oft die gleichen :)
 
Vielleicht das gleiche nochmal in anderen Worten ;) Es wird einfach nur der Speicherbereich des lokalen Speichers (=Stack) invalidiert. D.h. alle Variablen innerhalb des Scopes "verlieren" ihren Wert. Wurde innerhalb des Scope auf Speicherbereiche zugegriffen, die nicht lokal auf dem Stack liegen, so bleiben die dennoch gültig. Dass nur die Deklaration nach exit aus dem Scope erlischt stimmt so aber nicht. Wenn du z.B. eine Objektinstanz als Variable im einem Block hast, so wird beim Verlassen dessen Destruktor aufgerufen. Die Daten sind u.U. noch physisch im Speicher verhanden, aber das wird nicht mehr garantiert.

Du kannst dir das wie einen "Stack" vorstellen. Wird ne neue Variable deklariert, so wächst der Stack um die geforderte Datenmenge. Wenn der Block dann verlassen wird fliegen alle darin deklarierten Variablen inklusive deren Speicherinhalb einfach wieder vom Stack runter.
 
Zuletzt bearbeitet:
Zurück
Oben