AndiE Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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, 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é Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 Sag ich ja, war Stuss meine Frage Ich mache das ganze jetzt mit der Funktion ".cap(x)" von QRegExp, das funktioniert wunderbar. Aber trotzdem danke für die detailierte Ausgabe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 IF (A,Vater von, AND (B, Vater von, C), THEN (A,Grossvater von,C) 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 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, Jonathanparser.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 (bearbeitet) 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 22. Februar 2009 von Tobias Schulz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 Dankeschön, da werde ich jetzt wohl erstmal weiter tüfteln Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
AndiE Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 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é Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 22. Februar 2009 Autor Teilen Geschrieben 22. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 22. Februar 2009 Teilen Geschrieben 22. Februar 2009 Ich würde Dir dazu raten objektorientiert zu arbeiten, sowie den z.B. mit Doxygen zu kommentieren Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 1. März 2009 Autor Teilen Geschrieben 1. März 2009 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, Jonathanparser.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. März 2009 Teilen Geschrieben 1. März 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 1. März 2009 Autor Teilen Geschrieben 1. März 2009 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() Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 1. März 2009 Teilen Geschrieben 1. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 1. März 2009 Autor Teilen Geschrieben 1. März 2009 (bearbeitet) 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 1. März 2009 von Mefisto Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobias Schulz Geschrieben 1. März 2009 Teilen Geschrieben 1. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mefisto Geschrieben 1. März 2009 Autor Teilen Geschrieben 1. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.