mikrocontroller.net

Forum: PC-Programmierung Array dynamisch vergrößern


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
bufferlaenge += size;
...
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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen sind alle deklariert. Die hab ich rausgenommen...

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab nun ein bisschen gedebuggt. Der Fehler liegt nicht bei realloc() 
sondern beim Zugriff auf den Puffer.
for(i = 0; i < size;
{
    getFromFile(hexfile, &buffer[0], 2);
    *decData[*bufferlaenge + i] = hex2dec(buffer, 2);
} 

Was ist da Falsch??

Endlich funktioniert das Syntaxhighlighting :)

Danke im Voraus

mfg Martin

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> *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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem: Schieb mal den kompletten Code rein.
Du vollständige Funktion von da oben gibt es ja
so nicht mehr.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Code:
void readLine(FILE* hexfile, int* addrDec, int** decData, int* bufferlaenge)
{
  unsigned char buffer[5];
  int size;
  int crc;
  int *backup;
  int recordTyp;
  int i;

  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)));
    printf("TEST");  
    
    if(*decData == NULL)
    {
      printf("\nRealloc() failled!");
      *decData = backup;
    }

    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);
    *bufferlaenge = *bufferlaenge + size;

    printf("\n%d %d %d %d", size, *addrDec, recordTyp, crc);
  }
}

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.





Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl das war es :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.