Feldausgabe
-
Ich glaub ich steh irgendwie auf dem Schlauch. Kann mir jemand sagen, wo der Unterschied zwischen den beiden Feldausgaben liegt.
printf("%lf\n%lf\n%lf\n", ergebnis[0], ergebnis[1], ergebnis[2]); for (i=0; i<3; i++) printf("%lf\n", ergebnis[i]);
Die obere Variante funktioniert sauber, aber bei der Schleife, wird nach der ersten Ausgabe das Feld verändert und es wird nur noch 0 ausgegeben.
Ausgabe:
1.0...
2.0...
3.0...
1.0...
0.0...
0.0...Vielen Dank im Voraus.
Mfg
Johannes
-
#include <stdio.h> int main() { double ergebnis[3] = {1.0, 2.0, 3.0}; int i; printf("%lf\n%lf\n%lf\n", ergebnis[0], ergebnis[1], ergebnis[2]); for (i = 0; i < 3; i++) printf("%lf\n", ergebnis[i]); }
Gibt bei mir
1.000000 2.000000 3.000000 1.000000 2.000000 3.000000
aus, genau so solls ja auch sein...
Das heißt, dass wir wohl etwas mehr Code brauchen
-
#include "stdafx.h" #include <conio.h> double *multi(double *, double [], int); int _tmain(int argc, _TCHAR* argv[]) { double matrix[3][3]={{1,2,3},{2,1,0},{4,2,9}}, vektor[3]={1,2,3}, *ergebnis; int i; ergebnis=multi(*matrix, vektor, 3); printf("%lf\n%lf\n%lf\n", ergebnis[0], ergebnis[1], ergebnis[2]); for (i=0; i<3; i++) printf("%lf\n", ergebnis[i]); _getch(); return 0; } double *multi(double *m, double v[], int gr) { int z, s; double ve[3]={0}; for (z=0; z<gr; z++){ for (s=0; s<gr; s++){ *(ve+z)+=*(m+gr*z+s)*v[s]; } } return ve; }
-
Das sieht nicht nach ANSI C aus.
Aber trotzallem kann man ein "normales" Array nicht als Rückgabewert haben. Du bekommst jetzt einen Zeiger zurück auf eine lokale Variable. Die bei der Ausgabe schon nichtmehr existiert. Die Umsetzung im Compiler lässt aber anscheinend die erste Ausgabe noch funktionieren.Mit calloc und free kann man das lösen:
#include <stdlib.h> #include <stdio.h> double *multi(double *, double [], int); int main() { double matrix[3][3] = {{1, 2, 3}, {2, 1, 0}, {4, 2, 9}}, vektor[3]={1,2,3}, *ergebnis; int i; ergebnis = multi(*matrix, vektor, 3); printf("%lf\n%lf\n%lf\n", ergebnis[0], ergebnis[1], ergebnis[2]); for (i=0; i<3; i++) printf("%lf\n", ergebnis[i]); free(ergebnis); return 0; } double *multi(double *m, double v[], int gr) { int z, s; double *ve = calloc(gr, sizeof(double)); for (z = 0; z < gr; z++) for (s = 0; s < gr; s++) ve[z] += m[gr*z+s]*v[s]; return ve; }
-
Sorry, ist eine cpp-Datei, aber der Inhalt müsste ja außer dem stdafx.h Ansi-C-kompatibel sein. Hab ich sonst irgend eine Möglichkeit mein Feld zurückzugeben? Das das so nicht funktioniert leuchtet mir nach deiner Erklärung ein.
Mfg
Johannes
-
Sorry, hab den Code übersehen, oder mein Browser hatte einen Aussetzer.
-
Johannes_meyer schrieb:
Sorry, hab den Code übersehen, oder mein Browser hatte einen Aussetzer.
Ne, ich hatte den eine Sekunde vor deinem Post geändert
Das Programm gibt mir jetzt zweimal den Vektor {14, 4, 35} aus.
-
Vielen Dank nochmal an lagalopex. Hab's jetzt hingekriegt, zwar mit malloc anstatt calloc, aber das kommt ja letztlich aufs gleiche raus.
// Matrixmultiplikation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <conio.h> #include <malloc.h> double *multi(double *, double [], int); int _tmain(int argc, _TCHAR* argv[]) { double matrix[3][3]={{1,2,3},{2,1,0},{4,2,9}}, vektor[3]={1,2,3}, *ergebnis; int i; ergebnis=multi(*matrix, vektor, 3); for (i=0; i<3; i++) printf("%lf\n", ergebnis[i]); free(ergebnis); _getch(); return 0; } double *multi(double *m, double v[], int gr) { int z, s; double *ve; ve=(double*)malloc(sizeof(double)*gr); for (z=0; z<gr; z++){ *(ve+z)=0; for (s=0; s<gr; s++){ *(ve+z)+=*(m+gr*z+s)*v[s]; } } return ve; }
Mfg
Johannes
-
Bezüglich malloc: http://www.c-plusplus.net/forum/viewtopic.php?t=206606