Array Pointer?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

#Reaper

Newsposter

Betreff: Array Pointer?

BeitragSa, Dez 22, 2007 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

hab in dieser Richtung leider kaum erfahrung, und weiß einfach nicht, wie ich es richtig machen muss.
Ich versuche die Funktion GetKeyboardState aus der Win32-Lib zu includen.

Mein Ansatz
Code: [AUSKLAPPEN]
Extern "Win32"
   Function GetKeyboardState:Byte(lpKeyState:Byte Ptr)
End Extern

Ich bin sehr davon überzeugt, das sogar das schon falsch ist. Wink
Wie ich dann das Array der Funktion übergeben muss, weiß ich leider auch nicht genau. Habe schon mehreres Versucht, aber noch keine Rückgaben erlangt Sad
Habe mir zwar schon das Tutorial zu Pointern hier durchgelesen, hat mir da aber auch noch nicht so sehr geholfen Sad

Würde mich über Antworten freuen, danke Wink

MfG
#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Jolinah

BeitragSa, Dez 22, 2007 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Die Definition ist richtig, hier mal ein Beispiel wie man die Funktion in BlitzMax aufrufen kann:

Code: [AUSKLAPPEN]
SuperStrict

Extern "Win32"
   Function GetKeyboardState:Byte(lpKeyState:Byte Ptr)
End Extern

Graphics 800, 600, 0

'Neues Array erstellen, in dieses werden die Werte übertragen
Local Keys:Byte[] = New Byte[256]
GetKeyboardState(Keys)

'Variable zum Beenden des Programms
Local quit:Int = 0

'Hauptschleife
While quit = 0
   Cls

   'Tastaturstatus abfragen und die Werte in das Array Keys schreiben
   '(Keys ohne Indexierung ist im Grunde ein Byte Ptr,
   'deshalb muss hier gar nichts konvertiert werden)
   GetKeyboardState(Keys)

   'Alle Tasten im Keys-Array durchgehen
   For Local key:Int = 0 To 255
      'Prüfen ob eine Taste gedrückt wurde
      '(Laut msdn ist in dem Fall das höchste Bit 1,
      'daher auf 128 (Binär 1000 0000) prüfen)
      If Keys[key] & 128 Then quit = 1
   Next
   
   If KeyHit(KEY_ESCAPE) Then quit = 1
   
   Flip
Wend


EndGraphics
End


Allerdings scheint es nur zu funktionieren wenn gleichzeitig auch noch eine KeyHit-Abfrage von BMax im Programm ist. Ohne die KeyHit-Zeile funktioniert es bei mir nicht richtig.
 

Dreamora

BeitragSa, Dez 22, 2007 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Macht auch keinen Sinn denn das BM fenster fängt genau diese Daten bereits ab und speichert sie in einen internen Array.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

#Reaper

Newsposter

BeitragSa, Dez 22, 2007 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte eigentlich komplett ohne Graphics funktionieren.
Wenn man schon Tasten drückt, bevor man das Progg startet, funktioniert es. Aber die Keys bleiben dauerhaft im Array als gedrückt. :-/

Stimmt doch was mit dem Pointer nicht?

Danke schonmal für eure Hilfe! Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BladeRunner

Moderator

BeitragSa, Dez 22, 2007 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon versucht das array vor auslesen zu leeren ?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

#Reaper

Newsposter

BeitragSa, Dez 22, 2007 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das genau, mit leeren? Hab mit einer Schleife alles immer auf 0 setzten lassen, und habe es mal in eine locale Variable in einer Funktion schreiben lassen, und dann in eine Globale geschrieben. Hat aber auch nichts gebracht.
Seltsammerweise liefert die Funktion nur einmal ein richtige Rückgabe, und zwar wenn man vor dem Programmstart bereits eine Taste drückt. Danach bleibt die Taste aber angeblich als gedrückt im Array, bzw. setzt die Funktion scheinbar immer wieder das Selbe in das Array zurück (was ja längst nicht mehr stimmt) :-/

Ein wenig unordentlicher Code:
Code: [AUSKLAPPEN]
SuperStrict

Extern "Win32"
   Function GetKeyboardState:Byte(lpKeyState:Byte Ptr)
End Extern

'Graphics 800, 600, 0

'Neues Array erstellen, in dieses werden die Werte übertragen
Global Keys:Byte[256]' = New Byte[256]
'Print GetKeyboardState(Keys)

'Variable zum Beenden des Programms
Local quit:Int = 0

'Hauptschleife
While quit = 0
   'Cls

   'Tastaturstatus abfragen und die Werte in das Array Keys schreiben
   '(Keys ohne Indexierung ist im Grunde ein Byte Ptr,
   'deshalb muss hier gar nichts konvertiert werden)
   getkey()

   'Alle Tasten im Keys-Array durchgehen
   For Local key:Int = 0 To 255
      'Prüfen ob eine Taste gedrückt wurde
      '(Laut msdn ist in dem Fall das höchste Bit 1,
      'daher auf 128 (Binär 1000 0000) prüfen)
      If Keys[key] & 128 Then
      'quit = 1
      Print "!   "+key
     EndIf
      
   Next
   Delay 10
   
   'If KeyHit(KEY_ESCAPE) Then quit = 1
   
   'Flip

   For Local i:Int=0 To 255
      Keys[i]=0
   Next
Wend


'EndGraphics
End



Function getkey()
   Local lKeys:Byte[256]' = New Byte[256]
   If GetKeyboardState(lKeys)=0 Then Print "GetKeyboardState-Error"
   Keys = lKeys[..]
End Function
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group