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!


Anmelden zum Antworten