Hallo an alle Ich will 10 Zeilen aus einer Hex File auslesen. Der Pfad der Hex wird als Kommandozeilenparameter übergeben. Mit calloc() erschaffe ich Platz für eine Integer Variable. Dann lese ich die Anzahl der Datenbytes aus dem Hex File aus (das funktioniert) und vergrößere mit realloc() den Speicher um die Anzahl der ausgelesenen Bytes. Das ganze geht 3 mal gut. Beim 4. Mal hängt sich das Prgramm auf. Warum ist das so??? Hab leider keinen Plan :( Hier der Source Code. [c] int main(int argc, char **argv) { FILE *hexfile; int size = 0; int i, j; int* decData = NULL, *backup; int addrDec, crc, recordTyp; int bufferlaenge = 0; unsigned char buffer[10] = {0}; decData = (int *)calloc(1, sizeof(int)); if(decData == NULL) { printf("\nCalloc() failed!"); exit(1); } backup = decData; bufferlaenge++; hexfile = fopen(argv[1], "r"); if(hexfile != NULL) { for(j = 0; j < 10; j++) { size = getDataSize(hexfile); if(size != -1) { printf("\n%d, %d\n", size, bufferlaenge); decData = (int *) realloc(decData, (bufferlaenge * sizeof(int)) + (size * sizeof(int))); if(decData == NULL) { printf("\nRealloc() failled!"); decData = backup; } bufferlaenge += size; getFromFile(hexfile, &buffer[0], 4); addrDec = hex2dec(buffer, 4); getFromFile(hexfile, &buffer[0], 2); recordTyp = hex2dec(buffer, 2); for(i = 0; i < size; i++) { getFromFile(hexfile, &buffer[0], 2); decData[bufferlaenge + i] = hex2dec(buffer, 2); } getFromFile(hexfile, &buffer[0], 2); crc = hex2dec(buffer, 2); getc(hexfile); printf("\n%d %d %d %d", size, addrDec, recordTyp, crc); } } } } [\c] Danke im Voraus mfg Martin
Hi,
1 | bufferlaenge += size; |
2 | ...
|
3 | decData[bufferlaenge + i] = ... |
damit schreibts Du Deine Daten HINTER Dein Array. Wenn Du die 'bufferlaenge += size;' unter die 'for' Schleife verschiebst, sollte es gehen. CU FBI
Hallo! Danke Da bin ich auch schon draufgekommen ;) Jetzt hänge ich daran das das ganze in eine Funktion auszugliedern. Doch das funktioniert noch nicht ganz. Ich übergebe decData als Zeiger auf einen Zeiger, aber das geht noch nicht :( Den Code hab ich auf das wichtigste gekürzt. [C] void readLine(FILE* hexfile, int* addrDec, int** decData, int* bufferlaenge) { backup = *decData; size = getDataSize(hexfile); if(size != -1) { printf("\n%d, %d\n", size, *bufferlaenge); *decData = (int*) realloc(*decData, bufferlaenge sizeof(int) + (size * sizeof(int))); if(*decData == NULL) { printf("\nRealloc() failled!"); *decData = backup; } } [\C] Da hängt sich das Programm auf :( Das mit dem Zeiger auf einen Zeiger verstehe ich so halbwegs, aber bei der Übergabe des Zeigers an realloc() steige ich aus :( Wie gehört das nun??? Danke im Voraus mfg Martin
Ich hab nun ein bisschen gedebuggt. Der Fehler liegt nicht bei realloc() sondern beim Zugriff auf den Puffer.
1 | for(i = 0; i < size; |
2 | {
|
3 | getFromFile(hexfile, &buffer[0], 2); |
4 | *decData[*bufferlaenge + i] = hex2dec(buffer, 2); |
5 | }
|
Was ist da Falsch?? Endlich funktioniert das Syntaxhighlighting :) Danke im Voraus mfg Martin
> *decData[*bufferlaenge + i]
************
Das schaut mir alles andere als koscher aus.
Wenn *decData mit einer Grösse von *bufferlaenge
allokiert wurde und i größer 0 ist, dann schreibst
du schon wieder hinter den allokierten Speicherbereich.
Kann aber auch sein, dass ich komplett falsch liege.
Poste doch mal etwas mehr Zusammenhang.
Hallo Karl *bufferlänge enthält aber die Anzahl der Elemente vor dem allozieren. Vor dem beenden der Funktion wird *bufferlänge auf *bufferlänge + size aktualisiert. Size ist die Anzal der Elemente die Zusätzlich alloziert worden sind. Gruß Martin
Trotzdem: Schieb mal den kompletten Code rein. Du vollständige Funktion von da oben gibt es ja so nicht mehr.
Hier der Code:
1 | void readLine(FILE* hexfile, int* addrDec, int** decData, int* bufferlaenge) |
2 | {
|
3 | unsigned char buffer[5]; |
4 | int size; |
5 | int crc; |
6 | int *backup; |
7 | int recordTyp; |
8 | int i; |
9 | |
10 | backup = *decData; |
11 | |
12 | size = getDataSize(hexfile); |
13 | |
14 | if(size != -1) |
15 | {
|
16 | printf("\n%d, %d\n", size, *bufferlaenge); |
17 | *decData = (int*) realloc(*decData, *bufferlaenge * sizeof(int) + (size * sizeof(int))); |
18 | printf("TEST"); |
19 | |
20 | if(*decData == NULL) |
21 | {
|
22 | printf("\nRealloc() failled!"); |
23 | *decData = backup; |
24 | }
|
25 | |
26 | getFromFile(hexfile, &buffer[0], 4); |
27 | *addrDec = hex2dec(buffer, 4); |
28 | |
29 | getFromFile(hexfile, &buffer[0], 2); |
30 | recordTyp = hex2dec(buffer, 2); |
31 | |
32 | for(i = 0; i < size; i++) |
33 | {
|
34 | getFromFile(hexfile, &buffer[0], 2); |
35 | *decData[*bufferlaenge + i] = hex2dec(buffer, 2); |
36 | }
|
37 | |
38 | |
39 | getFromFile(hexfile, &buffer[0], 2); |
40 | crc = hex2dec(buffer, 2); |
41 | |
42 | getc(hexfile); |
43 | *bufferlaenge = *bufferlaenge + size; |
44 | |
45 | printf("\n%d %d %d %d", size, *addrDec, recordTyp, crc); |
46 | }
|
47 | }
|
Ja ok. Sieht logisch soweit richtig aus. Probier mal: (*decData)[*bufferlaenge + i] = hex2dec(buffer, 2); Ich bin mir nie sicher, wie in solchen Fällen die Operatorenreihenfolge ist. Im Zweifel lieber eine Klammer mehr machen :-) (*decData)[*bufferlaenge + i] = hex2dec(buffer, 2); und *(decData[*bufferlaenge + i]) = hex2dec(buffer, 2); sind syntaktisch beide korrekt, machen aber unterschiedliche Dinge. Du willst aber das Erstere und ich denke (bin mir aber nicht sicher), der Compiler parst die ursprüngliche Version wie Zweiteres.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.