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
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:
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);