Call-by-Reference Übergabe scheitert



  • Hallo,

    ich beschäftige mich erst seit Kurzem mit den Möglichkeiten von Call-by-Reference Übergaben und bin generell noch nicht lange dabei in C.
    Es tritt bei mir momentan folgendes Problem auf:
    Ich bekomme die Warnung:

    warning: parameter ‘xy’ set but not used
    

    ,

    die sich auf folgende Art von Funktion bezieht:

    int funktion(double xy[]){
      double temp_xy[16];
    
    // .... hier werden alle Einträge in temp_xy ordnungsgemäß gefüllt ....
    
      xy = temp_xy;
    
    // xy kann an dieser Stelle als 16-spaltiges Array dereferenziert ausgegeben werden
    
      return 0;
    }
    

    Wenn ich die Funktion aufrufe und ein 16-spaltiges Array übergebe, dass ich zuvor so deklariert habe:

    double array[16];
    

    wird besagte Warning ausgegeben und das Programm scheitert an einem Segfault, weil es das Array auf diese Weise nicht füllen kann. Wahrscheinlich ein richtig blöder Denkfehler, der für einen C-Profi leicht zu finden ist, aber ich hänge mich gerade sehr daran auf und wäre für jede Hilfe dankbar.

    Viele Grüße und danke im Voraus
    Aiedala



  • Das Problem ist, dass C kein Call-by-Reference kann. Deshalb bringt es auch nichts, den Wert von xy in der Funktion zu ändern - das wird ausserhalb der Funktion nicht zu sehen sein. Aber Du kannst die Werte von xy[0] bis xy[15] ändern. Diese Änderung wird dann auch ausserhalb zu sehen sein.



  • SG1 schrieb:

    Das Problem ist, dass C kein Call-by-Reference kann. Deshalb bringt es auch nichts, den Wert von xy in der Funktion zu ändern - das wird ausserhalb der Funktion nicht zu sehen sein. Aber Du kannst die Werte von xy[0] bis xy[15] ändern. Diese Änderung wird dann auch ausserhalb zu sehen sein.

    Das verwirrt mich jetzt etwas... Hier ist von Call-by-Reference die Rede...

    Und wie soll die Änderung von xy[0] bis xy[15] außerhalb der Funktion zu sehen sein, wo xy als Funktionsparameter definiert wird? 😕

    Welche einfache Möglichkeit gibt es, ein Array mithilfe einer Funktion füllen zu lassen? Ich hatte immer im Kopf, dass man das so oder so ähnlich macht...



  • Such dir bitte ganz schnell ein anderes Buch. Vergiss alles was du von Jürgen Wolf "gelernt" hast!
    Warum, wurde hier in unzähligen Threads diskutiert.



  • Also gut, dann eben kein Call-by-Reference und kein Jürgen Wolf 😃 Trotzdem muss ich irgendwie dieses Array von außerhalb füllen... da muss es doch eine einfache Möglichkeit geben?

    Liebe Grüße



  • In C gibt es nur call by value, demzufolge kein call by reference.

    Wie schon beschrieben nutze den subscript-Operator zum Zugriff auf das Array (welches als Funktionsargument immer in einen Zeiger zerfällt und der ist natürlich selbst auch call by value).

    double array[16];
    ...
    int funktion(double xy[]){
    
      xy[0] = 
      ...
      xy[15] = 
    
      return 0;
    }
    

    call by value heißt also, dass du innerhalb einer Funktion immer auf einer Kopie des Arguments operierst, d.h. ein direkter ändernder Zugriff niemals vom aufrufenden Kontext bemerkt werden kann.

    int funktion(double xy[]){
      double a[16] = {4,5,6};
      xy = a;  
      return 0;
    }
    
    int main()
    {
    	double array[16] = {1,2,3};
    	funktion(array);
    	printf("%f\n%f\n%f\n",array[0],array[1],array[2]);
    	return 0;
    }
    

    https://ideone.com/Oj57sy

    Wenn wenn du indirekt auf einen (nicht kopierten!) Speicherbereich zugreifst, der (z.B. durch einen Zeiger (der selbst nur eine Kopie ist)) im Argument angegeben wurde, hast du die Möglichkeit, diesen Speicherbereich zu ändern (z.B. mit subscript [])

    int funktion(double xy[]){
      double a[16] = {4,5,6};
      xy[0] = a[0];  xy[1] = a[1];  xy[2] = a[2];
      return 0;
    }
    
    int main()
    {
    	double array[16] = {1,2,3};
    	funktion(array);
    	printf("%f\n%f\n%f\n",array[0],array[1],array[2]);
    	return 0;
    }
    

    https://ideone.com/tDs6Op


Log in to reply