Seite 1 von 1

W-T-F ?

Verfasst: 01.11.2008 00:17
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?

Verfasst: 01.11.2008 00:23
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

Verfasst: 01.11.2008 00:30
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? ;)

Verfasst: 01.11.2008 10:18
von Little John
Die Ursache ist, dass PureBasic die cdecl-Aufrufkonvention verwendet.

//edit2:
Stimmt wohl gar nicht ...

Gruß, Little John

Verfasst: 01.11.2008 10:43
von ZeHa
Lies doch einfach mal den Artikel, dessen Link Du gerade eben selbst gepostet hast :mrgreen:

Verfasst: 01.11.2008 10:43
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".

Verfasst: 01.11.2008 10:52
von Little John
Ja sorry, da hatte ich was durcheinandergebracht.

Gruß, Little John