Array geht nach Funktionsaufruf verloren
-
Hi,
ich bin echt am durchdrehen! Ich habe einen double Array mit
double* x = malloc(N*sizeof(double));
angelegt und mit 0 initialisiert. Dann übergebe ich ihn einer Funktion, die ihn mit Werten füllt. Vor dem Zurückkehren gebe ich die Werte aus -- alles ok. In der main Funktion aber, also nach dem zurückkehren aus dem Funktionsaufruf, sind alle Einträge wieder Null! Initialisiere ich den Array mit 1, rufe dann die Funktion auf, so ist wieder im Funktionsaufruf alles ok, aber im main Programm sind wieder alle Einträge 1.
Wo dran könnte das denn liegen??
LG,
Josie
-
Das liegt daran dass du einen Fehler gemacht hast. Welcher das ist können wir aufgrund fehlenden Codes nicht eindeutig sagen und nur rätseln.
-
Ich dachte das gäbs vielleicht häufiger... Hier also der entsprechende Auszug aus meinem Code:
void schreib_zeile(double* z, int N, char * info) { int i; printf("%s: ", info); for (i = 0; i < N; ++i) { printf("%+3.3f ", z[i]); } printf("\n"); } double* addiere_vektor(double* a, double* b, int N) { int i; double* erg = malloc(N*sizeof(double)); for (i = 0; i != N; ++i) { erg[i] = a[i]+b[i]; } return erg; } verarbeite(double** A, double* x, double* b, int DIM, double tol, unsigned int maxiter) { int k, i, j; double* delta = malloc(N*sizeof(double)); double innere_summe = 0.0; for (k=1; k < maxiter; ++k) { for (i=0; i < DIM; ++i) { for (j = 0; j < DIM; ++j) if (i != j) innere_summe += A[i][j]*x[j]; delta[i] = (b[i]-innere_summe)/A[i][i]; innere_summe = 0.0; } x = addiere_vektor(x, delta, DIM); } free(delta); schreib_zeile(x, DIM, "im aufruf"); } int main() { int N = 5; double *x; x = malloc(N*sizeof(double)); int i; for (i = 0; i != N; ++i) x[i] = 0.0; // ... (nix, was mit x zu tun hat) schreib_zeile(x, N, "in main, vor aufruf"); verarbeite(a, x, b, N, 0.01, 10); schreib_zeile(x, N, "in main, nach aufruf"); }
Vor und nach dem Aufruf wird für alle Einträge des Arrays 0 ausgegeben, im Aufruf andere Wert.
Wär echt voll lieb, wenn ihr mir weiterhelfen könntet, ich blick echt nicht, was ich falsch mache
LG,
Josie
-
"x=addiere_vektor(x,delta,DIM);" zeigt recht schön, daß C keine echte Referenz-Semantik hat. Diese Zuweisung biegt nur die lokale Variable x um, ohne die Variable des Hauptprogramms zu berühren (und erzeugt außerdem ein massives Speicherleck). Vielleicht solltest du ja die addiere-Funktion umschreiben auf += Semantik:
double* addiere2_vektor(double* a, double* b, int N) { int i; for (i = 0; i != N; ++i) { a[i] = a[i]+b[i]; } return a; }
-
CStoll schrieb:
"x=addiere_vektor(x,delta,DIM);" zeigt recht schön, daß C keine echte Referenz-Semantik hat.
wie jetzt? wenn man *x=addiere_vektor (*x,delta,DIM); schreibt, hat man doch referenzsemantik, nur eben nicht so wie etwa in PHP
$a = &$b; $a = 12; // $b ist jetzt auch 12 &b = 34; // &a ist jetzt auch 34
jede programmiersprache kocht nun mal ihr eigenes süppchen.
-
by_ref-freak schrieb:
CStoll schrieb:
"x=addiere_vektor(x,delta,DIM);" zeigt recht schön, daß C keine echte Referenz-Semantik hat.
wie jetzt? wenn man *x=addiere_vektor (*x,delta,DIM); schreibt, hat man doch referenzsemantik, nur eben nicht so wie etwa in PHP
Deswegen sagt ich ja "keine echte Referenz-Semantik"
(und dein Code dürfte wohl einen Compiler-Fehler verursachen - die Typen passen nicht)
-
CStoll schrieb:
und dein Code dürfte wohl einen Compiler-Fehler verursachen - die Typen passen nicht
nö, die variablen in PHP schlucken alle möglichen datentypen.
-
PHP-freak schrieb:
CStoll schrieb:
und dein Code dürfte wohl einen Compiler-Fehler verursachen - die Typen passen nicht
nö, die variablen in PHP schlucken alle möglichen datentypen.
Der PHP-Code vielleicht, aber der C-Code "*x = addiere_vektor(*x,delta,DIM);[/c] passt nicht zu dem Programm, wie es bis jetzt dasteht - da braucht es schon Doppelzeiger.
-
CStoll schrieb:
aber der C-Code "*x = addiere_vektor(*x,delta,DIM);[/c] passt nicht zu dem Programm, wie es bis jetzt dasteht - da braucht es schon Doppelzeiger.
das stimmt natürlich.