Was habe ich falsch gemacht?
-
also irgendwie will mir gar nicht so einleuchten was du da veranstalltest...
ein array wo du alle zahlen des asciicodes drin speicherst?
was soll das denn zum beispiel bringen wenn du alle möglichen kombinationen einmal speicherst von 00000000 bis 11111111?kannst du das mal ausführlicher motivieren was du überhaupt insgesamt machen willst und wie du genau planst was zu tun?
-
Also ich habe einen Huffman Baum und die Funktion SchreibeASCII bekommt die Wurzel von dem Baum als Pointer (*pKnoten) und soll diesen Baum dann rekursiv durchlaufen.
Das klappt auch alles so weit.. Er findet auch die einzelnen Blätter (bzw, Buchstaben) und würde sie auch ausgeben wenn ich ein printf in den else teil der Funktion schreiben würde.Ich speichere dann die Folge von 1en und 0en in dem array ASCII.
zB. Für das Zeichen A soll ASCII[65] den wert 101 erhalten..Mein Problem ist aber, dass wenn ich in einer anderen Funktion ASCII ausgeben will stehen da nur nullen drin.. der Baum wird aber richtig durchlaufen und auch alle Buchstaben werden gefunden.
Ich hoffe ich habe das Problem jetzt was besser beschrieben.
mfg
Fusion
-
Vielleicht solltest du für das char* in deiner struct auch Speicher reservieren
-
Also ich habe jetzt probiert in den else Teil folgendes zu schreiben:
else { ascii[pKnoten->zeichen].bincode = malloc(sizeof(char*)); ascii[pKnoten->zeichen].bincode = pwort; }
Das ändert aber irgendwie nix.. führt immer noch zur selben Ausgabe...
Ich habe grad gemerkt das zwar in den Array geschrieben wird aber irgendwie wird immer der Code der beim letzten Durchgang gefunden wird wieder überschrieben so das am ende nur nullen da stehen.. (letztes element besteht nur aus nullen weil der baum ja von links nach rechts durchlaufen wird und für jeden durchgang der nach links geht eine 1 notiert wird)
-
Fusion2K schrieb:
else { ascii[pKnoten->zeichen].bincode = malloc(sizeof(char*)); ascii[pKnoten->zeichen].bincode = pwort; }
Wieviel Speicher reservierst du denn mit sizeof(char*)? Und wieviel Speicher braucht pwort?
-
ascii[pKnoten->zeichen].bincode = malloc(sizeof(char*));
ascii[ ].bincode ist vom Typ char* deshalb denk ich mal das der befehl oben richtig ist, oder?
-
Denk ich nicht.
malloc(sizeof(char*));
reserviert Speicher für einen Zeiger. Der Rückgabetyp sollte insofern als char** interpretiert werden.
Dieses zBmalloc(100 * sizeof(char));
reserviert Speicher für 100 Zeichen. Der eigentliche Rückgabetyp ist hier char*.
-
Das bringt irgendwie auch nix..
Ich habe jetzt mal einfach meine Ausgabe kopiert:
Kompression ----------- A 5 <= Hier stehen die Buchstaben die verschlüsselt werden B 7 sollen C 2 D 5 B 1 <= Das sind die BinärCodes für die einzelnen Buchstaben A 01 wenn ich sie direkt in der Rekursion in "SchreibeASCII C 001 ausgebe D 000 CodeListe ----------- A 5 00 <= Diese Liste wird mir angezeigt wenn ich meinen Array B 7 0 mit den Binärcodes in einer anderen Funktion ausgebe.. C 2 000 D 5 000 Press any key to continue
Die einsen sind weg.. und ich kapier nicht warum
Ich verzweifel noch...
-
Das würde eben schon was bringen, wenn du dich mal hineindenkst.
Überleg doch mal. Du reservierst mit malloc() aus deinem Code nur Speicher für 4 Byte (auf einem 32Bit-System; davon gehe ich jetzt mal aus), also für 4 Zeichen. Das ist schon mal zu wenig. Du musst soviel Speicher reservieren, dass alle 0en und 1en für deinen Binärcode reinpassen und zusätzlich noch das Stringendezeichen reinpasst. Ein Zeichen hat 8 Bit, also musst du schon mal mind. 9 Byte reservieren.
Dann kommen wir zu der zweiten Zeile, bei der du einfach pwort auf deine Binärcodevariable zuweist. Da musst du eigentlich den Inhalt von pwort auf den vorher reservierten Speicher KOPIEREN (strcpy()).
Richtig wäre also:
else { ascii[pKnoten->zeichen].bincode = malloc(10); strcpy(ascii[pKnoten->zeichen].bincode, pwort); }
Und am Schluss deines Programms solltest du spätestens noch den reservierten Speicher mit free() wieder freigeben! Frühestens (da wärs am besten), wenn du den reservierten Speicher nicht mehr brauchst.
(Auch wenn moderne Betriebssysteme das Freigeben schon automatisch machen.)
-
Ich danke dir vielmals!!
Es klappt jetzt