3 Stimmen

Werte in einer Funktion können nicht geändert werden

Ich beginne mit der Entwicklung, entschuldigen Sie diese Anfängerfrage.

Ich muss eine Funktion erstellen, die Werte zwischen 2 Variablen austauscht.

Ich habe diesen Code geschrieben, aber keine Änderungen in vars gemacht, Was sollte ich ändern? Was ist mein Fehler?

#include <iostream>
using namespace std;

void swap_values( int x, int y);
int main(void) {
   int a,b;    
   a = 2;   
   b = 5;  
   cout << "Before: " << a << " " << b << endl; 
   swap_values( a,b );   
   cout << "After: " << a << " " << b  << endl;   
}  
void swap_values( int x, int y ){
   int z;
   z = y;
   y = x;
   x = z;
}

10voto

Luchian Grigore Punkte 244505

Sie müssen die Variablen per Referenz übergeben:

void swap_values( int& x, int& y )
{
   int z;
   z = y;
   y = x;
   x = z;
}

pass-by-value y pass-by-reference sind Schlüsselkonzepte in den wichtigsten Programmiersprachen. In C++ wird, sofern Sie nicht by-reference angeben, eine pass-by-value auftritt.

Das bedeutet, dass nicht die Originalvariablen, sondern Kopien an die Funktion übergeben werden.

Aus diesem Grund blieben die Variablen außerhalb der Funktion unverändert, denn innerhalb der Funktionen wurden nur die Kopien geändert.

Wenn Sie per Referenz übergeben ( int& x, int& y ), arbeitet die Funktion mit den ursprünglichen Variablen.

1voto

Marcin Punkte 46457

Sie müssen wissen, dass C++ standardmäßig eine Call-by-Value-Aufrufkonvention verwendet.

Wenn Sie anrufen swap_values erhält sein Stack-Frame eine Kopie der Werte, die ihm als Parameter übergeben werden. Somit werden die Parameter int x, int y sind völlig unabhängig vom Aufrufer, und die Variablen int a, b .

Zum Glück für Sie unterstützt C++ auch Call-by-Reference (siehe Wikipedia oder ein gutes Lehrbuch über Programmiersprachen), was im Wesentlichen bedeutet, dass die Variablen in Ihrer Funktion an die Variablen im Aufrufer gebunden sind (oder ein Alias davon sind) (dies ist eine grobe Vereinfachung).

Die Syntax für Call-by-Reference lautet:

void swap_values( int &x, int &y ){
    // do your swap here
}

0voto

james Punkte 1710

Sie sind durch Wert übergeben. Sie können immer noch durch Wert übergeben, sondern müssen mit Zeigern zu arbeiten.

Hier ist der richtige Code:

void swap(int *i, int *j) {
   int t = *i;
   *i = *j;
   *j = t;
}

void main() {
   int a = 23, b = 47;
   printf("Before. a: %d, b: %d\n", a, b);
   swap(&a, &b);
   printf("After . a: %d, b: %d\n", a, b);
}

auch ein kleines Dokument, in dem "by reference" gegenüber "by value" erklärt wird: http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X