Habe ich etwas mit den Zeigern falsch gemacht???
-
Hallo.
Ich arbeite mich gerade in Zeiger ein (lerne neu C++) und stoße an einer Stelle auf etwas, was ich nicht so haben wollte. Hier mal der Code:
#include <iostream> using namespace std; void ausgeben(int *a, int laenge); void ausgeben(int *a, int laenge){ int b[laenge]; for(int i = 0; i < laenge; i++){ cout << "\n" << i << ": " << *(a+i); *(b+i) = 0; } a = b; cout << "\nENDE!"; } int main(){ int feld[10]; int laenge = (sizeof(feld) / sizeof(int)); cout << "\n Der Array hat "<<laenge<<" Zellen. \n Nun belegen wir es mit Zahlen!" << endl; for (int i = 0; i < laenge; i++ ){ feld[i] = i; } ausgeben(feld,laenge); ausgeben(feld,laenge); return = 0; }Die Funktion ausgeben gibt halt den übergebenen Array aus, aber erstellt selbst einen, füllt ihn mit null-werten. So, nun wollte ih folgendes machen. Diesen mit Nullen gefüllten Array b -> seine Adresse wollte ich in a reinschreiben. A ist zwar nur eine Kopie von feld, aber letztendlich die Kopie einer Adresse, kann also direkt an dem referenzierten Array arbeiten. Deshalb dachte ich: wenn ich b in a kopiere und im Hauptprogramm nochmal "feld" durch ausgabe(...) ausgeben lasse, sollten nur 0en erscheinen. Tun sie aber nicht. Wo liegt mein Denkfehler? Kann mir bitte jemand helfen?
Vielen Dank im Voraus.
Mfg,
pingu
-
a ist in der Funktion lediglich eine Kopie des Zeigers auf das Array. Somit kannst du a zuweisen, was du willst, es wird nur die interne Kopie verändert. Der Bereich, auf den der Zeiger zeigt ist ja unverändert. Du brauchst da einen Zeiger auf den Zeiger.
void ausgeben(int **a, int laenge){ int b[laenge]; for(int i = 0; i < laenge; i++){ cout << "\n" << i << ": " << *(*a+i); *(b+i) = 0; } *a = b; cout << "\nENDE!"; }ausgeben(&feld,laenge);btw:
Eine Vorwärtsdeklaration einer Funktion ist lediglich nötig, wenn die Definition nach der Benutzung steht. (Also Quellcode-mässig gesehen)
-
Ich hab das jetzt so gemacht, wue di es mir gezeigt hast, aber hab folgende Fehlermeldungen bekommen (Ich benutze den GCC unter Windows):
feld.cc: In function `int main()': feld.cc:31: error: cannot convert `int (*)[10]' to `int**' for argument `1' to ` void ausgeben(int**, int)' feld.cc:32: error: cannot convert `int (*)[10]' to `int**' for argument `1' to ` void ausgeben(int**, int)' feld.cc:34: error: expected primary-expression before '=' tokenWas bedeuten diese Fehlermeldungen bzw. was ist der Fehler?
EDIT: Wenn ich das richtig verstehe, sagt der gcc, dass der erste übergebene Parameter, also &feld, nicht mit dem übereinstimmt, wie es in der Funktionsdeklaration vorgegeben ist, mMn sieht es richtig aus. Ok, ich hab auch nicht viel Erfahrung mit Zeigern und C++ überhaupt...aber was sieht ihr?
-
Ok, ich hab auch nicht viel Erfahrung mit Zeigern und C++ überhaupt.
Wenn du Software in dieser Sprache schreiben moechtest, dann musst du sie auch lernen.
aber was sieht ihr?
Rosarote Elephanten ... wirklich!
-
Das ist dann die Feinheit der C-Programmierung: Felder und Zeiger sind halt doch etwas anderes, d.h. nicht direkt kopierbar.
Aber generell macht deine Vorgehensweise keinen Sinn. Die Funktion "ausgeben" sollte keine Änderungen vornehmen!
Und falls das nur ein Testprogramm für dich ist, dann kannst du auch das übergebene Array direkt beschreiben:
void ausgeben(int *a, int laenge) { for(int i = 0; i < laenge; i++) { cout << "\n" << i << ": " << a[i]; // besser als *(*a+i) !!! a[i] = 0; // <- direkt danach verändern } cout << "\nENDE!"; }P.S: Da du ja mehr an C++ interessiert bist, solltest du besser gleich die Klassen der Standard-Lib benutzen, z.B. vector.