W-T-F ?

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

W-T-F ?

Beitrag von X0r »

Oh mein Gott, 3 Stunden, 3 Stunden saß ich vor einem kleinen Pippi-Code und bin ihn bis zum geht nicht mehr durchgegangen, in der Hoffnung, ich würde den Fehler durch rumprobieren finden.
Und jetzt, endlich, nach stundenlangem rumprobieren habe ich ihn gefunden.
Der Fehler lag daran:

Code: Alles auswählen

    For a=0 To tris-1
      bbAddTriangle(surf,ReadLong(0),ReadLong(0),ReadLong(0))
    Next
Schreibt man stattdessen das hier:

Code: Alles auswählen

t1=ReadLong(0)
t2=ReadLong(0)
t3=ReadLong(0)
bbAddTriangle(surf,t1,t2,t3)
klappts wunderbar.
(In PB 4.1, also sind die "t"-vars longs)

Kann mir mal einer sagen, bei was für nem Phänomen es sich hierbei handelt?
Oder macht mir meine Krankheit gerade etwas zu schaffen und ich peil hier irgenden Basic nicht?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

das ist normal und wurde auch schon angesprochen

PB bearbeitet die Parameter von hinten:

Code: Alles auswählen

Procedure Gibt(Nummer)
 Debug Nummer
 ProcedureReturn Nummer
EndProcedure

Procedure Test(A,B,C)
EndProcedure

Test(Gibt(1),Gibt(2),Gibt(3))
deswegen NIEMALS ProcedurenReturns als Parameter übergeben deren Rückgarbe selber von ihrer Aufrufstelle abhängt
also keine Reads oder so ...

EDIT:

Hier das Thema dazu Umgekehrte Kompilierung von Parametern
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

:roll:
Toll, und ich dachte schon ich verdumme irgendwie...
Das ist echt übelst mies. Mein Tag ist hin.

Vielleicht sollte man in Zukunft beim Vorwärtsfahren einfach rückwärtsfahren, macht ja Sinn, ne? ;)
Little John

Beitrag von Little John »

Die Ursache ist, dass PureBasic die cdecl-Aufrufkonvention verwendet.

//edit2:
Stimmt wohl gar nicht ...

Gruß, Little John
Zuletzt geändert von Little John am 01.11.2008 10:52, insgesamt 1-mal geändert.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Lies doch einfach mal den Artikel, dessen Link Du gerade eben selbst gepostet hast :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Little John hat geschrieben:Die Ursache ist, dass PureBasic die cdecl-Aufrufkonvention verwendet. Das ist nichts Ungewöhnliches, sollte aber natürlich klar dokumentiert sein.

//edit:
Irgendwas verstehe ich da nicht ...
PB 4.20-Hilfe hat geschrieben:Für fortgeschrittene Programmierer ist ProcedureC verfügbar und wird die Prozedur mittels der 'CDecl' anstelle der 'StandardCall' Aufruf-Konvention deklarieren.
Aber im folgenden Code sehe ich keinen Unterschied zwischen Procedure und ProcedureC:

Code: Alles auswählen

Procedure Gibt(Nummer)
   Debug Nummer
   ProcedureReturn Nummer
EndProcedure

Procedure Test1(A,B,C)
EndProcedure

ProcedureC Test2(A,B,C)
EndProcedure

Test1(Gibt(1),Gibt(2),Gibt(3))
Debug "------"
Test2(Gibt(1),Gibt(2),Gibt(3))
Gruß, Little John
Standard bei PB ist ja auch nicht cdecl sondern stdcall. Die Parameter werden aber bei beiden von rechts nach links auf den Stack abgelegt - von daher gibts da nichts zu "sehen".
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Little John

Beitrag von Little John »

Ja sorry, da hatte ich was durcheinandergebracht.

Gruß, Little John
Antworten