Zum Inhalt springen

Programmierung eines Chatbots


Mefisto

Empfohlene Beiträge

Hallo,

danke für de Antwort. Wenn ich etwas weiter denke, dann kann ich über mein Netz Regeln aufstellen, z.B.:

IF (A,Vater von,B) AND (B, Vater von, C), THEN (A,Grossvater von,C)

Diese Regeln(Rules) sollen das "Wissen" über die "Daten" darstellen.

(nach "Grundlagen künstlicher Intelligenz"von ??, 198?)

Ich könnte mit vorstellen, das das den Speicherbedarf der Datenbanken reduziert.

Aber vielleicht sollten wir darüber ein neues Thema aufmachen?

LG

André

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 58
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Von mir aus könnt ihr ruhig hier bleiben in dem Thema, mich stört das nicht... Wenn es euch nicht stört, dass ich hier immer mal Fragen in den Raum werfe :)

Habe mein Problem übrigens gelöst, also vergesst die Frage oben mal eifnach wieder :)

Trigger id: < ... Trigger content: <trigger 1>guten <var 1>(morgen|mittag|abend|tag)</var></trigger>Trigger id: < ... Trigger content: <trigger 2>gute <var 2>nacht</var></trigger>Trigger id: < ... Trigger content: <trigger 3>hallo</trigger>

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist so genannte "Prädikatenlogik", schau Dir dazu wirklich einmal Prolog an, damit kann man sehr einfach solche Strukturen entwerfen, die auch viel komplexer werden können

Phil

Ich habe für FreeHAL lange Libraries bzgl. Prolog und ähnliches gesucht, aber nichts plattformunabhängiges und zum embedden geeingetes gefunden. Die schönste von Mathematik-Informatikern erdachte Theorie nützt nichts, wenn es keine für ein solches Projekt geeigneten praktischen Umsetzungen gibt. Ich habe mich aber auch dagegen entschieden ein solches System zu implementieren und darauf aufzubauen, und habe stattdessen mit einer Datenbank und SQL-Abfragen das gleiche erreicht. Vielleicht ist die Situation jetzt etwas anders, vor 3 Jahren hätte es sich für mich nicht gelohnt mit SWI Prolog oder anderen bekannten Implementierungen anzufangen.

Das Programm hier entwickelt sich aber sowieso in die ganz andere Richtung Pattern-Matching.

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Programm hier entwickelt sich aber sowieso in die ganz andere Richtung Pattern-Matching.

Das ist aber dann sehr begrenzt, denn es bleibt imKern der Abgleich nach Pattern. Prolog lässt z.B. via ODBC auch Datenbankzugriffe zu, wobei hier dann die Datensätze als Prädikate verwendet werden. Ggf. könnte man auch zur Vorverarbeitung Stemmin bzw Bag Word einsetzen. Reine Pattern Abalyse würde sich wohl eher ELIZA entwickeln

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist so genannte "Prädikatenlogik", schau Dir dazu wirklich einmal Prolog an, damit kann man sehr einfach solche Strukturen entwerfen, die auch viel komplexer werden können

Phil

Das ist aber dann sehr begrenzt, ... Reine Pattern Abalyse würde sich wohl eher ELIZA entwickeln

Klar, aber die Frage ist was der Threadautor vorhat oder sich zutraut. ALICE hat es zu erstaunlicher Bekanntheit gebracht, wo ja der Zusammenhang zwischen dem Namen "A.I. Foundation" und Pattern matching gar nicht gegeben ist. Dass die sich nicht lächerlich vorkommen :upps

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dass Pattern Matching ja nicht wirklich in die Richtung von einer KI geht ist denke ich klar... Aber de Facto tut das kein Computerprogramm, auch nicht FreeHal (nichts für ungut)... Auch FreeHal ist letztendlich Pattern Matching, nur auf einem anderen Prinzip aufbauend, welches wesentlich komplexer ist und auch komplexere Reaktionen zulässt. Aber wie ich auf Seite 1 oder 2 schon mal gesagt hatte, ist die wirkliche KI unerreichbar. Denn könnte eine Maschine dass an Inelligenz leisten, was unser Gehirn tut, dann würde das im Umkehrschluss heißen, dass wir berechenbare Maschinen sind. Wobe die These ja was hätte :D

Jetzt ist die Frage, ob ein sehr elegantes Semantisches Netzwerk der KI näher kommt als ein funktionelles Pattern-Matching System. Beide erreichen auf unterschiedliche Weise ihr Ziel, und nach dem, was ich inzwischen alles so getestet habe (FreeHal kann ich ja leider immer noch nicht testen :(), führen die Pattern Matching Systeme meiner Meinung nach die BotWelt an. Aber vom mathematischen Prinzip und dem Potential her liegen definitiv Programme wie FreeHAL vorne :) Ich hoffe das kriegt hier keiner in den falschen Hals und ihr versteht wie ich das meine...:uli

Naja, bei all dem philosophieren hier hätte ich fast eine Frage vergessen. Ich bin jetzt mit der Verarbeitung der User-Eingabe fast fertig. Genaugenommen war ich das schon, und ich bin gerade dabei, daran zu Arbeiten, dass mehrere Mögliche Ausgaben festgelegt werden können, aus welchen dann eine Ausgelost wird. Es hat sich außerdem Etwas an der Moduldatei geändert. Der leichteren Verarbeitung wegen müssen Trigger und Output jetzt in der selben Zeile stehen:

<trigger 1>Hallo</trigger> <out>Auch Hallo!</out><out>Ebenfalls Hallo!</out>

So könnte einer dieser Zeilen aussehen, und da wird auch schon klar, was ich mit den verschiedenen Möglichkeiten meine. Es soll also ausgelost werden, ob auf "Hallo" jetzt "Auch Hallo!" oder "Ebenfalls Hallo!" ausgegeben wird. Dafür muss ich per RegExp vorher beide Outputs aus der Zeile herausfischen. Dabei bekomme ich aber aus irgendeinem Grund einen Segmentation fault... Leider sonst nichts. Hier ist der Code, der für das Auslesen in eine QStringList zuständig ist:

int successfuloutput = 0; int outputsuccess = 0; QStringList outputstrings;

while((successfuloutput = regularexpressionoutput.indexIn(line, successfuloutput)) != -1) {

outputsuccess = 1;

outputstrings << regularexpressionoutput.cap(1);

successfuloutput += regularexpressionoutput.matchedLength();

}

Laut den QT-Docs sollte das so bzw. ähnlich funktionieren... Was da falsch läuft: Ich weiß es nicht. Ich wäre für Infos sehr dankbar :) Und im Anhang mal wieder die ganze Datei, soweit wie ich jetzt bin.

Vielen Dank schon mal für eure Hilfe,

Jonathan

parser.txt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dass Pattern Matching ja nicht wirklich in die Richtung von einer KI geht ist denke ich klar... Aber de Facto tut das kein Computerprogramm, auch nicht FreeHal (nichts für ungut)... Auch FreeHal ist letztendlich Pattern Matching, nur auf einem anderen Prinzip aufbauend, welches wesentlich komplexer ist und auch komplexere Reaktionen zulässt.

Sorry, aber das ist einfach falsch. FreeHAL verwendet bis auf 2 Ausnahmen keine Art von Pattern Matching: Begrüßung und Abschied. Kein auf Pattern Matching basierendes Programm kann lernen, höchstens ein paar Variablen zwischenspeichern. Warum? Weil es nur Frage-Muster und Standardantworten kennt. Es kann keine Sätze parsen oder bilden. Anscheinend hast du die Dateien im lang_de/-Verzeichnis grundlegend falsch verstanden.

Jetzt ist die Frage, ob ein sehr elegantes Semantisches Netzwerk der KI näher kommt als ein funktionelles Pattern-Matching System. Beide erreichen auf unterschiedliche Weise ihr Ziel, und nach dem, was ich inzwischen alles so getestet habe (FreeHal kann ich ja leider immer noch nicht testen :(), führen die Pattern Matching Systeme meiner Meinung nach die BotWelt an. Aber vom mathematischen Prinzip und dem Potential her liegen definitiv Programme wie FreeHAL vorne :) Ich hoffe das kriegt hier keiner in den falschen Hals und ihr versteht wie ich das meine...:uli

Naja, bei all dem philosophieren hier hätte ich fast eine Frage vergessen. Ich bin jetzt mit der Verarbeitung der User-Eingabe fast fertig. Genaugenommen war ich das schon, und ich bin gerade dabei, daran zu Arbeiten, dass mehrere Mögliche Ausgaben festgelegt werden können, aus welchen dann eine Ausgelost wird. Es hat sich außerdem Etwas an der Moduldatei geändert. Der leichteren Verarbeitung wegen müssen Trigger und Output jetzt in der selben Zeile stehen:

<trigger 1>Hallo</trigger> <out>Auch Hallo!</out><out>Ebenfalls Hallo!</out>

So könnte einer dieser Zeilen aussehen, und da wird auch schon klar, was ich mit den verschiedenen Möglichkeiten meine. Es soll also ausgelost werden, ob auf "Hallo" jetzt "Auch Hallo!" oder "Ebenfalls Hallo!" ausgegeben wird. Dafür muss ich per RegExp vorher beide Outputs aus der Zeile herausfischen. Dabei bekomme ich aber aus irgendeinem Grund einen Segmentation fault... Leider sonst nichts. Hier ist der Code, der für das Auslesen in eine QStringList zuständig ist:

int successfuloutput = 0; int outputsuccess = 0; QStringList outputstrings;

while((successfuloutput = regularexpressionoutput.indexIn(line, successfuloutput)) != -1) {

outputsuccess = 1;

outputstrings << regularexpressionoutput.cap(1);

successfuloutput += regularexpressionoutput.matchedLength();

}

Laut den QT-Docs sollte das so bzw. ähnlich funktionieren... Was da falsch läuft: Ich weiß es nicht. Ich wäre für Infos sehr dankbar :) Und im Anhang mal wieder die ganze Datei, soweit wie ich jetzt bin.

Vielen Dank schon mal für eure Hilfe,

Jonathan

Bis auf die Tatsache, dass der Regex verkehrt ist...

$ ./a.out


Auch Hallo!</out><out>Ebenfalls Hallo!
Ist eigentlich auf den ersten Blick fast alles richtig. Du darfst nur nicht
for(int j=0;j<=foo.size();++j) {
schreiben, sondern
for(int j=0;j<foo.size();++j) {
Wenn du j auf 0 setzt, und die Länge ist 0, findet ein Durchlauf statt, obwohl die Länge ja Null ist.

$ g++ -g chatbot.cpp  -I/usr/include/qt4/QtGui -I/usr/include/qt4/ -I/usr/include/qt4/QtCore -lQtGui ; ./a.out

ASSERT failure in QList<T>::at: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 387

Aborted


$ gdb ./a.out

GNU gdb 6.8-debian

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu"...


(gdb) run

Starting program: /home/tobias/temp/a.out 

[Thread debugging using libthread_db enabled]

[New Thread 0x7fc484539700 (LWP 19922)]

ASSERT failure in QList<T>::at: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 387


Program received signal SIGABRT, Aborted.

[Switching to Thread 0x7fc484539700 (LWP 19922)]

0x00007fc482d0dfa5 in raise () from /lib/libc.so.6


(gdb) bt

#0  0x00007fc482d0dfa5 in raise () from /lib/libc.so.6

#1  0x00007fc482d0fb13 in abort () from /lib/libc.so.6

#2  0x00007fc4829016b5 in qt_message_output () from /usr/lib/libQtCore.so.4

#3  0x00007fc4829017fd in qFatal () from /usr/lib/libQtCore.so.4

#4  0x00000000004039f2 in QList<QString>::at (this=0x7fff8c568720, i=2) at /usr/include/qt4/QtCore/qlist.h:387

#5  0x0000000000402956 in parse (input=

      {static null = {<No data fields>}, static shared_null = {ref = {_q_value = 79}, alloc = 0, size = 0, data = 0x6061da, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 4}, alloc = 0, size = 0, data = 0x7fc482cd92fa, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x7fff8c5689b0, static codecForCStrings = 0x0}, language=

      {static null = {<No data fields>}, static shared_null = {ref = {_q_value = 79}, alloc = 0, size = 0, data = 0x6061da, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 4}, alloc = 0, size = 0, data = 0x7fc482cd92fa, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x7fff8c5689a0, static codecForCStrings = 0x0}) at chatbot.cpp:78

#6  0x0000000000402e31 in main (argc=1, argv=0x7fff8c568aa8) at chatbot.cpp:90


(gdb) q

The program is running.  Exit anyway? (y or n) y 

$

Der Fehler liegt also in charbot.cpp Zeile 78, aufgerufen von Zeile 90.

Gruß

Tobias

Bearbeitet von Tobias Schulz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, irgendwie bin ich gerade etwas verwirrt... Also meine RegExpressions stimmen eigentlich, weil vor dem Versuch, mehrere in einer Zeile auszulesen, hat es ja funktioniert :) Aber vielleicht übersehe ich was?

Und den Segmentation fault habe ich gefunden, vielen Dank dafür :)

Ersetze mal

                              successfuloutput += regularexpressionoutput.matchedLength();
durch
                                ++successfuloutput;
Dann bekommst du zwei Antworten:
Auch Hallo!</out><out>Ebenfalls Hallo!

Ebenfalls Hallo!

Das Problem ist, dass ".*" zu "gierig" ist. Wenn der Tag wie hier mit "<" beginnt, kannst du das hier verwenden:
        QRegExp regularexpressionoutput("\\<out\\>([^<]*)\\<\\/out\\>", Qt::CaseInsensitive, QRegExp::RegExp2);

"[^<]" ist alles außer "<".

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aaaah das ist einer dieser Momente wo einem ein Licht aufgeht :)

Es wurde also nur der linke und rechte Tag erkannt und zwischendrin das </out><out> nur als normaler Text...

Und weil ich mir das ganze nur in einem HTML-Textbrowser angeguckt habe, wurden die Taggs entfernt... Hm vielen Dank, ich wäre glaube ich erst in ein paar Tagen drauf gekommen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, das ganze läuft jetzt erstmal soweit ganz gut :)

Ist ja schonmal was für einen Tag!

Aber ein letztes Problem besteht noch mit dem aktuellen Code: Und zwar die deutschen Umlaute... Das Programm ist zwar eigentlich auf Englisch und beinhaltet halt erstmal nur das deutsche "Sprachpaket" (zumindest wird es das mal, ist ja erst eine Datei ;)), aber die Umlaute brauche ich für das deutsche Paket trotzdem. Das heißt: Tippt der User ä, ü, ö oder ß ein, so werden diese falsch dargestellt. Auch die Ausgabe vom Computer wird nicht richtig dargestellt.

Kann ich das irgendwo umstellen von utf-8 auf ISO oder so?

Danke schonmal :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich weiss, dass mein Beipsile "Prädikatenkalkül" ist, und in Prolog besser umgesetzt werden kann.

Ich bin aber durchaus auch der Meinung, dass sich das in einer Sprache wie C++ umsetzen lässt.

Ich meine, dass Semantische Netze zur Wissenspräsentation als erstes geeignet sind, weil sie sich grafisch darstellen lassen als Strecke( für Relation) zwischen zwei Punkten( für die Objekte). Im Beispiel ging es darum, aus den Strecken AB und BC ein Dreieck ABC zu bilden. Die Relation AC ist aus den anderen beiden abgeleitet.

In diesem kleinen Beispiel ergibt sich daher, dass die Datenbank nur zwei Beziehungen speichern muss, die dritte wird vom System gebildet.

Das System benötigt zur Darstellng des Wissens damit eine klein(er)e Datenbank, und eine (kleine) Wissensbank.

Dass das System selbst Daten hinzufügen und verwerfen kann, ist gerade das Besondere an solchen KI-Systemen.

User: Ich habe einen Vogel gekauft

Chatbot:Vogel- Kenne ich nicht. Was ist ein Vogel?

User: En Vogel ist sowas wie ein Tier.

Nun soll das Chatbot einen neuen Knoten "Vogel" anlegen und ihn mit leeren Knoten verbinden, wozu er die Relationen des bekannten Knotens Tier nutzt. Wenn das System nun die Relationen abfragt, sammelt es Wissen über Vogel.

Das Spannende hier ist wiederum, dass der Nutzer selbst auch neue Relationen an den Knoten ergänzen kann.

Das nächste Problem dabei zeigt sich "Ist A ein Vogel, kann A fliegen"-"Ist A ein Pinguin kann nicht fliegen". Daten sind also immer wichtiger als geschlussfolgertes Wissen.

dass bei der Verarbeitung "Muster" genutzt werden, halte ich für normal, weil wir als Menschen selbst beim Reden und Schreiben auch Muster benutzen.

Schönen Abend noch,

André

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, wer interesse hat zu sehen, was heute so enstanden ist (ist ja noch nicht viel, aber für einen Tag gehts finde ich :)) kann sich das kleine Paket aus dem anhang runterladen und mit make kompillieren. Ihr braucht QT (mindstens irgendwas mit 4 ;))... Vernünftig kommentiert habe ich hier nur die "parser.cpp", in der bisher die meiste Arbeit steckt.

Morgen mache ich dann Variablen in Modulen möglich (die ich zwischenzeitlich rausgenommen habe) und füge einigen Code im parser.cpp zusammen (z.B. die letzten beiden Schleifen passen gut in eine)... Ansonsten werde ich wohl dann erstmal etwas am Inhalt schreiben, damit ich hinterher eine größere Basis zum Testen habe (mit einer Datei ist das immer recht schwierig)...

Über Tester freue ich mich natürlich, auch wenn es noch nicht so viel ist. Auch Codeverbesserungen sind immer nützlich :)

Liebe Grüße und eine gute Nacht,

Jonathan :schlaf:

P.S.: Ich hoffe das mit dem abgekufertem Namen ist nicht so schlimm, ich änder ihn auch wenn ich länger dran weiterarbeite... Nur ich hatte von meinen ganzen Übungsprojekten schon cina, cina 2, cina_ui, etc... ;)

cina2009_0-0-1.zip

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, nach ja inzwischen einiger Zeit wollte ich mich mal wieder hier melden. Ich hatte die letzte Woche eher wenig Zeit und deswegen habe ich kaum dran weitergearbeitet. Heute hat mich aber mal wieder der Wahn gepackt und ich wollte etwas weitermachen... Die Parser-Funktion hatte ich schon anfang der Woche überarbeitet und komplett neu gemacht (Datei war fast halb so groß hinterher ;))... Jetzt heute wollte ich mich etwas mit der Erinnerungs-Funktion beschäftigen:

Innerhalb der Module kann der Benutzer entweder mit "[sETTOPIC irgendeinthema]" ein Thema setzen oder mit "[iFTOPIC irgendeinthema]" das aktuelle Thema abfragen. Somit kann z.B. folgendes realisiert werden:

User: Hallo!

Bot: Auch hallo :)

User: Ich habe ein Problem mit GIMP...

Bot: Ok, dann schießen Sie mal los! :) (hier wird das Thema auf "gimp" gesetzt...

User: Wie erstelle ich ein neues Bild? (nirgendwo das Wort gimp drin)

Bot: Klicken Sie im Hauptfenster von GIMP auf "Datei->Neu".

Im letzten Satz ist im "Trigger-Teil" des Modules der Zusatz "[iFTOPIC gimp]"... Da der User vorher GIMP erwähnt hat, wurde auch "gimp" als thema gespeichert mit diesem einfachen trigger:

<trigger 1>gimp</trigger> <out>[sETTOPIC gimp]</out>

Soweit so gut, ich bin auch fertig, das ganze zu schreiben. Nur dummerweise funktioniert es nicht. Es kompilliert zwar alles, aber sobald ich etwas eingebe und der parser das ganze verarbeiten soll, stürzt das Programm ab (Segmentation fault, sagt zumindest gdb)... Der Fehler liegt also wahrscheinlich in meiner parser.cpp...

Da ich selbst zu doof bin zu sehen, was ich falsch gemacht habe, wollte ich fragen, ob einer von euch kurz einen Blick auf die Datei werfen kann... Das wäre sehr, sehr nett :)

Vielen Dank schon Mal im Voraus! :)

Grüße,

Jonathan

parser.txt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es kompilliert zwar alles, aber sobald ich etwas eingebe und der parser das ganze verarbeiten soll, stürzt das Programm ab (Segmentation fault, sagt zumindest gdb)

Na wenn du sowieso den gdb am Start hast, dann zeig doch mal einen Backtrace.

Was mir aufgefallen ist, aber sicher nichts mit deinem Problem zu tun hat: Du solltest srand nur einmal aufrufen, nicht jedesmal, wenn du eine Zufallszahl brauchst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, hier der Backtrace:

#0  0xb762a57b in QString::append () from /usr/lib/libQtCore.so.4

#1  0x0804cb1a in mainwindow::sendString ()

#2  0x08051a9d in mainwindow::qt_metacall ()

#3  0xb76eaa60 in QMetaObject::activate () from /usr/lib/libQtCore.so.4

#4  0xb76eb7e2 in QMetaObject::activate () from /usr/lib/libQtCore.so.4

#5  0xb7c947a7 in QLineEdit::returnPressed () from /usr/lib/libQtGui.so.4

#6  0xb7c9d406 in QLineEdit::keyPressEvent () from /usr/lib/libQtGui.so.4

#7  0xb794f81e in QWidget::event () from /usr/lib/libQtGui.so.4

#8  0xb7c9b157 in QLineEdit::event () from /usr/lib/libQtGui.so.4

#9  0xb78f78ec in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4

#10 0xb7900806 in QApplication::notify () from /usr/lib/libQtGui.so.4

#11 0xb76d5e61 in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4

#12 0xb79583de in ?? () from /usr/lib/libQtGui.so.4

#13 0xb798ebb0 in ?? () from /usr/lib/libQtGui.so.4

#14 0xb7990d26 in ?? () from /usr/lib/libQtGui.so.4

#15 0xb7967af5 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4

#16 0xb79927aa in ?? () from /usr/lib/libQtGui.so.4

#17 0xb72006f8 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0

#18 0xb7203da3 in ?? () from /usr/lib/libglib-2.0.so.0

#19 0xb7203f61 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0

#20 0xb7700478 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4

#21 0xb7991ea5 in ?? () from /usr/lib/libQtGui.so.4

#22 0xb76d452a in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4

#23 0xb76d46ea in QEventLoop::exec () from /usr/lib/libQtCore.so.4

#24 0xb76d6da5 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4

#25 0xb78f7767 in QApplication::exec () from /usr/lib/libQtGui.so.4

#26 0x0804c105 in main ()

Danke übrigens für den Tipp mit dem srand() :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, hier der Backtrace:

#0  0xb762a57b in QString::append () from /usr/lib/libQtCore.so.4

#1  0x0804cb1a in mainwindow::sendString ()

#2  0x08051a9d in mainwindow::qt_metacall ()

#3  0xb76eaa60 in QMetaObject::activate () from /usr/lib/libQtCore.so.4

#4  0xb76eb7e2 in QMetaObject::activate () from /usr/lib/libQtCore.so.4

#5  0xb7c947a7 in QLineEdit::returnPressed () from /usr/lib/libQtGui.so.4

#6  0xb7c9d406 in QLineEdit::keyPressEvent () from /usr/lib/libQtGui.so.4

#7  0xb794f81e in QWidget::event () from /usr/lib/libQtGui.so.4

#8  0xb7c9b157 in QLineEdit::event () from /usr/lib/libQtGui.so.4

#9  0xb78f78ec in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4

#10 0xb7900806 in QApplication::notify () from /usr/lib/libQtGui.so.4

#11 0xb76d5e61 in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4

#12 0xb79583de in ?? () from /usr/lib/libQtGui.so.4

#13 0xb798ebb0 in ?? () from /usr/lib/libQtGui.so.4

#14 0xb7990d26 in ?? () from /usr/lib/libQtGui.so.4

#15 0xb7967af5 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4

#16 0xb79927aa in ?? () from /usr/lib/libQtGui.so.4

#17 0xb72006f8 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0

#18 0xb7203da3 in ?? () from /usr/lib/libglib-2.0.so.0

#19 0xb7203f61 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0

#20 0xb7700478 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4

#21 0xb7991ea5 in ?? () from /usr/lib/libQtGui.so.4

#22 0xb76d452a in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4

#23 0xb76d46ea in QEventLoop::exec () from /usr/lib/libQtCore.so.4

#24 0xb76d6da5 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4

#25 0xb78f7767 in QApplication::exec () from /usr/lib/libQtGui.so.4

#26 0x0804c105 in main ()

Danke übrigens für den Tipp mit dem srand() :)

Hallo,

Wenn du mit gdb arbeitest, solltest du den Code mit "-g" (Debugging Symble) kompilieren. Wenn du dann nach dem Aufruf des Backtraces vermutest, dass der Fehler in #123 steckt (die Nummern links bezeichnen praktisch die Rekusionstiefe), gibst du "frame 123" ein. Danach kannst du dir mit "list" den entsprechenden Codeabschnitt anzeigen lassen und mit "print variablenname" die Variable ausgeben lassen.

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm ich experimentiere jetzt schon seit einer Stunde mit gdb rum... Bin das Programm inzwischen per "step" vom Anfang an Schritt für Schritt durchgegangen und es kam kein brauchbares Ergebnis... Also irgendwie bin ich zu doof zum Debuggen... Was kann ich denn noch probieren? :)

Liebe Grüße,

Jonathan

P.S.: Ich habe gerade noch rausgefunden, dass der Fehler mit Sicherheit in der Datei "parser.cpp" liegen muss. Ich habe einen Breakpoint in die betreffende Funktion "QString parse()" gesetzt und dieser wurde erreicht. Es wird also die Funktion aufgerufen.

Bearbeitet von Mefisto
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm ich experimentiere jetzt schon seit einer Stunde mit gdb rum... Bin das Programm inzwischen per "step" vom Anfang an Schritt für Schritt durchgegangen und es kam kein brauchbares Ergebnis... Also irgendwie bin ich zu doof zum Debuggen... Was kann ich denn noch probieren? :)

Liebe Grüße,

Jonathan

Wenn du nochmal ein Quellcodearchiv als Anhang anfügst, kann ich dir die Terminalausgabe beim debuggen des Fehlers senden. Eine halbe Datei kann aber keiner kompilieren und deshalb auch noch nachvollziehen.

Gruß

Tobias

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dankeschön, dass ist sehr nett :)

Eine Beispieldatei, in welcher das, was ich heute neu dazu zu machen versucht habe zu sehen ist (also das mit SETTOPIC und IFTOPIC), ist in "language/de/gimp.mod"...

Bevor ich heute dran weitergemacht habe hat alles wunderbar kompilliert und funktioniert. Das heißt die züfällige Ausgabe bei (möglichkeit1|möglichkeit2|möglichkeit3) und alles andere funktioniert.

cina_0-0-3-debug.zip

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...