Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 07:50

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: External: ?
BeitragVerfasst: Fr Sep 03, 2010 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Hai

Ich versuch gerade, ein kleines Programm mit SDL zu schreiben. Seit ich auf SDL_KEYDOWN und SDL_KEYUP reagiere, erhalte ich immer, wenn ich auf eine Pfeiltaste drücke, die Meldung
Zitat:
External: ?
Das eigenartige (mal abgesehen von der Meldung selbst) daran ist, dass diese Meldung nur kommt, wenn ich keine Haltepunkte gesetzt hab. :x Mit debuggen wirds also nix.

Der Fehler tritt da auf:
Code:
operator * (a: TVec4; b: single): TVec4; register; assembler;
asm
  {$ifdef amd64}
     movups   xmm0, [rax]    //xmm0 = a
     movss    xmm1, b        //xmm1 = { ???, ???, ???, b }
     movsldup xmm1, xmm1     //xmm1 = { ???, ???, b, b }
     movddup  xmm1, xmm1     //xmm1 = { b, b, b, b }
     mulps    xmm0, xmm1     //xmm0 = xmm0 * xmm1
     movups   [result], xmm0 //result = xmm0
  {$else}
     movups   xmm0, [eax]    //xmm0 = a
     movss    xmm1, b        //xmm1 = { ???, ???, ???, b }
     movsldup xmm1, xmm1     //xmm1 = { ???, ???, b, b }
     movddup  xmm1, xmm1     //xmm1 = { b, b, b, b }
     mulps    xmm0, xmm1     //xmm0 = xmm0 * xmm1 //////////////////////////////////HIER TRITT DER FEHLER AUF
     movups   [result], xmm0 //result = xmm0
  {$endif}
end; 


Wenn ich die Funktion rauskommentier tritt der Fehler nach wie vor auf, nur sagts mir dann nicht, wo. Außerdem funktioniert die Funktion woanders schon.

Die Keydown, up sind:
Code:
procedure glHandleKeyPress( keysym : PSDL_keysym );
begin;
  case keysym^.sym of
    SDLK_ESCAPE : done := -1;
    SDLK_LEFT: keys:= keys or 1;
    SDLK_UP: keys:= keys or 2;
    SDLK_RIGHT: keys:= keys or 4;
    SDLK_DOWN: keys:= keys or 8;
  end;
end;

procedure glHandleKeyUp(keysym: PSDL_keysym);
begin
  case keysym^.sym of
    SDLK_LEFT: keys:= keys and not 1;
    SDLK_UP: keys:= keys and not 2;
    SDLK_RIGHT: keys:= keys and not 4;
    SDLK_DOWN: keys:= keys and not 8;
  end;
end; 


weiß wer, was ich da falsch mach?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Do Sep 09, 2010 12:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Keiner ne Ahnung, was External: ? bedeutet? Na gut, die Meldung sieht auch nicht so aus, als ob man da leicht auf einen bestimmten Fehler schließen könnte...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Do Sep 09, 2010 19:35 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das hat nix mit SDL zu tun. Da is ASM falsch denk ich.

Durch den DEBUG Modus wird der Code anders Compiliert (z.B. nicht optimiert). Dadurch kommts nicht zu diesem Fehler.
Am besten du gehst nochmal ganz tief in dich und Prüfst dein geschriebenes Zeugs mal auf Seiteneffekte hin ab.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Do Sep 09, 2010 21:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Allseits beliebt sind Bufferoverflows die keinen Fehler (Segfault) verursachen, weil du noch im erlaubten Speicherbereich der Anwendung schreibst. Damit überschreibt man sich dann selbst Daten die einfach nur zufällig vom Compiler in der Nachbarschaft angesiedelt wurden. Das gibt folglich extrem merkwürdige Fehler an stellen die mit dem eigentlichen Problem gar nichts zu tun haben. Checke mal alles durch was du so mit Pointern machst. Es gibt auch Tools die dabei helfen, z.B. valgrind.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Fr Sep 10, 2010 08:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich denke, dass Coolcat recht hat und du mal deine Pointer durch gehen solltest.
Valgrind ist für Linux und du solltest auf dinge wie Pointer die nicht mit 0 initialisiert wurden, Pointer die von dir gesetzt wurden und pchar kram prüfen.
Da es in einigen Fällen geht schätze ich mal, dass da ein Pointer am anfang nicht 0 gesetzt wird und irgendwo ein if (ptr!=0) ... , if (ptr) ... , if (ptr==0) darauf prüft und dann code ausführt der nicht soll.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Fr Sep 10, 2010 09:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Hab mal alles mit asm drin auskommentiert, und dann stückchenweise wieder eingeschaltet.
Hab den Fehler mehr oder weniger gefunden. Ich weiß jetzt, in welcher Funktion er verursacht wird. Nur was da falsch ist, weiß ich noch nicht.
Code:
function lerp(a, b: TVec4; t: single): TVec4; register; assembler;
asm
     movups xmm0, [eax]   //xmm0 = a
     movups xmm1, [edx]   //xmm1 = b
     movss  xmm2, t       //xmm2[0] = t
     subps  xmm1, xmm0    //xmm1 = b - a
     movsldup xmm2, xmm2  //xmm2 = { ???, ???, t, t }
     movddup  xmm2, xmm2  //xmm2 = { t, t, t, t }
     mulps  xmm1, xmm2    //xmm1 *= t
     addps  xmm0, xmm1    //xmm0 = a + (b - a) * t
     movups [result], xmm0//result = xmm0
end;   

Eigenartig ist auch, dass der Fehler nur auftritt, wenn ich auf eine Pfeiltaste gedrückt hab. (was dann darin resultiert, dass die Funktion nicht nur Nullvektoren bekommt)

Zitat:
Durch den DEBUG Modus wird der Code anders Compiliert
Wenn ich das Programm Zeile für Zeile einzeln ausführe, gibts keinen Fehler, sonst schon. Oder werden die Zeilen da auch einzeln neu kompiliert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Fr Sep 10, 2010 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wenn du das Programm Zeile für Zeile ausführst benutzt du den Debug-Modus. Merkbare Unterschiede zwischen Release- und Debug-Modus deuten stark auf ein wie oben beschriebenes Speicherproblem hin.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Sa Sep 11, 2010 11:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Den Debug-Modus musst du aber separat an/ausschalten. Das wird nicht gemacht, indem du F9 drückst oder F8… Genaugenommen kennt FPC sowas nicht mal wirklich. Optimierungen, Tests und Debuginfos für den GDB werden einzeln angeschaltet.

Der GDB tut allerdings "Dinge", wenn man debuggt. Beispielsweise füllt er Speicher zu Beginn mit dem Hexwert $DEADBEEF, damit man nicht initialisierten Speicher schnell erkennt ;). Sowas kann natürlich Auswirkungen haben.

Interessant wäre noch, wie du das Auskommentieren gemacht hast. Hast du die Funktionen auskommentiert und durch nicht-ASM-Versionen ersetzt oder komplett undefiniert gelassen? Wenn du nicht letzteres getan hast, dann kannst du nicht sicher sein, dass der Fehler im ASM liegt. Es kann genauso gut sein, dass durch dein Entfernen von Code wo ganz anders etwas nicht ausgeführt wurde, das für das Problem sorgt.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Sa Sep 11, 2010 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Interessant wäre noch, wie du das Auskommentieren gemacht hast.
Habs undefiniert gelassen. Aber mit nicht asm ersetzen wirds wohl auch nicht unbedingt bringen, weil das ist dann auch nicht gleich viele Bytes lang.

Aber seit ich nach der Funktion noch was mit dem ergebnis berechne, tritt der Fehler nicht mehr auf. Sieht also nicht sehr danach aus, als ob ich den Fehler finden werde.

Die Sache ist nur die, dass ich ziemlich wenig mit Pointern mache, außer halt denen, die nach dem Funktionsaufruf in eax, edx, ecx stehen. Und den PSDL_WasAuchImmer ;) Nur abgesehen von referenzieren und dereferenzieren mach ich eigentlich nix. Wird nix addiert, subtrahiert, sonstwas.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Sa Sep 11, 2010 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
sharkman hat geschrieben:
Zitat:
Interessant wäre noch, wie du das Auskommentieren gemacht hast.
Habs undefiniert gelassen. Aber mit nicht asm ersetzen wirds wohl auch nicht unbedingt bringen, weil das ist dann auch nicht gleich viele Bytes lang.

Der Code muss doch nicht genauso lang sein, oder? Ich würd sagen probiers mal aus, indem du den ASM-Teil mit non-ASM-Code ersetzt. Da geht dann eigentlich nichts schief. So kannst du den Fehler vielleicht etwas besser jagen.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Sa Sep 11, 2010 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Ich schaffs nicht, den Fehler wieder auftreten zu lassen. Hab zwar sämtliche Änderungen seit damals (an die ich mich noch erinnern kann) rückgängig gemacht, aber der Fehler kommt nicht mehr.

Und wenn das nicht gleich lang ist, ist dann nicht alles irgendwie verschoben bzw sonst wie an anderen Stellen?


Ich schätz mal, im Endeffekt wird dann wieder irgendwann irgendein derartiger Fehler kommen, den ich nicht mehr wegkrieg, und dann kann ich den code wegwerfen. jippie. mal wieder. Wäre auch das erste Programm, das ich nicht so beende.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: Sa Sep 11, 2010 13:19 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Solche Fehler können einen echt verrückt machen, das kenn' ich. Für die Zukunft solltest du dir vielleicht an der Stelle mit dem unerklärlichen Fehler ein Backup machen, sodass du es sicher reproduzieren kannst. Aber ich weiß, dass das leicht gesagt ist, in der Praxis mache ich das selber auch nie. :roll:


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 20:50, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: External: ?
BeitragVerfasst: So Sep 12, 2010 00:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du mal ein Tool drüber laufen lassen?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]