Speicherzugriffsfehler bei Speicherzuordnung eines 2d arrays
-
ich verwende den Gnu C compiler auf linux!
vielleicht erklärt das Einiges...Mit dem Vorschlag von _matze kommt es genauso so zu dem Speicherzugriffsfehler, allerdings kommt er nachdem alle Werte ausgegeben wurden. Das folgende printf Kommando wird nicht ausgeführt.
-
_matze schrieb:
;fricky schrieb:
_matze schrieb:
Ja, ihr habt natürlich Recht...
und ausserdem sollteste besser testen, ob 'calloc' erfolgreich war.
Na klar, jetzt werde ich auseinandergepflückt!
Ich habe doch nur den Code getestet, ich habe sonst nix daran getan... Recht haste trotzdem, ja ja
jaja, hast dir wohl durch c++ zu viel schlechtes angewöhnt, daher sei dir verziehen.
-
lin123 schrieb:
Mit dem Vorschlag von _matze kommt es genauso so zu dem Speicherzugriffsfehler, allerdings kommt er nachdem alle Werte ausgegeben wurden. Das folgende printf Kommando wird nicht ausgeführt.
Das liegt aber nicht an _matzes Vorschlag, sondern du hast vermutlich an einer anderen Stelle im Code nen Fehler.
-
^^ die 'store_csv' ist vermutlich die ursache.
-
;fricky schrieb:
^^ die 'store_csv' ist vermutlich die ursache.
aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.
-
lin123 schrieb:
;fricky schrieb:
^^ die 'store_csv' ist vermutlich die ursache.
aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.Das glaub ich sowieso nicht. Setz doch mal einen Breakpoint und geh Zeile für Zeile durch.
-
lin123 schrieb:
aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.dann zeig doch mal ganzen code, der bei dir abkackt.
-
"printf-Debugging" ist sowieso nicht so optimal. Dann lieber den Debugger zum Debuggen nutzen. Breakpoint setzen, schrittweise durchgehen, Werte und Ablauf überprüfen...
-
;fricky schrieb:
lin123 schrieb:
aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.dann zeig doch mal ganzen code, der bei dir abkackt.
der ist ziemlich lang!!
hier ist der Teil der noch nicht geht:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <termios.h> #include <unistd.h> #include <memory.h> ... void check_csv (int *check, char *dateiname){ ... } void store_csv (int **csv_array, char *dateiname){ FILE * pFile; pFile=fopen (dateiname,"r"); int zeile = 0; int spalte = 0; char * buffer; int c=0; int n=0; float wert1=0; int wert2=0; while(c!='\n'){ c = fgetc (pFile); n++; } rewind(pFile); char line[n]; while (getline (pFile, line)) { buffer = strtok (line,","); while (buffer != NULL) { wert1 = (float)*buffer; wert1 = wert1*100; wert2 = (int)wert1; csv_array[zeile][spalte] = wert2; spalte++; } zeile++; } } int main (){ ... char* dateiname="stuetze.csv"; int check[3]={0,0,0}; check_csv (check, dateiname); int Zeilen, Spalten; Zeilen = check[0]; Spalten = check[1]*check[2]; printf ("\narray wird initialisiert "); static int **csv_array = NULL; printf ("\n allocate memory"); csv_array = (int **)calloc(Zeilen,sizeof(int*)); printf ("\n test"); for(i = 0; i < Zeilen; i++) csv_array[i] = (int*)calloc(Spalten,sizeof(int)); printf ("\nAufruf store_csv "); store_csv (csv_array, dateiname); .... }
Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...
-
Dann überprüf mal, ob zeile oder spalte in der Funktion store_csv den gültigen Bereich verlassen. Darauf wird es wohl hinauslaufen. Übrigens, wozu brauchst ddu 'wert2'? Die kannst du dir sparen.
-
lin123 schrieb:
Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...
Hast du das denn mittels Debugger (nix printf!) validiert?
-
lin123 schrieb:
Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...
Sind aber viele langjährig erprobte und bewährte Absturzfehler drin. Und auch ein paar sinnlose Konstrukte.
Was die Speicherzuordnung betrifft: in 0 Byte Speicher gehen exakt 0 Byte Daten rein.
-
verpr0ber schrieb:
lin123 schrieb:
Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...
Sind aber viele langjährig erprobte und bewährte Absturzfehler drin. Und auch ein paar sinnlose Konstrukte.
Was die Speicherzuordnung betrifft: in 0 Byte Speicher gehen exakt 0 Byte Daten rein.Oh je, könnte natürlich sein... Kommt aber immer noch drauf an, was check_csv macht.
-
@Matze
zeile und spalte verlassen nicht den gültigen Bereich: wenn ich in den while Schleifen ein Kriterium setzte welches zeile und spalte begrenzt, kommt es auch zu dem Fehler.
ja, wert2 bringt hier nix.
Ich schreibe mein Programm im Editor und Kompiliere es in der Konsole, da ist man zwecks Debugging ein wenig begrenzt!! wenn ich wirklich nicht weiter muss ich das wohl ändern.
@verpr0ber
ja, kann schon sein! ich bin Anfänger! vielleicht sagst du mir einfach was ich ändern muss!
-
lin123 schrieb:
ja, wert2 bringt hier nix.
Ich schreibe mein Programm im Editor und Kompiliere es in der Konsole, da ist man zwecks Debugging ein wenig begrenzt!! wenn ich wirklich nicht weiter muss ich das wohl ändern.Oh, das solltest du ändern! Unterschätze nicht die Möglichkeiten einer ordentlichen IDE. Lad dir einfach irgendeine kostenlose runter.
lin123 schrieb:
@verpr0ber
ja, kann schon sein! ich bin Anfänger! vielleicht sagst du mir einfach was ich ändern muss!Er meint das hier:
int check[3]={0,0,0}; check_csv (check, dateiname); int Zeilen, Spalten; Zeilen = check[0]; Spalten = check[1]*check[2];
Du überprüfst nicht, ob nach check_csv wirklich was anderes als 0 in dem Array drinsteht. Lass dir mal das check-Array ausgeben.
-
in der funktion werden die Werte check[] berechnet, das funktionniert auch.
kann es sein dass der speicherzugriffsfehler auf den Kompiler zurückzuführen ist?
-
lin123 schrieb:
in der funktion werden die Werte check[] berechnet, das funktionniert auch.
Woher weißt du das? Hast du dir die Werte nach check_csv mal ausgeben lassen?
EDIT: Übrigens ist es in jedem Fall sinnvoll, nochmal zu prüfen, ob auch wirklich alles klargegangen ist. Erst recht, wenn man mit Dateien arbeitet. Was machst du, wenn die Datei mal nicht da ist? Du kannst einfach die Rückgabe von calloc auf NULL prüfen.
lin123 schrieb:
kann es sein dass der speicherzugriffsfehler auf den Kompiler zurückzuführen ist?
Bestimmt nicht.
-
OK.... der Fehler kommt doch aus der Funktion store_csv!
-
lin123 schrieb:
OK.... der Fehler kommt doch aus der Funktion store_csv!
Genauer?
-
Es wird schon früher geprüft ob die datei vorhanden ist.
Wenn nicht, kann dieser Teil des codes nicht ausgeführt werden. Die Werte von check[] werden ausgegeben. Das passt!ich vermute den Feheler jetzt bei dem getline...
Ich möchte eine riesen CSV datei in den Arbeitsspeicher laden in Form von diesem 2darray. Es gibt bestimmt bessere Möglichkeiten als meine hierfür!ich mach mal weiter! und Vielen dank für eure Beiträge!
Gruß,
Lin