Variable wird immer zu 1988927028



  • Ich habe ein kleines Programm geschrieben bei welchem ich den Fehler schon ziemlich eingrenzen konnte. Hier erstmal der Code:

    int abfrage (int n)
    {
        printf("Geben Sie bitte den Wert fuer n ein: ");
        scanf("%d", &n);
        return n;
    }
    
    int main(void)
    {
      int n;
      while (abfrage (n) > 0)
      {
         /*funktion (n);*/
         printf("%d", n);
    [...]
    }
    

    Das Problem: Während n bei der Abfrage noch den eingegeben Wert annimmt, scheint bei der Übergabe an main etwas falsch zu laufen. Dort nimmt n nämlich unabhängig von der Eingabe den Wert 1988927028 an.
    Hoffe mir kann jemand helfen.


  • Mod

    Caoscrischen schrieb:

    Das Problem: Während n bei der Abfrage noch den eingegeben Wert annimmt, scheint bei der Übergabe an main etwas falsch zu laufen. Dort nimmt n nämlich unabhängig von der Eingabe den Wert 1988927028 an.
    Hoffe mir kann jemand helfen.

    Warum sollte es auch seinen Wert ändern? Das n in deiner Funktion und in main haben nichts miteinander zu tun. Guck dir noch einmal die Grundlagen von Funktionen, Parametern und Rückgabewerten an.

    Genauer gesagt: Die Übergabe von n an die Funktion mach genau nichts.



  • In C sind die Übergabeparameter einer Funktion zwar "beschreibbar", aber du beschreibst nicht die Parameter selbst, sondern eine Kopie davon. Mit scanf beschreibst du also hier nicht den Übergabeparameter selbst, sondern nur eine Kopie, die am Ende der Funktion verworfen wird.

    mit "return n" gibst du auch diese Kopie als Ergebnis zurück, weist du dieses Ergebnis aber keiner anderen Variablen zu, wird es auch verworfen. Du fragst es zwar im while-statement ab, weist es aber keiner Variablen zu.

    Deshalb verändert sich das "N" aus der Main-Funktion nicht.

    probiers mal mit:

    int main(void)
    {
      int n;
      do
      {
         n = abfrage;
         printf("%d", n);
      } while (n > 0);
    [...]
    }
    

    In "abfrage" brauchst du dann natürlich auch keinen Übergabeparameter. Das ist auch logisch, da du in "abfrage" nur einen neuen Wert einlesen willst, du brauchst aber den alten Wert von "n" aus der Hauptfunktion nicht.



  • An Sie, Zeh schrieb:

    probiers mal mit:

    int main(void)
    {
      int n;
      do
      {
         n = abfrage;
         printf("%d", n);
      } while (n > 0);
    [...]
    }
    

    In "abfrage" brauchst du dann natürlich auch keinen Übergabeparameter. Das ist auch logisch, da du in "abfrage" nur einen neuen Wert einlesen willst, du brauchst aber den alten Wert von "n" aus der Hauptfunktion nicht.

    Man braucht aber trotzdem zwei Klammern nach Abfrage... 🙄



  • Natürlich. Entschuldigung. Und ich hatte zuerst schon gedacht, ich mache einen Fehler bei der do...while Schleife. Ich habe momentan nicht viel mit C am Hut, für den einzigen Parametermodus von C hat es dann aber noch gelangt. 🙂



  • Aaaaah, ich glaube der Groschen ist gefallen.
    Werde mir das dann morgen nochmal in aller Ruhe durch den Kopf gehen lassen.
    Danke schonmal für die Hilfe. Ich bin halt noch ein Anfänger und beschäfige mich mit der Programmierung nur nebenbei in meiner Freizeit 🙄 .



  • Als kleiner Tipp: Es hilft am Anfang gewaltig, wenn du die Variablen in den Funktionen anders benennst, als die Variablen, die als Argument übergeben werden.

    Also:

    int abfrage(int n){
      [...]
    }
    
    int main(void){
      int x;
      [...]
      x = abfrage(x);
      [...]
    }
    

    Da wird schnell klar, dass "n" nicht "x" ist und daher eine Veränderung von "x" sich nicht auf "n" auswirkt.



  • Oder sieh dir Zeiger an:

    #include <stdio.h>
    
    int f100(int x)
    {
    	 x = 100;
    }
    
    int f500(int *x)
    {
    	*x = 500;
    }
    
    int main()
    {
    	int a = -50;
    
    	f100(a);
    	printf("%d\n", a); // Ausgabe: -50 (Variable wurde nicht geändert, da lokal)
    
    	f500(&a);
    	printf("%d\n", a); // Ausgabe: 500 (Variable wurde geändert, da Verwendung von Zeiger)
    
    	return 0;
    }
    

Anmelden zum Antworten