Seite 1 von 3

AufrufConventionen

Verfasst: 17.10.2006 07:05
von kaspar
Erstmal einen schönen Tag.
Bei der Suche nach einer effizienteren Programmierung bin ich auf PureBasic gestossen. Ich bin also kein Spielefreak - mich begeistert mehr die Technik.
Mein Problem ist nun :
- Bei der Anwendung der Aufrufconventionen in Zusammenhang mit einer GPIB-32.dll von NI (CallFunction, CallCFunction, CallFuntionFast usw. und der Anwendung von Prototypes) kam es zu merkwürdigen unterschiedlichen Reaktionen, die ich mir nicht erklären kann.
Das Problem war die Übergabe von Arrys(.l). Initialisierung der Arrays usw. wurde durchgeführt.

CallFunction(#Library,FunktionsName$,BrdNr.l,Addr.l(),result.l())

Diese Function funktionierte immer. Die"CallFunctionFast" functionierte auch, aber mit einer Fehlermeldung (Speicher). Die Anwendung von Prototypes war immer ein Schuss ins Nirwana. es wurden immer LinkedLists verlangt, die ich aber gar nicht gebrauchen konnte. Weiß einer was wie die Aufrufe Arrays übergeben oder ob ich das so verwenden kann
Alle Aufrufe ohne Arrays haben immer funktioniert.
Da NI einen GPIB-Bus Monitor mitliefert war die fehlerhafte Übergabe sehr gut zu kontrollieren Kaspar

Verfasst: 17.10.2006 13:28
von edel
Wenn du ein Array uebergeben moechtest (Prototype) schreib es in etwa so

Code: Alles auswählen

prototype Funktion0(array(1)) ; die zahl muss vohanden sein und gibt an wieviel dimensionen das array hat. Ohne die Zahl verlangt PB eine LinkedList.
prototype Funktion1(array(2)) ; 

[...]

f0.Funktion0 = getfunktion([...]) 
f1.Funktion1 = getfunktion([...])

dim array0(10)
dim array1(10,10)

f0(array0())
f1(array1())


Verfasst: 18.10.2006 06:16
von kaspar
Hallo edel,
komisch ist es aber schon, dass ein Aufruf mit Arrays ohne Dimensionsangabe functioniert. Praktisch sollte es immer mit diminsionsangabe sein, wie ich mich auch zwischenzeitlich belesen hab.
Na, ich werde es halt probieren. Recht herzlichen Dank.

Ein Rechner ist halt auch blos ein Mensch, denn er wurde von Menschen erschaffen.

Verfasst: 18.10.2006 07:41
von kaspar
Hallo edel,
habe es gleich ausprobiert. Keine Fehlermeldung mehr, aber die Übergabe der Parameter der Arrays funktioniert nicht richtig. Zum Vergleich habe ich die Funktion "CallFunction" benutzt und das Array wird richtig übergeben.

Ich kann die Werte sehr gut mit den Bus-Monitor kontrollieren.

Habe auch die möglichen "cdecl" Aufrufe probiert, geht nicht, da die DLL ein "stdcall" verlangt. Bin am Verzweifel, denn ich bin an den Prototypes interessiert, weil die quasi einen dynamischen Aufruf der DLL representieren

Verfasst: 18.10.2006 13:30
von Kaeru Gaman
@kaspar

welcome aboard,
und zur sicherheit eine frage:
nutzt du PB4.0 Vollversion?

Verfasst: 18.10.2006 13:47
von kaspar
Hallo Gaman

Habe die Vollversion gekauft. Nutze aber gerade jaPBe, is ja auch gut.

Verfasst: 18.10.2006 14:01
von NicTheQuick
jaPBe ist "just another PureBasic editor" und kein anderes PureBasic. Ändert
also nichts daran, dass es immer noch Purebasic 4.0 ist.

Verfasst: 18.10.2006 17:36
von kaspar
Stimmt schon, aber der Aufbau ist schon ein bischen anders. Und damit sind immer Abweichungen möglich. Die Feststellung hilft mir nicht. Dabei eine Frage. Kann mann Werte nur als RückgabeWert der Function machen? Habe mal versucht die Variablen in der Klammer zur Rückgabe zu bewegen.
Ich meinte, wenn es in den anderen Sprachen geht auch in PureBasic gehen müsste, oder habe ich da was übersehen. Muss ich da die Pointer bemühen?

Verfasst: 18.10.2006 17:38
von NicTheQuick
Jep, da musst du Pointer bemühen:

Code: Alles auswählen

Procedure blubb(*a.Long, *b.Long, *c.Long)
  *a\l = 1
  *b\l = 3
  *c\l = 5
  ProcedureReturn 7
EndProcedure

Define a.l, b.l, c.l, d.l

d = blubb(@a, @b, @c)

Debug a
Debug b
Debug c
Debug d

Verfasst: 18.10.2006 17:42
von Kaeru Gaman
die standardübergabe von numerischen variablen erfolgt byVal.
für byRef-Übergabe musst du pointer bemühen, wie von NTQ beschrieben.