Notation dll Deklaration

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Notation dll Deklaration

Beitrag von H.Brill »

Probiers zuerst mal so :

Code: Alles auswählen

#Library = 0
Prototype pDoGetInfraCode(Array.l, Diagrammlength.l)
OpenLibrary(#Library, "Deinedll")
Global DoGetInfraCode.pDoGetInfraCode = GetFunction(#Library, "DoGetInfraCode") 
Global ret.l
Dim bArray.b(4) ;wenn es z.B. 4 Werte sein sollen
; Array mit Werten füllen
ret = DoGetInfraCode(@bArray(), 4)
...
CloseLibrary(#Library)
Mit den Prototypes hast du den Vorteil der Parameter-
überprüfung.
PB 6.10
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Notation dll Deklaration

Beitrag von Kaeru Gaman »

wenn du einen pointer als integer angeben willst, dann muss das ein .i sein.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Notation dll Deklaration

Beitrag von six1 »

Die dll läuft. Ich habe es über Prototypen deklariert.

Code: Alles auswählen

Prototype  DoGetInfraCode (*TimeCodeDiagram.b, DiagramLength.l); As integer;
If AVR309_DLL
   Global DoGetInfraCode.DoGetInfraCode = GetFunction(AVR309_DLL, "DoGetInfraCode") ; (byval *TimeCodeDiagram.b, DiagramLength.l) as integer;
endif
Die Ansteuerung des Mega8 läuft bereits in Teilen... ich kämpfe mit den sogennanten "Gadgets" die sonstwo "Components" heißen :twisted:

...und einen "Timer" suche ich immer noch :praise:

@H.Brill: ja, so habe ich es umgesetzt. Funktioniert einwandfrei

@Kaeru Gaman: jo, .b, .i, .l ... hab ich auf der Pfanne :-) so ein paar Sachen kann ich mir denken (manchmal klappt's) :)
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Notation dll Deklaration

Beitrag von H.Brill »

Ab PB-Version 4.40 gibt es ja auch einen
WindowTimer. Ist nur noch nicht in der
Hilfe dokumentiert, nur in den Beispielcodes.
Hier ein Beispielcode :

Code: Alles auswählen

#Window = 0
#Editor = 0

Global text.s, i.l

text = "Ich schreibe 10 mal jede Sekunde diesen Text !"

Enumeration
  #Timer1
EndEnumeration

var = 1000  ; ms

If OpenWindow(#Window, 0, 0, 400, 200, "Timer example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   EditorGadget(#Editor, 10, 10, 240, 150,#PB_Editor_ReadOnly)

   AddWindowTimer(#Window, #Timer1, var)
   i = 1
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Timer
      Select EventTimer()
     
        Case #Timer1
            AddGadgetItem(#Editor, i, text) 
            If i > 10
               RemoveWindowTimer(#Window, #Timer1)
               Break
            EndIf
            i = i + 1 
      EndSelect           
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf


PB 6.10
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Notation dll Deklaration

Beitrag von Kaeru Gaman »

einen nativen Timer gibts erst ab 4.4, die ist noch in der Beta.

für 4.3 kannst du das mit nem Callback lösen
http://www.purebasic.fr/german/viewtopi ... 561#109561

und btw... ich hatte mich ein Stück weit vertan... es muss
*TimeCodeDiagram.Byte
heißen.
Der Unterschied besteht zwischen Type und Structure.
über einen Stukturierten Pointer kann man dann die Elemente direkt ansprechen.
... aber ob das überhaupt so in die Deklaration der Funktion reingehört, weiß ich nicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Notation dll Deklaration

Beitrag von six1 »

Ehyy man, ich habe nur die 4.31 :D

kann ich die 4.4 irgendwo downloaden... schon?
Der Windows TimerEvent ist EXAKT!!! das was ich brauche!

EDIT: jaja, wer lesen kann ist klar im Vorteil und die lustigen Kringel sind die Buchstaben! :mrgreen: im Download sind die Beta's ja...

Wie habt ihr das die ganze Zeit gemacht, wenn ihr mal was pollen müsst??? :shock:

DANKE!!! sieht schon ganz gut aus. Ich teste gerade den seriellen Datenverkehr. Die Serielle kann man übrigens über die Funktionen auf 1Bd genau einstellen! (es geht also auch 2431 Bd) :mrgreen:
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Notation dll Deklaration

Beitrag von six1 »

So, jetzt kracht es :mrgreen: ...immer wieder schön!

Code: Alles auswählen

#NO_ERROR = 0
Global PORTA.b, PORTB.b, PORTC.b, UsedPorts.b
...
Prototype  pDoGetInDataPorts ( DataInByteB.b, DataInByteC.b, DataInByteD.b, UsedPorts.b); As integer;
Global DoGetInDataPorts.pDoGetInDataPorts = GetFunction(AVR309_DLL, "DoGetInDataPorts") ; ( DataInByteB.b, DataInByteC.b, DataInByteD.b, UsedPorts.b) as integer;
...
              Case #Poll_Timer
--> kracht   If DoGetInDataPorts(PORTA, PORTB, PORTC, UsedPorts)   = NO_ERROR 
                      SetGadgetText(#State_Text_1, "Device connected!"); 
                  Else
                      SetGadgetText(#State_Text_1, "Device not connected!"); 
                  EndIf
...
irgendwie kann der dll Aufruf die Variablen PORTA, PORTB, PORTC, UsedPorts nicht beschreiben, scheint mir...

Code: Alles auswählen

Fehlermeldung: [ERROR]Invalid memory access. (write error at address 1)
Gleicher Aufruf über Delphi geht. Die dll verursacht also den Fehler nicht.
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Notation dll Deklaration

Beitrag von ts-soft »

Erwartet die DLL die Byte ByRef oder ByVal? Kannste also mit @PORTA oder Du definierst den Parameter als .i (Integer), eins von beiden sollte gehen.

Gruß
Thomas
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Notation dll Deklaration

Beitrag von six1 »

:bounce:

Thx!

Das "@" war es... ich muss mich an die Struktur erst gewöhnen :mrgreen:

Timer Event läuft gut, wenn man den Atmel an den USB Port steckt, wir er sofort als "Device connected" erkannt!
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Notation dll Deklaration

Beitrag von H.Brill »

Läuft ja wohl über eine virtuelle
ser. Schnittstelle. Sendet der
Atmel kontinuierlich Daten ?
Dann muß man den serial Port
zumindest pollen, damit keine Daten
verloren gehen. Schau mal bei :
AvailableSerialPortInput(#SerialPort)
PB 6.10
Antworten