Pointer Arraz an Funktion übergeben
-
Das sollte schon passen.
Aber wenn du nur einen Teil des Speicherbereich füllst, dann enthält der Rest halt undefinierte Werte. Die können auch 0 sein.Du schreibst auch "wahrscheinlich null". Also weißt du es noch nicht einmal.
Probier die Funktion doch mal mit nur 4 Wertepaaren aus.
Oder berechne die Werte vorher aus einer (linearen-)Funktion.Und wäre es nicht sinnvoller Speicher für n Werte zu holen, anstatt für 8000000 ?
-
Also ich find deine sehr gut nur habe ich das schon probiert und es klappt wenn ich die Werte im Speicher noch in der selben Funktion verwende ansonsten steht da nichts.
-
Was bedeutet: "... steht da nichts."
Und wie stellst du das fest?Im übrigen ist die Begründung dafür falsch:
if((x12 == 0) || (x1 == 0)) return; // großes Problem da division durch null
Überleg mal wann der Term
((n*x12)-(x1*x1))
Null ergibt.
-
also ich lass immer die werte in eine textdatei reinschreiben und dabei habe ich dann festgestellt dass gar keine werte drin standen, also bekommt die funktion linreg überhaupt nichts übergeben.
-
Das kann auch an der Schreibfunktion liegen.
Es sollte zumindest irgend etwas in der Datei stehen.Zeig Code, sonst kann dir hier keiner helfen.
-
void LinReg(int n, double *x, double *y, double *a0, double *a1){ char buffer[30]; DWORD retval; double x1=0,x12=0,y1=0,x1y1=0,e, xn, yn; HANDLE hDataFile = CreateFile("test.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); for(int i=0;i<n;i++){ xn = x[i]; // Bei Übergabe schief gegangen da wahrscheinlich null yn = y[i]; sprintf(buffer, "%f\n", x[i]); WriteFile(hDataFile, buffer, strlen(buffer), &retval, NULL); //x1+=xn; //y1+=yn; // x1y1+=xn*yn; // x12+=xn*xn; } CloseHandle(hDataFile); /* *a1=((n*x1y1)-(x1*y1))/((n*x12)-(x1*x1)); *a0=y1/n-(*a1)*x1/n; e=*y-(*a0)-(*a1)*(*x); *a0+=e; */ }
Der Hauptfunktion ist wie auf seite 2 geblieben bis auf die von dir genannten schönheitskorrekturen.
-
Bist du dir sicher, dass
CreateFile
erfolgreich war?
Schaust du dir auch die richtigetest.txt
an?
(Das wär nicht das erste mal, dass jemand im falschen Verzeichnis sucht)Was steht denn nun in
test.txt
drin?Hat das einen Grund warum du nicht die f-Funktionen aus
stdio.h
nimmst?
-
also es ist die richtige file habe ich auch im restlichen programm genau so und da funzt das auch. Das ganze mache ich so da ich mit owl next arbeite also auf die winapi zugreife. Es ist schon strange, die datei zeigt 0 byte an.
-
Xeno1987 schrieb:
..., die datei zeigt 0 byte an.
Daraus kannst du nicht schließen, in den Daten wäre nichts drin.
Deinsprintf
schreibt etwas in den buffer. Und wenn es"0.0\n"
ist.
Nur der Inhalt kommt nicht in die Datei. Demnach liegt das Problem bei den Dateioperationen.
-
jetzt weiss ich auch warum da nichts stand weil ich die Matrixstrucktur falsch ausgelesen habe, die schleifen waren richtig aber dass x[i] ist flasch, da dort die anzahl reihe mal spalte stehen sollte also ne weitere for schleife für die anzahl aller elemte der matrix --> x[cols*rows] = cvmget(i,cols-1)
-
Das hatte ich gemeint mit "es bleibt nur eine Schleife übrig".
Aber deine Lösung ist auch falsch.
Du brauchst eindeutige Wertefür den Index. (z.B. i=3, j=2 und i=2, j=3 führen zum selben Index).Nur, im Speicher steht irgendetwas, was
sprinft
in den buffer schreibt. Leer bleibt der nicht. Du hast halt nur falsche Werte gehabt.