Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
353
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HentaiD HentaiD ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    23
    Hallo Freunde,
    die Probleme hören nicht beim debuggen. Ich habe gestern an einer völlig anderen Stelle im Programm versucht einen malloc(); / free(); - Fehler zu beheben und nun wirft mir das Programm hier jetzt eine Access Violation. Offenbar ist doch ein Fehler bei der Speicherallozierung vorgekommen. Ich weiß aber nicht warum und woher der Fehler rührt.
    Vorher hat das ganze super funktioniert und jetzt nicht mehr.

    Da Valgrind mir aber sowieso dort etwas von lost bytes angezeigt hat, frage ich doch mal lieber nach, weil ich keine Spur habe, wo der Hund begraben sein könnte.

    Der Codeschnipsel soll aus einem Array (output_number.words[], ist ein BigInt) Die Bits auslesen und dann dezimal umwandeln, danach das Ergebnis in eine Datei schreiben und auf der Shell / Kommandozeile ausgeben.
    Der Fehler passiert aber ganz klar unten bei der Ausgabe beim Zugriff auf die dez_out.

    Wäre echt super, wenn ihr mir da weiterhelfen könntet.

    Viele liebe Grüße, D



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    
    void binToDez(FILE *FDatei){
     
        int i = 0;
        int j = 0;
        int k = 0;
        int counter = 0;
        int bits = output_number.n * 32;                                                // Anzahl vorhanderner Binaerbits
        int len = ceil((double)(bits/ DEZTOBINLEN));                                    // Anzahl der maximalen Arrayplaetze
        char **dez_out;                                                                 // BCD-Code Array mit Dezimalzahlen für jedes Bit
     
        dez_out = (char **)malloc(bits*sizeof(char *));
        for(i=0;i<bits;i++){
          dez_out[i] = (char *)malloc(len*sizeof(char));
        }
     
        for(j=0; j<output_number.n; j++){                                               // Jedes Outputwort wird analysiert
            for(i=31; i>=0; i--){
                if( (1 << i) & output_number.words[output_number.n-1-j] )               // Jedes Bit wird analysiert
                {
                    dez_out[counter][len-1] = 1;                                        // Wenn Bit gesetzt: Fuelle letzten Index mit 1
                }
                else{
                    dez_out[counter][len-1] = 0;                                        // Wenn kein Bit gesetzt: Fuelle letzen Index mit 0
                }
                counter++;
            }
        }
     
     
        for(i=0; i<bits; i++){
            //fprintf(FDatei, "%d", dez_out[i][len-1]);                                 // BINAERE AUSGABE
     
            for(j=0; j<len-1; j++){
                dez_out[i][j] = 0;                                                      // Indizes mit 0 initialisieren
            }
        }
     
        for(i=0; i<bits; i++){
            if(dez_out[i][len-1] == 1){                                                 // Wenn ein Bit im letzten Index gefunden wurde,
                for(j=0; j<bits-i-1; j++){
                    for(k=0; k<len; k++){
                        dez_out[i][k] = 2 * dez_out[i][k];                              // wird hier so oft die Zahl mit 2 multipliziert, wie ihre Wertigkeit ist (1*2^(bits-i-1))
                        if(dez_out[i][k] >9){
                            dez_out[i][k] -= 10;
                            dez_out[i][k-1] += 1;                                       // kann keinen "Overflow" geben, weil 9en vorher mit 2 multipliziert wurden -> 8
                        }
                    }
                }
            }
        }
     
     
        for(i=bits-2; i>=0; i--){                                                       // Schleife faengt bei zweitniederwertigstem Bit an zu addieren, bis zum letzten (Outputwert)
            if(dez_out[i][len-1] != 0){                                                 // Wenn das letzte Bit nicht null ist
                for(j=0; j<len; j++){
                    dez_out[bits-1][j] += dez_out[i][j];
                    if(dez_out[bits-1][j] > 9){                                         // Wenn "overflowt" wurde:
                        dez_out[bits-1][j] -= 10;                                       // 10 abziehen und 1 in den naestmoeglichen Index stecken,
                        for(k=j-1; k>=0; k--){
                            if(dez_out[bits-1][k] == 9){                                // d.h. 9en zu 0 en machen
                                dez_out[bits-1][k] = 0;
                            }
                            else{
                                dez_out[bits-1][k]++;                                   // und bei kleineren Ziffern eine 1 addieren
                                break;                                                  // und die Schleife nach Addition des Carry fruehzeitig beenden
                            }
                        }
                    }
                }
            }
        }
     
        for(i=0; i<len; i++){
            if(i==0){                                                                   // fuehrende Nullen abfangen
                counter = 0;
                for(j=0; j<len; j++){
                    if(dez_out[bits-1][j] == 0){
                        counter ++;
                        if(j == len-1){
                            if(counter < 2){
                                counter = 2;
                            }
                            i = counter-2;
                            break;
                        }
                    }
                    else{
                        i = counter;
                        break;
                    }
                }
            }
     
            fprintf(FDatei, "%d", dez_out[bits-1][i]);                                  // Ausgabe der Dezimalzahl in Ausgabedatei
            printf("%d", dez_out[bits-1][i]);
     
        }
     
        free(dez_out);
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.970
    Hi.
    Zitat Zitat von HentaiD Beitrag anzeigen
    Der Fehler passiert aber ganz klar unten bei der Ausgabe beim Zugriff auf die dez_out.
    Wo? Welche Zeile? Was sind die Werte der Variablen im Debugger?

    Was genau sagt Valgrind?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    HentaiD HentaiD ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    23
    Es ist die for-Schleife in Zeile 73. Die bricht irgendwann bei der Ausgabe ab (94). Der Fehler liegt offenbar aber woanders.

    Bei einer Addition von
    7971247101245146884800154
    und
    78901410000007848917314127915791571054545439
    gibt er bis hierhin aus: 7971247101245146884800154 (falsche Werte) und bricht dann ab.

    Valgrind stört mit folgendem Fehler:


    ==17622== Invalid read of size 1
    ==17622== at 0x400AE6: dec2binDiv (1283810484.c:60)
    ==17622== by 0x400E0D: dec2bin (1283810484.c:132)
    ==17622== by 0x402C81: main (1283810484.c:805)
    ==17622== Address 0x5423767 is 1 bytes before a block of size 25 alloc'd
    ==17622== at 0x4C278AE: malloc (vg_replace_malloc.c:207)
    ==17622== by 0x400CD4: dec2bin (1283810484.c:99)
    ==17622== by 0x402C81: main (1283810484.c:805)
    ==17622==
    ==17622== Invalid read of size 1
    ==17622== at 0x400AE6: dec2binDiv (1283810484.c:60)
    ==17622== by 0x400F9F: dec2bin (1283810484.c:168)
    ==17622== by 0x402CC9: main (1283810484.c:812)
    ==17622== Address 0x5423847 is 1 bytes before a block of size 44 alloc'd
    ==17622== at 0x4C278AE: malloc (vg_replace_malloc.c:207)
    ==17622== by 0x400CD4: dec2bin (1283810484.c:99)
    ==17622== by 0x402CC9: main (1283810484.c:812)
    ==17622==
    ==17622== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 8 from 1)
    ==17622== malloc/free: in use at exit: 7,840 bytes in 160 blocks.
    ==17622== malloc/free: 171 allocs, 11 frees, 11,018 bytes allocated.
    ==17622== For counts of detected errors, rerun with: -v
    ==17622== searching for pointers to 160 not-freed blocks.
    ==17622== checked 73,696 bytes.
    ==17622==
    ==17622==
    ==17622== 7,840 bytes in 160 blocks are definitely lost in loss record 1 of 1
    ==17622== at 0x4C278AE: malloc (vg_replace_malloc.c:207)
    ==17622== by 0x402353: binToDez (1283810484.c:640)
    ==17622== by 0x402A9C: Ausgabe (1283810484.c:755)
    ==17622== by 0x402D70: main (1283810484.c:834)
    ==17622==
    ==17622== LEAK SUMMARY:
    ==17622== definitely lost: 7,840 bytes in 160 blocks.
    ==17622== possibly lost: 0 bytes in 0 blocks.
    ==17622== still reachable: 0 bytes in 0 blocks.
    ==17622== suppressed: 0 bytes in 0 blocks.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.970
    Zitat Zitat von HentaiD Beitrag anzeigen
    Es ist die for-Schleife in Zeile 73. Die bricht irgendwann bei der Ausgabe ab (94). Der Fehler liegt offenbar aber woanders.
    Wenn es genau an der Stelle abstürzt, dann liegt der Fehler in erster Linie genau an der Stelle.

    Benutze den Debugger. Wie sind die Werte der Variablen bits und i in Zeile 94 beim Absturz?

    Zitat Zitat von HentaiD Beitrag anzeigen
    Valgrind stört mit folgendem Fehler:
    Ich sehe nirgendwo eine Stelle wo du die Arrays dez_out[0] bis dez_out[bits-1] freigibst...

    Gruß
    HentaiD bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    HentaiD HentaiD ist offline Mitglied
    Registriert seit
    Jul 2003
    Beiträge
    23
    Stimmt! Tatsache, sowas Doofes.

    Code :
    1
    2
    
    free(dez_out);
    free(*dez_out);

    So müsste es aussehen, denke ich.
    Ja mein guter Debugger... ich weiß nicht was damit nicht stimmt, aber er selbst wirft lustigerweise eine Access Violation und funktioniert anscheinend nicht. Aber danke schon einmal für den Tipp mit free und jetzt werde ich mich mal auf die Suche nach einem ordentlichen Debugger machen.
     

  6. #6
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.770
    Blog-Einträge
    5
    Zitat Zitat von HentaiD Beitrag anzeigen
    Code :
    1
    2
    
    free(dez_out);
    free(*dez_out);

    So müsste es aussehen, denke ich.
    Auf keinen Fall. Erstens gibst du die Speicherbereiche in der falschen Reihenfolge frei. Und zweitens werden die Bereiche dez_out[1] bis dez_out[bits-1] nicht freigegeben. Du musst eine Schleife verwenden wie bei malloc:

    Code c:
    1
    2
    3
    4
    
    for(i=0;i<bits;i++){
        free(dez_out[i]);
    }
    free(dez_out);

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. access violation
    Von alice in wunderlan im Forum Cinema 4D
    Antworten: 3
    Letzter Beitrag: 26.02.10, 12:51
  2. Unmanaged DLL Access Violation?
    Von engelmarkus im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 15.05.09, 22:58
  3. [C] Pointer: Access Violation
    Von nickoff im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 30.03.08, 12:21
  4. Access Violation!?
    Von shader09 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 03.03.08, 15:39
  5. access vîolation
    Von derGugi im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 15.04.03, 16:10