Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

wie setzt man Allegro/C-Befehl nach FreeBasic um ??????

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 06.03.2006, 22:36    Titel: wie setzt man Allegro/C-Befehl nach FreeBasic um ?????? Antworten mit Zitat

Hi Leute,

heut hab ich mal wieder ne Frage an euch. Mein Allegro-Fimmel hat sich bestimmt schon rumgesprochen. Eigentlich komm ich ja damit klar. Hm. Dachte ich mit den Augen rollen

Aber nun ist in der Allegro-Beschreibung doch ein Befehl aufgeführt, den ich nicht nach FreeBasic "übersetzt" kriege. Weil doch Allegro's Beschreibung davon ausgeht, man würde Allegro in C einbinden und nicht in Basic.

das DrumRum
Ich versuche die ganzen Tastaturtreiberbefehle zu testen und ein Stück weit zu dokumentieren. Das klappt ja auch gut.
Nur ist das mit Allegro (FreeBasic auch?) so, daß wenn der Endnutzer eines Programmes per Windows-Taste oder halt per Strg+Esc-Tasten auf den Desktop umschaltet, der Bildschirminhalt gelöscht wird. Klickt er sich nun in der Task-Leiste zum Freebasic+Allegro-Programm zurück ist alles schwarz.
Was da passiert weiß ich ja, und daß ich auch den Inhalt sichern und wieder Restaurieren kann ist auch klar.
Nur krieg ich im Programm einfach nicht mit, ob der User auf dem Desktop war. Somit müßte ich ständig über einen "doppelten" Screen arbeiten, das belastet dann die CPU/Grafikkarte.

das Problem selbst
nun hab ich Hoffnung, daß ich über einen noch nicht ausprobierten Befehl von Allegro "abhören" kann, ob der User die Tasten STRG+ESC gedrückt hat.
Dieser Befehl ist in Wirklichkeit eine Funktion, die auch in allegro.bi eingebunden/deffiniert ist. Somit steht sie in FreeBasic auch zur Verfügung.


Der Allegro-Hilfe-Text dazu:
extern int (*keyboard_callback)(int key);
If set, this function is called by the keyboard handler in response to every keypress. It is passed a copy of the value that is about to be added into the input buffer, and can either return this value unchanged, return zero to cause the key to be ignored, or return a modified value to change what readkey() will later return. This routine executes in an interrupt context, so it must be in locked memory.
Falls gesetzt, wird diese Function vom Tastaturtreiber bei jedem Tastenanschlag aufgerufen. Es wird eine Kopie des Wertes übergeben, der in den Tastaturpuffer zu schreiben ist. In der Funktion kann man diesen Wert entweder wie er ist oder aber verändert zurückgeben. ....


Ein Beispiel, jedoch in C:
Code:
      int enigma_scrambler(int key)
      {
         /* Add one to both the scancode and ascii values. */
         return (((key >> 8) + 1) << 8) | ((key & 0xff) + 1);
      }
      END_OF_FUNCTION(enigma_scrambler)
     
      ...
     
         install_timer();
         LOCK_FUNCTION(enigma_scrambler);
         install_keyboard();
         keyboard_callback = enigma_scrambler;


Kann mir nun jemand erklären, wie ich das nach FreeBasic umgesetzt kriege?

Bei Folgendem Versuch meckert FreeBasic beim kompilieren nicht, aber die Function wird aber auch nicht aufgerufen
Code:
FUNCTION mein_keyboard( Taste% ) AS INTEGER
   STATIC AlteTaste%, zaehler%
      zaehler%=zaehler%+1
      TastenNummer%=key%
      CALL TEXT_Zentriert(STR$(zaehler%)+" "+STR$(Taste%)+" "+STR$(TastenNummer%),4)
END FUNCTION
END_OF_FUNCTION(mein_keyboard%)

DIM SHARED TastenNummer%, Taste%(KEY_MAX)
LOCK_FUNCTION(mein_keyboard)


keyboard_callback = CPTR( ANY PTR, mein_keyboard( Taste% )

DO WHILE TastenNummer%<>27 AND TastenNummer%<>59
   IF Alte_TastenNummer% <> TastenNummer% THEN
      TEXT_Zentriert(STR$(TastenNummer%), 4)
      Alte_TastenNummer% = TastenNummer%
   END IF
LOOP


in der Allegro.bi wird das ganze so beschrieben:
'Extern Import keyboard_callback Alias "keyboard_callback" As Function cdecl(ByVal key As Integer) As Integer

Wenn ich anstelle von "taste%" mit "key" oder "key%" oder key(0) arbeite, wie das im Beispiel gemacht wird, dann hagelt es Fehler.

Hoffe, von euch weiß jemand Rat

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 07.03.2006, 01:09    Titel: Antworten mit Zitat

key ist ein reserviertes schlüsselwort von FB, das ist vermutlich alles..
vllt hilf dir http://freebasic.de/Referenz.php?zeig=tuts&col1=a0d5d0&ref=yes&show=NOKEYWORD
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 07.03.2006, 16:52    Titel: Antworten mit Zitat

Hallo Mister D, hallo Alle

Auch wenn schon allegro mit einem Array das key heißt daherkommt,
Code:
Extern Import key(0 to KEY_MAX-1) Alias "key" As Byte

hab ich versucht, mit:
Code:
option nokeyword key
in der allegro.bi das keyword von FreeBasic freizugeben.

Aber FreeBasic meckert dabei, scheint key gar nicht zu kennen:
Code:

allegro.bi(22) : error 14: Expected identifier, found: 'key'

     option nokeyword key
                      ^


Daran scheints nicht zu liegen.
Zumal beim bennenen von key als Paramieter im Aufruf von keyboard_callback beanstandet wird, daß key ein Array sei (dublicate deffinition) (expected '(' found ')' ).
Allegro hat ja ein Key(Array) deffiniert, mit dem man Tasten abfragen kann (nur dabei kommt Strg+Esc nicht an)

weiter grübelnd

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 08.03.2006, 00:18    Titel: Antworten mit Zitat

ich werd aus deinem text irgendwie nich schlau, bin vermutlich einfach bisschen müde aber wenns n array key gibt kannst du key nich als einfache variable auch noch benutzen außer in ner sub oder sowas wenn das array nicht global ist, aber ich denk ma das is dir auch klar. Wieso musst du das teil denn unbedingt key nennen? nimm doch halt einfach nen anderen namen oder geht das nich?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 08.03.2006, 15:53    Titel: Antworten mit Zitat

Hallo Mister D

richtig, Key ist ein Array, das hat Allegro so inszeniert. Soweit, so gut. Aus anderen Tests weiß ich, daß ich im Main als auch in SUBs und FUNCTIONs an Key() rankomme, also ist dieses Array auch global.

Daß ich rumprobiere, "key" für den Aufruf zu verwenden, liegt schlichtweg daran, daß ich das so im Allegro-Beispiel für C gesehen habe (siehe weiter oben) und nun denke, ich sollte dies in FreeBasic so machen.

Mittlerweile bin ich soweit, daß ich in der Function, welche ich an keyboard_callback übergeben soll, als Parameter "key" verwenden kann, ohne daß FreeBasic muckt.

Lt C-Beispiel soll ich dann im Main keyboard_callback=mein_keyboard schreiben, was so nicht läuft. Hatte danach dann probiert, den Pointer auf mein_keyboard zu übergeben, was nur akzeptiert wird, wenn ich das als C-Pointer übergebe (klingt ja auch plausibel):
keyboard_callback = CPTR( ANY PTR, mein_keyboard( Taste% )
Jedoch beendet sich das Programm dann nach jeglichem Tastendruck, anstatt die Befehle in MeineKeySub auszuführen und in die Warteschleife im Main zurückzukehren.

Danach hab ich dann auch im Aufruf versucht, nicht mit "=" zu agieren, sondern wie bei meinen anderen FUNCTIONs mit Klammern zu programmieren:
dummy%=keyboard_callback(mein_keyboard)
dabei weißt mich FreeBasic beim Compilieren darauf hin, daß ich parameter zu mein_keyboard anzugeben habe.
Mach ich nun:
dummy%=keyboard_callback( mein_keyboard(Taste%) )
beendet sich das Programm wieder bei jeglichem Tastendruck
und dann verzweifelnderweise mit
dummy%=keyboard_callback( mein_keyboard(key) )
meint FreeBasic, daß key ein Array sei, und als Parameter so hier nicht herpassen würde.

Genau gesagt, hab ich also überhaupt keinen Plan mehr, was ich noch probieren soll, damit Allegro bei jedem Tastendruck eine von mir erstellte SUB/FUNCTION aufruft.

haarerausreißend

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 09.03.2006, 00:23    Titel: Antworten mit Zitat

ja benutz doch einfach nich key sondern kih oder irgendwas?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 09.03.2006, 15:52    Titel: Antworten mit Zitat

key nicht zu benutzen ist ja das, was ich mit Taste% als übergabevariable gemacht habe. Das funzt nicht, die Sub wird bei Tastendruck dann nicht angesprungen. Der Ansatz von mir scheint komplett falsch zu sein mit den Augen rollen , aber keine Ahnung, wie ichs machen soll.Vielleicht stolpert irgend jemand aus der "C-Fraktion" hier mal rein, der mir sagen kann, wie ich das Beispiel aus C nach FreeBasic umsetzen kann.

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 12.03.2006, 19:20    Titel: Antworten mit Zitat

So, mein Problem hab ich über www.allegro.cc gelöst zwinkern

da es auch eine halbe Antwort auf den Post hier ist, schreibe ich die Lösung der Vollständigkeit halber hier rein:

1) mittels dieser Function, die bei Tastenanschlag aufgerufen werden sollte, ist es höchstwahrscheinlich NICHT möglich, die STRG+ESC-Kombination abzufragen, da diese Funktion auf der gleichen Basis läuft, wie die Key()-Array-Funktion für Tastaturabfragen. Und dort kommt ja STRG+ESC auch nicht als Tasteneingabe an. Windows hält sich selbst für den angesprochenen, gibt also keinem anderen Programm sowas weiter. Warum ich jedoch dabei die Windows-Taste selbst abfrage kann, bleibt dann ein Rätsel.
2) Allegro hat aber einen anderen Befehl, der eine selbstgeschriebene FB-Function jedesmal aufrufen läßt, wenn zwischen dem FreeBasic-Programm und dem Desktop hin- und hergesprungen wird:
set_display_switch_callback(wann, FuncPtr)
wann ist einer der beiden Ausdrücke: SWITCH_IN oder SWITCH_OUT
FuncPtr ist ein C-Pointer auf eine Function

mit nachfolgendem Beispiel wird unten im Bilschirm "aus Windows zurueck" hingeschrieben, wenn ich bei laufendem FB-Programm mit STRG+ESC auf den Desktop springe und dann zurück komme:
Code:
'Allegro.Bas    Grundgeruest um Allegro in Freebasic einzubinden
'---------------------------------------------------------------
'Initialisierungsbereich
'=======================
DECLARE FUNCTION ausWinZuruck%()
'$include: '..\..\inc\allegro.bi'
'
'Hauptteil
'=========
'Allegro init
IF (allegro_init() <> 0) THEN
   allegro_message("FEHLER: Allegro konnte nicht initialisiert werden!")
   GOTO Programmende
END IF
'GRAFIKMODUS SETZEN
set_color_depth(8)
IF (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) <> 0) THEN
   allegro_message("FEHLER: Grafik konnte nicht initialisiert werden!")
   GOTO AllegroEnde
END IF
'TastaturTreiber Starten
IF install_keyboard <> 0 THEN
   allegro_message("Tastaturtreiber-install fehlgeschlagen")
   GOTO Programmende
END IF
'Timer Starten
IF install_timer() < 0 THEN
   allegro_message("FEHLER: Timer konnte nicht initialisiert werden!")
   GOTO AllegroEnde
END IF
'Maus Starten
IF install_mouse() < 0 THEN
   allegro_message("FEHLER: Maus konnte nicht initialisiert werden!")
   GOTO AllegroEnde
END IF

'=========================================================
'MAIN
text_mode(1) 'Texthintergrund in Farbe 1 (-1 wäre transparent)
'=============================================================================
FUNCTION ausWinZuruck%()
      textout(screen, font, "aus Windows zurück", 10, 460, 4)
END FUNCTION
END_OF_FUNCTION(ausWinZuruck%%)
LOCK_FUNCTION(ausWinZuruck%%)

set_display_switch_callback( SWITCH_IN, CPTR( ANY PTR, PROCPTR(ausWinZuruck%) ) )

readkey()'because in this Test, the Keypress for coming Back from
readkey()'Win-Desktop is given to readkey, I ask here 5 times, so that
readkey()'the program allready stays waiting and shows what's happening
readkey()'Weil der Tastendruck für den Rücksprung vom Win-Desktop an readkey
readkey()'übergeben wird, hier mehrfache abfrage, daß Anzeige zu sehen ist!
'-----------------------------------------------------------------------------
AllegroEnde:
allegro_exit()
Programmende:
'=========================================================
'Unterprogramme
'==============


es sollte nun ein Leichtes sein, eine Kopie des Screeninhaltes parat zu haben, und das Zurückkopieren der Kopie auf den screen in obiger Funktion "ausWinZurueck%()" einzutragen. Dann sieht der User wieder, was das Programm vor Wegsprung zum Desktop angezeigt war.

Warum das bei meinen Versuchen mit der Function bei Tastenanschlag ausführen nicht geklappt hat, kann ich mir nur damit erklären, daß ich dort kein DECLARE FUNCTION drin hatte. Hier isses drin, hier gehts, ich such nicht weiter.

vielleicht hilfts jemandem

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz