Problem mit close



  • oh aber natürlich.

    int SENSOR_exportPolyCSV(struct stSensorConfig *stCurrentSensor, float *pflData, int temp)
    {
    	int j;
    	float k;
    	char scaFilename[128];
    
    	//sprintf(scaFilename, "out.csv");
    
    	FILE *fCSV;
    
    	if (temp == 0) { fCSV = fopen("bild_ori.csv", "w+"); printf("--> Speichern in Bild_ori.csv"); }
    	if (temp == 1) { fCSV = fopen("bild_polynom.csv", "w+"); printf("--> Speichern in Bild_Polynom.csv"); }
    	if (temp == 2) { fCSV = fopen("bild_kor.csv", "w+"); printf("--> Speichern in Bild_kor.csv"); }
    
    	if(fCSV==NULL)
    	{
    		printf("--> SENSOR_exportCSV No file found");
    		return FALSE;
    	}
    
    	char cCSV[10];
    	unsigned short usBytesWritten = 0;
    
    	int slNumberPixel = 9216;//(stCurrentSensor->usResX-2) * stCurrentSensor->usResY;
    
    	for (j=0; j<slNumberPixel; j++)
    	{
    		if (j<(slNumberPixel-1))
    		{
    			k = pflData[j];
    			sprintf(cCSV, "%f;", pflData[j]);
    		}
    		else
    		{
    			k = pflData[j];
    			sprintf(cCSV, "%f\n", pflData[j]);
    		}
    
    		usBytesWritten += fwrite(cCSV, sizeof(char), strlen(cCSV), fCSV);
    	}
    
    	fclose(fCSV);
    	printf("--> Erfolgreich exportiert!\n");
    	return TRUE;
    }
    

    Also "temp" ist nur deshalb da, damit ich nicht 3 mal die gleiche funktion schreiben muss etc.



  • Vergrößer mal "char cCSV[10]" auf "char cCSV[100]".
    Könnte ja sein, daß eine formatierte Float als String mehr als 10 Zeichen (incl. \0) hat (und dann "FILE *fCSV" überschreibt).



  • nein leider noch der gleich fehler.

    Oder muss ich pflData, also dass was ich bekommen dafür schon freigeben (free)?



  • Ich sehe immernoch kein close. Das Einzige was dir bei einem zu späten free passieren kann, ist dass dir der Speicher ausgeht. Davon ausgehend dass das nicht passiert wird ein früheres free nicht helfen.

    Edit: Hast du pflData überhaupt mit malloc gebaut? Zeige doch mal den Abschnitt wo der Fehler auftritt.



  • sry, meinte fclose...

    also der fehler tritt bei fclose auf. wenn ich diese zeile ausführe bekomme ich den Fehler.

    pflData habe ich vorher initialisiert. Das passiert in einer anderen Funktion vorher, dort werden halt werte hineingeschrieben - alle andere Array inkl. der pflData habe ich 1. größer gewählt als man es eigentlich braucht und 2. sicherheitshalber geprüft ob die Größe stimmt.

    Ab der initialisierung bis zum fclose, habe ich kein free enthalten.

    Was auch komisch ist, dass die Datei erzeugt werden kann hineingeschrieben werden kann etc. nur nicht durch fclose geschlossen werden kann 😕



  • Hallo,

    der Fehler hat nichts mit dem fclose zu tun, der passiert an anderer Stelle. Wahrscheinlich ist, dass bei der Erstellung von pflData etwas nicht passt. Wie also sieht der andere Code aus, der hier eine Rolle spielen kann? Wie wird pflData erzeugt, auf welche Weise wird es frei gegeben?

    MfG,

    Probe-Nutzer



  • Kann es sein dass temp vielleicht 3 ist und deshalb in fCSV Blödsinn steht?
    Ändere mal Zeile 9 in FILE *fCSV = 0; oder benutze switch/case:

    ...
    const char *Dateiname;
    switch(temp){
        case 0: Dateiname = "bild_ori.csv"; break;
        case 1: Dateiname = "bild_polynom.csv"; break;
        case 2: Dateiname = "bild_kor.csv"; break;
        default:
            printf("temp hat den falschen Wert %d\n", temp);
            return FALSE;
    }
    printf("--> Speichern in %s", Dateiname);
    fCSV = fopen(Dateiname, "w+");
    ...
    


  • @nwp2, kann ich gerne noch einbauen ist dann auch besser 😉 Aber daran sollte es eigentlich nicht liegen, weil die Datei erzeugt er ja komischerweise.

    Hier mal die FUnktion die die andere Funktion aufruft, habe ein paar Variablen deklarationen und Quellcode Part rausgenommen.

    polynom = pflData!

    Erzeugt wird (pflData) Polynom in Zeile 58 und der nächste Zugriff ist erst wieder in Zeile 101 bzw. 110.

    int SENSOR_createpolynom (struct stSensorConfig *stCurrentSensor)
    {
    	int slFrameSize = (stCurrentSensor->usResX-2)*stCurrentSensor->usResY; 
    
    	// VARIABLEN POINTER:
    	int slCamCount = 0;
    	char scLogTxt[64];
    	float **createpolynom;
    	float *polynom;
    
    	int z = 0;
    
    	// IMPORT DATEIEN:
    	double height_fix[22];
    	double height_dyn[22];
    	int fiftysteps=500; // benötigt für fixe Höhe (500 --> 1500)
    	int fiftysteps_i; // zählt von 1 --> data_pairs damit die fixen Höhen gespeichert werden
    
    	// -- Einzustellende Variablen
    	int degree = 2;
    	int data_pairs = 21;
    
    	// -- Array Deklarierungen
    	int poly_degree_plus = degree + 1; // poly_degree_plus ist Grad der Approximation + 1
    	float w_summe; // Speichert das Ergebnis aus der Wurzel
    	double temp_all[500]; // temporärer Zwischenspeicher für das laufende Program
    	double temp_quadrat[10]; // speichert die Ergebnisse der quadratischen Berechnung
    	double summe[10]; // Speichern der Summe über eine "Potenz"
    
        int position=0; // zählt von 1 --> 3*slFramesize, damit Polynom wie eine Perlenkette aussieht und in Datei gespeichert werden kann
    
    	/* =====================================================================================================
    	 * Erzeugung der Pointer
    	 */
    
    	// -----------------------------------------------------------------------------
    	// Polynom 21 x 3072 --> für die Rohdaten
    	createpolynom = (float **)malloc((data_pairs) * sizeof(float));
    	if(createpolynom == NULL)
    	{
    		sprintf(scLogTxt, "--> No virtual memory\n");
    		printf(scLogTxt);
    		return FALSE;
    	}
    	for(; slCamCount < slFrameSize; slCamCount++)
    	{
    		createpolynom[slCamCount] = (float *)malloc(slFrameSize * sizeof(float));
    		if(createpolynom[slCamCount] == NULL)
    		{
    			sprintf(scLogTxt, "--> 1 No memory for row  %d\n", slCamCount);
    			printf(scLogTxt);
    			return FALSE;
    		}
    	}
    
    	// -----------------------------------------------------------------------------
    	// Polynom 1 x 9216 --> für EINE Dateien
    	polynom = (float *)malloc((slFrameSize*3) * sizeof(float));
    	if(polynom == NULL)
    	{
    		sprintf(scLogTxt, "--> No virtual memory\n");
    		printf(scLogTxt);
    		return FALSE;
    	}
    
    	/* =====================================================================================================
    	 * Einlesen der verschiedenen Höhendateien
    	 */
    
    	SENSOR_importPolynomCreate(stCurrentSensor,createpolynom); // speichert alle Werte von den Messungen in create polynom
    
    	for (fiftysteps_i=1; fiftysteps_i<=(data_pairs);fiftysteps_i++) // speichern der einzelnen Entfernungswerte in ein neues Array
    	{
    		height_fix[fiftysteps_i] = fiftysteps; // speichern der "Höhe" 500 --> 1500
    		fiftysteps+=50;
    	}
    
    	/* =====================================================================================================
    	 * Berechnung basiert auf der Methode der kleinsten Quadrate
    	 */
    
    	for (pixel=0; pixel<=slFrameSize; pixel+=1)	// Hier die eingelesenen Werte in die richtige Form für Polyfit bringen
    	{
    		for (height_dyn_i=0; height_dyn_i<=(data_pairs);height_dyn_i++) // --> 0 --> 21 (data_pairs)
    		{
    			height_dyn[height_dyn_i+1] = createpolynom[height_dyn_i][pixel]; // speichern der einzelnen Entfernungswerte in ein neues Array
    		}
    
    		// =========================================================================
    
    		// --------------- METHODE DER KLEINSTEN QUADRATE ----------------------------
    
    		// QUELLCODE GELÖSCHT UM KURZ ZU HALTEN!!!
    
    		// ----------------------- AUSGABE ---------------------------------------------
    		if ( data_pairs != poly_degree_plus ) // normaler Fall
    		{
    		  count_one_to_poly_degree_plus = 1; // POTENZ VON X --> 1 = x^0; 2 = x^1 ...
    		  while ( count_one_to_poly_degree_plus <= poly_degree_plus )
    		  {
    		    polynom[position] = -temp_all[((poly_degree_plus + 1) * 50) + (data_pairs+count_one_to_poly_degree_plus)];
    		    //printf("Polynom: %f\n",polynom[count_one_to_poly_degree_plus]);
    		    count_one_to_poly_degree_plus++;
    		    position++;
    		  }
    		} else { // case when data_pairs = poly_degree_plus
    		  count_pass_degree_plus = 1;
    		  while ( count_pass_degree_plus <= poly_degree_plus )
    		  {
    		    polynom[count_pass_degree_plus] = -temp_all[((poly_degree_plus+1)*50)+(data_pairs+count_pass_degree_plus)];
    		    count_pass_degree_plus++;
    		  }
    		}
    	}
    	printf("--> Polynom erfolgreich berechnet");
    
    	SENSOR_exportPolyCSV(stCurrentSensor,polynom,1);
    	free(polynom);
    //	for(slCamCount=0; slCamCount < slFramesize; slCamCount++)
    //	{
    //		free(createpolynom[slCamCount]);
    //	}
    	free(createpolynom);
    	return TRUE;
    }
    

    Also er tut auch alles richtig berechnen, übergeben tut er meiner Meinung auch alles richtig...



  • Ich kann mit der Fehlermeldung nichts anfangen. Versuche mal es mit gdb auszuführen, der sagt dir genau die Zeile die falsch ist.



  • int slFrameSize = (stCurrentSensor->usResX-2)*stCurrentSensor->usResY;
     int position=0;
    
     float *polynom;
    
     polynom = (float *)malloc((slFrameSize*3) * sizeof(float));
    
    // for (pixel = 0; pixel <= slFrameSize; pixel += 1) // <- !!! macht eine Umdrehung zuviel !!!
     for (pixel = 0; pixel < slFrameSize; pixel += 1)
     { 
    
     (...)
    
      while ( genau_drei_mal ) {
    
       polynom[position] = (...);
       position++;
    
      }
    
     (...)
    
     }
    

    :xmas1:



  • SUPER DANKE!!!

    Oh man großes THX so ein mist - hab den Wald vor lauter Bäumen nicht gesehen!... danke nochmals! 👍


Anmelden zum Antworten