AufrufConventionen
AufrufConventionen
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
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
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())
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.
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.
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
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
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?
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?
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22