Void-Prozeduren geben immer Null wieder
-
Hallo!
Warum gibt die Void-Prozedur immer Null wieder? Wo liegt der Fehler?
#include <iostream> #include <stdlib.h> using namespace std; void MachWas(int i) { i = 6; } int main(int argc, char *argv[]) { int i=0; MachWas(i); cout << i << "\n"; system("PAUSE"); return 0; }
Vielen Dank im Voraus
pmw
-
In C++ heißen die Dinger Funktionen, nicht Prozeduren. Aber egal.
Fehler ist die Übergabe der Variablen i - Du übergibst i als Werteparameter, d.h. MachWas erhält EINE Kopie von i. Diese Kopie (die den gleichen Namen i trägt wie die Variable im Hauptprogramm) bekommt nun 6 zugewiesen. Am Ende von MachWas wird die Kopie gelöscht und die 6 ist weg.
Richtig sähe es z.B. so aus:
void MachWas(int& i) { i = 6; } int main(int argc, char *argv[]) { int i=0; MachWas(i); cout << i << "\n"; system("PAUSE"); return 0; }
Nun ist i eine Referenzvariable, d.h. nun wird ein Platzhalter übergeben und die Funktion MachWas arbeitet auf der originalen Variable i, ändert also das i innerhalb von main auf 6.
Um zu sehen, daß dies nichts mit den Namen zu tun hat, solltest Du auch noch mal folgende Variation ausprobieren:
void MachWas(int& j) { j = 6; } int main(int argc, char *argv[]) { int i=0; MachWas(i); cout << i << "\n"; system("PAUSE"); return 0; }
Du wirst sehen, daß hier das gleiche Ergebnis herauskommt. (Warum?)
-
Hallo!
Danke für die Hilfe! Das der Variablen-Name nichst damit zu tun hat war bir auch schon vorher klar. C++ mach ich erst seit ein 2 Monaten. Ich habe die Jahre vorher immer nur Delphi programmiert. Und da gibt es Prozeduren.
Viele Grüße
pmw
-
Leider klappt es bei anderen Funktionen nicht mehr
void FreqChars(string& data, int& zeichen[256], int& min) { // Häufigkeit aller Zeichen ermitteln for (int i=0; i<=255; i++) { zeichen[i] = 0; } for (int i=0; i<data.length(); i++) { zeichen[(unsigned char)data[i]]++; } // Das seltenste Zeichen finden for (int i=1; i<=255; i++) { if (zeichen[min] > zeichen[i]) { min = i; } } }
Der Compiler meckert über die 2. Zeile.
-
Bei einem Array kannst du das & weglassen, da Arrays immer als Pointer an die Funktion übergeben werden.
-
Du meinst: "int (&zeichen)[256]". Ohne die Klammern wäre es ein Array aus 256 Referenzen (jaja, die schöne Deklarationssyntax...).
-
Ist ein Array von Referenzen überhaupt benutzbar? Referenzen müssen doch zwangsinitialisiert werden. Geht dann sowas?
int x, y, z; int & feld[3] = {x, y, z};
-
Auch wenns nicht viel heißen mag: Der VC 6 meckert: Felder aus Ref's sind
unszulässig.
-
Nach 8.3.4. nicht.
Kein Array aus Referenzen, void, Funktionszeigern oder abstrakten Klassen.
-
Warum keine Arrays aus Funktionszeigern?! Der VC7.1 kompiliert das jedenfalls anstandslos...
-
oh, sorry.. im eifer des übersetzens und herumgeschreibe etc.
es ist natürlich nicht die rede von funktionszeigern, sondern von funktionen selbst
gut, dass du meinen fehler bemerkt hast!