Ein- und Auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ein- und Auslesen

    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!)

    Quellcode

    1. int main(void)
    2. {
    3. /* create a new polynom */
    4. SENSOR_createpolynom(&stCurrentSensor);
    5. getchar();
    6. /* import a polynom */
    7. SENSOR_importPolynomCSV(&stCurrentSensor, impolynom);
    8. getchar();
    9. /* calculate the failure */
    10. for (f=0; f<=slFrameSize*3; f+=3)
    11. {
    12. tmp = (impolynom[f]*data[g]*data[g]) + (impolynom[f+1]*data[g]) + impolynom[f+2];
    13. data[g] = data[g] - tmp;
    14. g++;
    15. }
    16. SENSOR_exportPolyCSV(&stCurrentSensor,data,2);
    17. free(data);
    18. // free(impolynom);
    19. printf("ENDE!");
    20. return EXIT_SUCCESS;
    21. }
    22. int SENSOR_createpolynom (struct stSensorConfig *stCurrentSensor)
    23. {
    24. int slFrameSize = (stCurrentSensor->usResX-2)*stCurrentSensor->usResY; // Breite x Höhe = Gesamtpixelanzahl
    25. int data_pairs = 21; // Anzahl der einzulesenden Datein
    26. // VARIABLEN POINTER:
    27. int slCamCount = 0;
    28. char scLogTxt[64];
    29. float **createpolynom;
    30. float *polynom;
    31. // IMPORT DATEIEN:
    32. double height_fix[22]; // Speichern von fixen Höheninformationen (500 --> 1500)
    33. int fiftysteps=500; // benötigt für fixe Höhe (500 --> 1500)
    34. int fiftysteps_i; // zählt von 1 --> data_pairs damit die fixen Höhen gespeichert werden
    35. // KLEINSTE QUADRATE METHODE:
    36. int poly_degree = 2; //Grad des Polynoms
    37. int poly_degree_plus = poly_degree + 1; // m is degree of approximation + 1 --> m = 3; m1 = 2
    38. double height_dyn[22]; // Speichern der jeweiligen Höheninformation
    39. double temp_all[300]; // Speichert alle Werte erstmal ab
    40. int pixel; // damit jedes Pixel durchlaufen wird, 1 --> slFramesize
    41. int height_dyn_i; // i für height_dyn 1 --> data_pairs
    42. int save_i = 1;
    43. int save_j = 2;
    44. int temp_zero = 1;
    45. int degree = 1; // bestimmt wie oft die eigentliche Prozedur durchläuft, unteranderen abhängig vom polydegree
    46. int stop_degree; // wird entweder 1 oder -1 entscheidet ob degree weiter läuft
    47. double summe[10]; // speichert die Summe ab
    48. double w_summe; // wenn summe gebildet wird, wird die Wurzel genommen und hier gespeichert
    49. double quadrat[10]; // speichert die Quadrate temporär zwischen
    50. int i,j,L; // einfache Zählvariablen
    51. // AUSGABE KLEINSTE QUADRATE:
    52. int ausgabe_i = 1; // POTENZ VON X --> 1 = x0; 2 = x1 ...
    53. int ausgabe_j = 1;
    54. int position=0; // zählt von 1 --> slFramesize, damit Polynom wie eine Perlenkette aussieht und in Datei gespeichert werden kann
    55. /* =====================================================================================================
    56. * Erzeugung der Pointer
    57. */
    58. // -----------------------------------------------------------------------------
    59. // Polynom 21 x 3072 --> für die Rohdaten
    60. createpolynom = (float **)malloc((data_pairs) * sizeof(float));
    61. if(createpolynom == NULL)
    62. {
    63. sprintf(scLogTxt, "--> No virtual memory\n");
    64. printf(scLogTxt);
    65. return FALSE;
    66. }
    67. for(; slCamCount < slFrameSize; slCamCount++)
    68. {
    69. createpolynom[slCamCount] = (float *)malloc(slFrameSize * sizeof(float));
    70. if(createpolynom[slCamCount] == NULL)
    71. {
    72. sprintf(scLogTxt, "--> 1 No memory for row %d\n", slCamCount);
    73. printf(scLogTxt);
    74. return FALSE;
    75. }
    76. }
    77. // -----------------------------------------------------------------------------
    78. // Polynom 1 x 9216 --> für EINE Dateien
    79. polynom = (float *)malloc((slFrameSize*3) * sizeof(float));
    80. if(polynom == NULL)
    81. {
    82. sprintf(scLogTxt, "--> No virtual memory\n");
    83. printf(scLogTxt);
    84. return FALSE;
    85. }
    86. /* =====================================================================================================
    87. * Einlesen der verschiedenen Höhendateien
    88. */
    89. SENSOR_importPolynomCreate(stCurrentSensor,createpolynom); // speichert alle Werte von den Messungen in create polynom
    90. for (fiftysteps_i=1; fiftysteps_i<=(data_pairs);fiftysteps_i++) // speichern der einzelnen Entfernungswerte in ein neues Array
    91. {
    92. height_fix[fiftysteps_i] = fiftysteps; // speichern der "Höhe" 500 --> 1500
    93. fiftysteps+=50;
    94. }
    Alles anzeigen
  • Quellcode

    1. /* =====================================================================================================
    2. * Berechnung basiert auf der Methode der kleinsten Quadrate
    3. */
    4. for (pixel=0; pixel<=slFrameSize; pixel+=1) // Hier die eingelesenen Werte in die richtige Form für Polyfit bringen
    5. {
    6. for (height_dyn_i=0; height_dyn_i<=(data_pairs);height_dyn_i++) // --> 0 --> 21 (data_pairs)
    7. {
    8. height_dyn[height_dyn_i+1] = createpolynom[height_dyn_i][pixel]; // speichern der einzelnen Entfernungswerte in ein neues Array
    9. }
    10. // ------------------- SPEICHERN VON X / Y -----------------------------------
    11. while ( save_i <= data_pairs ) // --> 1 -> 21
    12. {
    13. temp_all[(2*50)+save_i] = height_fix[save_i];
    14. temp_all[(1*50)+save_i] = 1.0;
    15. temp_all[((poly_degree_plus+1)*50)+save_i] = height_dyn[save_i];
    16. while ( save_j <= poly_degree ) // --> 2 -> 2
    17. {
    18. temp_all[((save_j+1)*50)+save_i] = temp_all[(save_j*50)+save_i] * temp_all[(2*50)+save_i];
    19. save_j++;
    20. }
    21. save_i++;
    22. }
    23. // ----------- füllt die Felder nach X/Y mit o bzw. 1 auf ---------------------
    24. i = data_pairs + 1; // i = 22
    25. while ( i <= (data_pairs + poly_degree_plus) ) // --> 22 -> 24
    26. {
    27. while ( temp_zero <= ( poly_degree_plus + 1)) // --> 1 -> 4
    28. {
    29. temp_all[(temp_zero*50)+i] = 0.0;
    30. temp_zero++;
    31. }
    32. temp_all[((i-data_pairs)*50)+i] = 1.0;
    33. i++;
    34. }
    35. // ------------------- Berechnung für die Quotienten --------------------------
    36. while ( degree <= (poly_degree_plus + 1) ) // --> 1 -> 4
    37. {
    38. // -- Abfrage für später (siehe "Bestimmung des jeweiligen Quotienten") --
    39. if (degree == (poly_degree_plus + 1) )
    40. {
    41. stop_degree = -1;
    42. } else {
    43. stop_degree = 1;
    44. }
    45. // -------------------- erzeugt die "Quadrate" ---------------------------
    46. // erzeugt die "Quadrate"
    47. if ( degree != 1 ) // beginnt erst bei degree = 2, weil die fixen Höhen beginnen erst im 100-Bereich
    48. {
    49. L = 1;
    50. while ( L <= (degree - 1) ) // 1 --> 22
    51. {
    52. quadrat[L] = 0;
    53. j = 1;
    54. while ( j <= data_pairs ) // 1 --> 21
    55. {
    56. quadrat[L] = quadrat[L] + ( temp_all[(degree*50)+j] * temp_all[(L*50)+j]);
    57. j++;
    58. }
    59. L++;
    60. }
    61. }
    62. i = 1;
    63. while ( i <= (data_pairs + poly_degree_plus)) // --> 1 --> 43
    64. {
    65. if ( degree != 1 )
    66. {
    67. L = 1;
    68. while ( L <= (degree - 1) )
    69. {
    70. temp_all[(degree*50)+i] = temp_all[(degree*50)+i] - ( quadrat[L] * temp_all[(L*50)+i] );
    71. L++;
    72. }
    73. } else {
    74. break;
    75. }
    76. i++;
    77. }
    78. // ------------- Bestimmung des jeweiligen Quotienten -------------------------
    79. // wenn k = 4, wird nicht mehr ausgeführt:
    80. if ( stop_degree >= 1 )
    81. {
    82. summe[degree] = 0.;
    83. i = 1;
    84. while ( i <= data_pairs )
    85. {
    86. summe[degree] = summe[degree] + (temp_all[(degree*50)+i] * temp_all[(degree*50)+i]);
    87. i++;
    88. }
    89. w_summe = sqrt(summe[degree]);
    90. i = 1;
    91. while ( i <= (data_pairs+poly_degree_plus) )
    92. {
    93. temp_all[(degree*50)+i] = temp_all[(degree*50)+i] / w_summe;
    94. i++;
    95. }
    96. }
    97. degree++;
    98. }
    99. //----------------------- AUSGABE ---------------------------------------------
    100. if ( data_pairs != poly_degree_plus ) // normal case
    101. {
    102. while ( ausgabe_i <= poly_degree_plus )
    103. {
    104. polynom[position] = -temp_all[((poly_degree_plus+1)*50)+(data_pairs+ausgabe_i)];
    105. ausgabe_i++;
    106. position++;
    107. }
    108. } else { // case when data_pairs = m
    109. while ( ausgabe_j <= poly_degree_plus )
    110. {
    111. polynom[ausgabe_j] = -temp_all[((poly_degree_plus+1)*50)+(data_pairs+ausgabe_j)];
    112. ausgabe_j++;
    113. }
    114. }
    115. }
    116. /*
    117. * Berechnung basiert auf der Methode der kleinsten Quadrate - ENDE
    118. *
    119. * -----------------------------------------------------------------------------
    120. */
    121. printf("--> Polynom erfolgreich berechnet");
    122. // for(slCamCount=0; slCamCount < data_pairs; slCamCount++)
    123. // {
    124. // free(createpolynom[slCamCount]);
    125. // }
    126. // free(createpolynom);
    127. SENSOR_exportPolyCSV(stCurrentSensor,polynom,1);
    128. free(polynom);
    129. return TRUE;
    130. }
    131. int SENSOR_importPolynomCSV(struct stSensorConfig *stCurrentSensor, float *pflData)
    132. {
    133. printf("Polynom import beginnt... ");
    134. char scaFilename[128];
    135. int i;
    136. int slNumberPixel= (stCurrentSensor->usResX-2) * stCurrentSensor->usResY;
    137. char datei[30] = "polynom.csv";
    138. FILE *fCSV = fopen(datei, "r");
    139. if(fCSV==NULL)
    140. {
    141. printf("--> SENSOR_importCSV No file found");
    142. return FALSE;
    143. }
    144. fseek(fCSV, 0, SEEK_END); // Position des Zeigers, von 0 --> Ende
    145. unsigned long int slFilesize = ftell(fCSV); // aktuele Position des Zeigers --> Ende
    146. rewind(fCSV); // Zeiger wieder auf anfang
    147. //allocate memory for data
    148. char *pcaBuffer = (char *)malloc(slNumberPixel); // Speicher reservieren
    149. char *pcaElement;
    150. char caSeperator[]=";"; //\x0a"; = ";\n"
    151. int slColCount = 0;
    152. int slRowCount = 0;
    153. while(!feof(fCSV)) // solange nicht Datei am ende...
    154. {
    155. fgets(pcaBuffer, slFilesize, fCSV);
    156. pcaElement = strtok(pcaBuffer, caSeperator);
    157. while(pcaElement != NULL)
    158. {
    159. pflData[slColCount] = (float)atof(pcaElement);
    160. slColCount++;
    161. pcaElement = strtok(NULL, caSeperator);
    162. }
    163. }
    164. fclose(fCSV);
    165. free(pcaBuffer);
    166. printf("... Polynom Import Erfolgreich!\n");
    167. return TRUE;
    168. }
    Alles anzeigen

    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.