Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.07.2010, 18:24

[Segmentation Fault] Huffman-Codes

Moin,

Ich bin grad dabei, ein kleines Referat für den Schulunterricht (für nächstes jahr :) ) vorzubereiten - über den Komprimierungsalgorithmus von Huffman.

mein Problem: es funktioniert schon Alles wunderbar - aber nur für Symbole mit Zeichenlänge 1. Setze ich die Zeichenlänge auf 2 rauf, stürzt das Programm mit einem Segmentation Fault ab. Ich vermute, ich habe irgendwas bei der Benutzung der Standardbibliothek versemmelt, da die fehlerhaften Parameter von std::sort kommen ( ich hab mein Prädikat selbst gesetzt).

Der Code findet sich im Anhang - ich entwickele mit Code::Blocks 10 auf Win XP Pro SP2, MingW von TDragon.

Vielen Dank im Voraus!

Mit freundlichen Grüßen,

dispy


Ergänzungen
Die Länge von Symbolen wird mithilfe von const int LETTERS_COUNT in Symbol.h definiert. Der Crash wird durch std::sort in der Datei HuffmanTree.cpp Zeile 72 ausgelöst.

Runtime-Log:

Zitat

Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: C:\C++\Huffman\
Adding source dir: C:\C++\Huffman\
Adding file: bin\Debug\Huffman.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.8
Child process PID: 4932
Program received signal SIGSEGV, Segmentation fault.
At C:/C++/Huffman/Link.h:66
Debugger finished with status 0

»dispy« hat folgende Datei angehängt:
  • tmp.zip (5,53 kB - 74 mal heruntergeladen - zuletzt: 30.04.2024, 23:00)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dispy« (09.07.2010, 19:26)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

09.07.2010, 18:52

Dann step mal mit dem Debugger durch...
@D13_Dreinig

3

09.07.2010, 19:09

Schon längst geschehen - wie ich den std::sort einzeln durchsteppe, habe ich bei Code::Blocks aber noch nicht raus.
Habe dafür schon die Strukturerzeugung gesteppt, die ist komplett OK.


MfG
dispy

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

09.07.2010, 20:43

Dann stell wenigstens eine Testumgebung (Testdaten, Programm) zur Verfügung womit der Fehler produziert werden kann.

Edit:
Du hast nen fehler in deinem Predicate, müsste egtl lauten:

C-/C++-Quelltext

1
2
3
static int isGreaterThan(const LinkPtr &link1, const LinkPtr &link2){
    return link1->getFrequency() > link2->getFrequency();
}
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (09.07.2010, 21:06)


5

10.07.2010, 18:55

dot hat mich darauf schon im IRC aufmerksam gemacht (Vielen Dank nochmal an dot )

=> Problem gelöst



Mit freundlichen Grüßen,

dispy

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dispy« (03.09.2010, 18:44)


the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

10.07.2010, 21:24

[zumteufelverflixtnochnmal]der sinn von nem forum ist dass man nich einfach postet "problem gelöst" sondern auch den LÖSUNGSWEG, so dass spätere problemfälle mit der sufu ne chance habe.[/zumteufelverflixtnochnmal]
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

10.07.2010, 21:32

David_pb hat die Lösung doch schon gepostet!? Das Problem war dass sein Predicate kein strict weak ordering implementiert, was aber eine Voraussetzung für das Funktionieren von std::sort ist.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (10.07.2010, 21:37)


the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

8

11.07.2010, 11:25

sorry, nich gesehen.. war gestern um 21.24 nich wirklich zurechnungsfähig -,- aua kopfweh.
<< an dieser Stelle ist eine Signatur verstorben >>

9

03.09.2010, 18:57

Moin,

ich habe diesen Montag meine BLL über Huffman-Coding gehalten - und möchte mich hiermit nochmal für die Hilfe bei dem Weak-Order-Problem bedanken - ohne euch hätte ich das nie so schnell beheben können :)

Anbei die Beispielimplementation Huffman, die Präsentation an sich und ein Matrix-Prolog (hab ich extra dafür geschrieben, es laufen wie beim Prolog der Matrix-Trilogie buchstaben (ASCII-random) durchs fenster und nach einem druck auf den Pfeil nach unten ergibt sich wie von Zauberhand ein selbst definierbares Wort :thumbsup: (benutze SFML 1.5). Leider wollte das mit dem Beamer nicht ;( aber lief trotzdem sehr gut)

Beispielimplementation
(Präsentation folgt - das kann jetzt dauern, hab hier nur GPRS)
Matrix-Prolog


(Falls sich jemand den Code tatsächlich anguckt, bitte ich um Verbesserungsvorschläge ;) )


MfG
dispy

10

03.09.2010, 19:21

Zitat

Falls sich jemand den Code tatsächlich anguckt, bitte ich um Verbesserungsvorschläge ;)

Na wenn du wirklich willst ;)

-

C-/C++-Quelltext

1
friend std::ostream& operator<<(std::ostream &mystream, HuffmanTree /*!*/const/*!*/&mytree);

- const mal überall setzen wo es "hingehört" (d.h. bei parametern, funktionen, usw.)
- Parameter die nicht primitiven Datentypen sind und nicht verändert werden, per const. Ref und nicht per copy übergeben.
- unsigned nutzen.
- C++-Style cast (static_cast, reinterpret_cast, ..., nicht (int) ;))
- einheitliche Namensgebung (d.h. nicht einmal großbuchstaben zu Funktionsnamenbeginn, bei nächsten dann kleinbuchstaben ;))
- std::sort statt sort
- Stell mal höchste Warnungsstufe ein, könnte sein das dem noch anderes auffällt als mir ;)
- getMinUnAttachedLink könnte auch const.Ref. zurückgeben, sparst dir paar Kopien, hab nicht alle Funktionen durchgeguckt aber sind bestimmt noch welche dabei, wo de ähnliches machen kannst.
- Link::isGreaterThan, was soll hier der int Rückgabewert? Sind wir bei Microsoft BOOL angekommen? ;)

So reicht jetzt erstmal :D Aber sonst schöne Sache :)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige