Ein- und Auslesen von Dateien



  • Hallo zusammen,

    ich habe hier ein "kleines" Problem. Und zwar progge ich unter Fedorra 7 in Eclipse, weil es sein muss, naja 😉 Zumindest, kann man das Projekt in zwei Teile Unterteilen, im ersten Teil werden Bilder einer Kamera aufgenommen und einfach gespeichert.

    Das Problem liegt aber im zweiten Teil, der Verarbeitung und ich hoffe wirklich sehr, dass ihr mir helfen könnt, weil ich bin mit meinem Latein wirklich am Ende.

    Da ich davon ausgehe, dass der Fehler schon früher auftritt poste ich mal ich mal den ganzen Code für den zweiten Teil:

    (Variablendeklaration habe ich TEILWEISE weggelassen!)

    int main(void)
    {
    	/* create a new polynom */
    	SENSOR_createpolynom(&stCurrentSensor);
    	getchar();
    	/* import a polynom */
    	SENSOR_importPolynomCSV(&stCurrentSensor, impolynom);
    
    	getchar();
    	/* calculate the failure */
    	for (f=0; f<=slFrameSize*3; f+=3)
    	{
    			tmp = (impolynom[f]*data[g]*data[g]) + (impolynom[f+1]*data[g]) + impolynom[f+2];
    			data[g] = data[g] - tmp;
    			g++;
    	}
    
    	SENSOR_exportPolyCSV(&stCurrentSensor,data,2);
    
    	free(data);
    //	free(impolynom);
    	printf("ENDE!");
    	return EXIT_SUCCESS;
    }
    
    int SENSOR_createpolynom (struct stSensorConfig *stCurrentSensor)
    {
    	int slFrameSize = (stCurrentSensor->usResX-2)*stCurrentSensor->usResY; // Breite x Höhe = Gesamtpixelanzahl
    	int data_pairs = 21; // Anzahl der einzulesenden Datein
    
    	// VARIABLEN POINTER:
    	int slCamCount = 0;
    	char scLogTxt[64];
    	float **createpolynom;
    	float *polynom;
    
    	// IMPORT DATEIEN:
    	double height_fix[22]; // Speichern von fixen Höheninformationen (500 --> 1500)
    	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
    
    	// KLEINSTE QUADRATE METHODE:
    	int poly_degree = 2; //Grad des Polynoms
    	int poly_degree_plus = poly_degree + 1; // m is degree of approximation + 1 --> m = 3; m1 = 2
    	double height_dyn[22]; // Speichern der jeweiligen Höheninformation
    	double temp_all[300]; // Speichert alle Werte erstmal ab
    	int pixel; // damit jedes Pixel durchlaufen wird, 1 --> slFramesize
    	int height_dyn_i; // i für height_dyn 1 --> data_pairs
    	int save_i = 1;
    	int save_j = 2;
    	int temp_zero = 1;
    	int degree = 1; // bestimmt wie oft die eigentliche Prozedur durchläuft, unteranderen abhängig vom polydegree
    	int stop_degree; // wird entweder 1 oder -1 entscheidet ob degree weiter läuft
    	double summe[10]; // speichert die Summe ab
    	double w_summe; // wenn summe gebildet wird, wird die Wurzel genommen und hier gespeichert
    	double quadrat[10]; // speichert die Quadrate temporär zwischen
    	int i,j,L; // einfache Zählvariablen
    
        // AUSGABE KLEINSTE QUADRATE:
        int ausgabe_i = 1; // POTENZ VON X --> 1 = x0; 2 = x1 ...
        int ausgabe_j = 1;
        int position=0; // zählt von 1 --> 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
    		}
    
    		        // ------------------- SPEICHERN VON X / Y -----------------------------------
    		        while ( save_i <= data_pairs ) // --> 1 -> 21
    		        {
    		            temp_all[(2*50)+save_i] = height_fix[save_i];
    		            temp_all[(1*50)+save_i] = 1.0;
    		            temp_all[((poly_degree_plus+1)*50)+save_i] = height_dyn[save_i];
    
    		            while ( save_j <= poly_degree ) // --> 2 -> 2
    		            {
    		                temp_all[((save_j+1)*50)+save_i] = temp_all[(save_j*50)+save_i] * temp_all[(2*50)+save_i];
    
    		                save_j++;
    		            }
    		            save_i++;
    		        }
    
    		        // ----------- füllt die Felder nach X/Y mit o bzw. 1 auf ---------------------
    		        i = data_pairs + 1;    // i = 22
    		        while ( i <= (data_pairs + poly_degree_plus) ) // --> 22 -> 24
    		        {
    		            while ( temp_zero <= ( poly_degree_plus + 1)) // --> 1 -> 4
    		            {
    		                temp_all[(temp_zero*50)+i] = 0.0;
    		                temp_zero++;
    		            }
    		            temp_all[((i-data_pairs)*50)+i] = 1.0;
    		            i++;
    		        }
    
    		        // ------------------- Berechnung für die Quotienten --------------------------
    		        while ( degree <= (poly_degree_plus + 1) )    // --> 1 -> 4
    		        {
    		        	// -- Abfrage für später (siehe "Bestimmung des jeweiligen Quotienten") --
    		            if (degree == (poly_degree_plus + 1) )
    		            {
    		                stop_degree = -1;
    		            } else {
    		                stop_degree = 1;
    		            }
    
    		            // -------------------- erzeugt die "Quadrate" ---------------------------
    		            // erzeugt die "Quadrate"
    		            if ( degree != 1 ) // beginnt erst bei degree = 2, weil die fixen Höhen beginnen erst im 100-Bereich
    		            {
    		                L = 1;
    		                while ( L <= (degree - 1) ) // 1 --> 22
    		                {
    		                    quadrat[L] = 0;
    		                    j = 1;
    		                    while ( j <= data_pairs ) // 1 --> 21
    		                    {
    		                        quadrat[L] = quadrat[L] + ( temp_all[(degree*50)+j] * temp_all[(L*50)+j]);
    		                        j++;
    		                    }
    		                    L++;
    		                }
    		            }
    
    		            i = 1;
    		            while ( i <= (data_pairs + poly_degree_plus)) // --> 1 --> 43
    		            {
    		                if ( degree != 1 )
    		                {
    		                    L = 1;
    		                    while ( L <= (degree - 1) )
    		                    {
    		                        temp_all[(degree*50)+i] = temp_all[(degree*50)+i] - ( quadrat[L] * temp_all[(L*50)+i] );
    		                        L++;
    		                    }
    		                } else {
    		                    break;
    		                }
    		                i++;
    		            }
    
    		            // ------------- Bestimmung des jeweiligen Quotienten -------------------------
    		            // wenn k = 4, wird nicht mehr ausgeführt:
    		            if ( stop_degree >= 1 )
    		            {
    		                summe[degree] = 0.;
    		                i = 1;
    		                while ( i <= data_pairs )
    		                {
    		                    summe[degree] = summe[degree] + (temp_all[(degree*50)+i] * temp_all[(degree*50)+i]);
    		                    i++;
    		                }
    		                w_summe = sqrt(summe[degree]);
    		                i = 1;
    		                while ( i <= (data_pairs+poly_degree_plus) )
    		                {
    		                    temp_all[(degree*50)+i] = temp_all[(degree*50)+i] / w_summe;
    		                    i++;
    		                }
    		            }
    		            degree++;
    		        }
    		        //----------------------- AUSGABE ---------------------------------------------
    		        if ( data_pairs != poly_degree_plus ) // normal case
    				{
    				  while ( ausgabe_i <= poly_degree_plus )
    				  {
    					polynom[position] = -temp_all[((poly_degree_plus+1)*50)+(data_pairs+ausgabe_i)];
    					ausgabe_i++;
    					position++;
    				  }
    				} else {                // case when data_pairs = m
    				  while ( ausgabe_j <= poly_degree_plus )
    				  {
    					polynom[ausgabe_j] = -temp_all[((poly_degree_plus+1)*50)+(data_pairs+ausgabe_j)];
    					ausgabe_j++;
    				  }
    				}
    	}
    	/*
    	 * Berechnung basiert auf der Methode der kleinsten Quadrate - ENDE
    	 *
    	 * -----------------------------------------------------------------------------
    	 */
    
    	printf("--> Polynom erfolgreich berechnet");
    //	for(slCamCount=0; slCamCount < data_pairs; slCamCount++)
    //	{
    //		free(createpolynom[slCamCount]);
    //	}
    //	free(createpolynom);
    
    	SENSOR_exportPolyCSV(stCurrentSensor,polynom,1);
    
    	free(polynom);
    	return TRUE;
    }
    
    int SENSOR_importPolynomCSV(struct stSensorConfig *stCurrentSensor, float *pflData)
    {
    	printf("Polynom import beginnt... ");
    	char scaFilename[128];
    	int i;
    
    	int slNumberPixel= (stCurrentSensor->usResX-2) * stCurrentSensor->usResY;
    
        char datei[30] = "polynom.csv";
    
    	FILE *fCSV = fopen(datei, "r");
    	if(fCSV==NULL)
    	{
    		printf("--> SENSOR_importCSV No file found");
    		return FALSE;
    	}
    	fseek(fCSV, 0, SEEK_END); // Position des Zeigers, von 0 --> Ende
    	unsigned long int slFilesize = ftell(fCSV); // aktuele Position des Zeigers --> Ende
    	rewind(fCSV); // Zeiger wieder auf anfang
    
    	//allocate memory for data
    	char *pcaBuffer = (char *)malloc(slNumberPixel); // Speicher reservieren
    	char *pcaElement;
    	char caSeperator[]=";"; //\x0a"; = ";\n"
    
    	int slColCount = 0;
    	int slRowCount = 0;
    
    	while(!feof(fCSV)) // solange nicht Datei am ende...
    	{
    		fgets(pcaBuffer, slFilesize, fCSV);
    		pcaElement = strtok(pcaBuffer, caSeperator);
    		while(pcaElement != NULL)
    		{
    			pflData[slColCount] = (float)atof(pcaElement);
    			slColCount++;
    			pcaElement = strtok(NULL, caSeperator);
    		}
    	}
    
    	fclose(fCSV);
    	free(pcaBuffer);
    
    	printf("... Polynom Import Erfolgreich!\n");
    
    	return TRUE;
    }
    

    Das Problem tritt auf in Zeile 7 der Main, wenn ich sage "importiere". Diese Funktion ging auch mal, nur jetzt nicht mehr 😞 und zwar bekomme ich in der SENSOR_importPolynomCSV in Zeile 42 einen Fehler: No source available for "_int_free()". Das komische ist aber wenn ich das free(pcaBuffer); auskommentiere kommt der gleiche Fehler.

    Ich hoffe ihr könnt mir helfen.

    Vielen Dank.


Anmelden zum Antworten