AufrufConventionen

Fragen und Bugreports zur PureBasic 4.0-Beta.
kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

AufrufConventionen

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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())

kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

Beitrag 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.
kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@kaspar

welcome aboard,
und zur sicherheit eine frage:
nutzt du PB4.0 Vollversion?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

Beitrag von kaspar »

Hallo Gaman

Habe die Vollversion gekauft. Nutze aber gerade jaPBe, is ja auch gut.
Benutzeravatar
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

Beitrag von NicTheQuick »

jaPBe ist "just another PureBasic editor" und kein anderes PureBasic. Ändert
also nichts daran, dass es immer noch Purebasic 4.0 ist.
kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

Beitrag 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?
Benutzeravatar
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

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die standardübergabe von numerischen variablen erfolgt byVal.
für byRef-Übergabe musst du pointer bemühen, wie von NTQ beschrieben.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt