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:

Parameterübergabe- ich raff's nicht...!

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 18.10.2007, 16:18    Titel: Parameterübergabe- ich raff's nicht...! Antworten mit Zitat

Wie schon gesagt, versuche ich, ein QuickBasic-Programmnach nach FreeBasic zu portieren. Warum bloß...Autsch!
Hier eine Funktionsdeklaration:
Code:

DECLARE FUNCTION Menuname (X As Integer, Y As Integer, Wort As String, COLV As Integer, COLH As Integer) As String


Das die dazugehörige Funktion:
Code:

FUNCTION Menuname (X, Y, Wort, COLV, COLH)
Dim Buchst As String
Wort = ""
X1 = X: Y1 = Y' Koordinaten sichern
DO
    LOCATE X, Y
    Buchst = CHR(SCREEN(X, Y))
    Y = Y - 1
LOOP UNTIL Buchst = " " OR Y = RL
Y = Y + 1
DO
    Y = Y + 1
    LOCATE X, Y
    Buchst = CHR(SCREEN(X, Y)) 'Wort lesen
    COLOR COLH, COLV
    PRINT Buchst
    FOR Warte = 1 TO 2000: NEXT Warte
    LOCATE X, Y
    COLOR COLV, COLH
        'DO: LOOP UNTIL LEN(INKEY$)
    PRINT Buchst ' Schrift blinkt kurz
    IF Buchst <> " " THEN Wort = Wort + Buchst
LOOP UNTIL Buchst = " "
'LOCATE 10, 30
'PRINT Wort
X = X1: Y = Y1'Koordinaten zurckgeben
Muname = Wort
END FUNCTION


Und so wird sie angewendet:
Code:
 DO
        Taste$ = INKEY$
    LOOP WHILE Taste$ = ""
    SELECT CASE Taste$
        CASE CHR$(0) + "K"
            IF Y > 1 THEN Y = Y - 1: 'nach links
        CASE CHR$(0) + "M"
            IF Y < 80 THEN Y = Y + 1: 'nach rechts
        CASE CHR$(0) + "H"
            IF X > 1 THEN X = X - 1: 'nach oben
        CASE CHR$(0) + "P"
            IF X < 23 THEN X = X + 1: 'nach unten
        CASE CHR$(13) 'Auswahl mit Return
            IF X = 2 AND Y > 1 THEN
'_____________________________________________________________________________
'______________                     Menuauswahl                   ____________
'_____________________________________________________________________________
            SELECT CASE Menuname (X, Y, Wort, COLV, COLH)
                CASE "Datei"
                    LOCATE 20, 20
                    PRINT Wort
                    CALL Dateimen (3, 2, 17, 20, Rahmen3, 4, 11)
                CASE "Bearbeiten"
                    LOCATE 20, 20
                    PRINT Wort
                    CALL Bearbmen (3, 9, 17, 28, Rahmen3, 4, 11)
 REM und so weiter...


Aber beim Kompilieren erhalte ich den Fehler
fbc hat Folgendes geschrieben:

FbTemp.bas(51) error 55: Type mismatch, at parameter 1 of MENUNAME()
SELECT CASE Menuname (X, Y, Wort, COLV, COLH)
........................................^

Was mache ich da falsch?

Kann passieren, daß ich noch häufiger sowas poste. In QuickBasic war alles sooo schön einfach... peinlich weinen missbilligen


Zuletzt bearbeitet von Elektronix am 18.10.2007, 16:22, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 18.10.2007, 16:21    Titel: Antworten mit Zitat

Hallo,

bei der eigentlichen Funktion musst du die Argumente natürlich genauso hinschreiben wie bei der anfänglichen Deklaration:

Code:
DECLARE FUNCTION Menuname (X AS INTEGER, Y AS INTEGER, Wort AS STRING, COLV AS INTEGER, COLH AS INTEGER) AS STRING

....

FUNCTION Menuname (X AS INTEGER, Y AS INTEGER, Wort AS STRING, COLV AS INTEGER, COLH AS INTEGER) AS STRING
'Hier der FUNCTION-Code
END FUNCTION


Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 18.10.2007, 17:00    Titel: Antworten mit Zitat

So, hab ich gemacht, hat aber irgendwie nichts gebracht. Gleicher Fehler an gleicher Stelle. missbilligen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 18.10.2007, 17:08    Titel: Antworten mit Zitat

Hast du mal versucht, die übergebenen Variablen vorher auch als INTEGER zu DIMmen?
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 18.10.2007, 17:23    Titel: Antworten mit Zitat

Ist zwar wohl nicht der Auslöser des Fehlers, ist mir aber aufgefallen:
X1 und X2 innerhalb der Funktion kennt er auch nicht, müssen auch geDIMt werden. Taste$ wird er auch nicht mögen, wegen des Suffix $.

Wenn die Funktion den Wert von Wort ändern soll, brauchst du davor ein BYREF.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 18.10.2007, 17:58    Titel: Antworten mit Zitat

ich hab mal ein wenig darum rumgebastelt, so sollte dieser Teil funktionieren (evtl. habe ich ein paar Variabeln zuviel dimensioniert(wenn diese vorher schon dimensioniert waren))

Code:
DECLARE FUNCTION Menuname (X AS INTEGER, Y AS INTEGER, Wort AS STRING, COLV AS INTEGER, COLH AS INTEGER) AS STRING
FUNCTION Menuname (X AS INTEGER, Y AS INTEGER, Wort AS STRING, COLV AS INTEGER, COLH AS INTEGER) AS String
   DIM AS String Buchst,muname
   Dim As Integer x1,y1,rl,warte
   Wort = ""
   X1 = X
   Y1 = Y' Koordinaten sichern
   DO
       LOCATE X, Y
       Buchst = CHR(SCREEN(X, Y))
       Y = Y - 1
   LOOP UNTIL Buchst = " " OR Y = RL
   Y = Y + 1
   DO
       Y = Y + 1
       LOCATE X, Y
       Buchst = CHR(SCREEN(X, Y)) 'Wort lesen
       COLOR COLH, COLV
       PRINT Buchst
       FOR Warte = 1 TO 2000: NEXT Warte
       LOCATE X, Y
       COLOR COLV, COLH
           'DO: LOOP UNTIL LEN(INKEY$)
       PRINT Buchst ' Schrift blinkt kurz
       IF Buchst <> " " THEN Wort = Wort + Buchst
   LOOP UNTIL Buchst = " "
   'LOCATE 10, 30
   'PRINT Wort
   X = X1: Y = Y1'Koordinaten zurckgeben
   Muname = Wort
END FUNCTION

Dim As String taste,wort
Dim As Integer x,y,colv,colh

DO
   Taste = InKey
LOOP WHILE Taste = ""
SELECT CASE Taste
   CASE CHR(0) + "K"
      IF Y > 1 THEN Y = Y - 1: 'nach links
   CASE CHR(0) + "M"
      IF Y < 80 THEN Y = Y + 1: 'nach rechts
   CASE CHR(0) + "H"
      IF X > 1 THEN X = X - 1: 'nach oben
   CASE CHR(0) + "P"
      IF X < 23 THEN X = X + 1: 'nach unten
   CASE CHR(13) 'Auswahl mit RETURN
      IF X = 2 AND Y > 1 THEN
'_____________________________________________________________________________
'______________                     Menuauswahl                   ____________
'_____________________________________________________________________________
         SELECT CASE Menuname(X, Y, Wort, COLV, COLH)
            CASE "Datei"
               LOCATE 20, 20
               PRINT Wort
               Dateimen (3, 2, 17, 20, Rahmen3, 4, 11)
            CASE "Bearbeiten"
               LOCATE 20, 20
               PRINT Wort
               Bearbmen (3, 9, 17, 28, Rahmen3, 4, 11)
         End Select
      End If
End Select
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 18.10.2007, 21:36    Titel: Antworten mit Zitat

Mein berühmter QB-Unterprogrammartikel zum Thema:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html

Ich nehme einmal an, dass in FreeBasic die bisherigen Syntaxen und Semantiken aus QB weiterhin existieren. Praktisch habe ich es dort noch nicht getestet, weiss aber nur, dass dort ein paar wirklich hübsche ;-) Erweiterungen gemacht wurden, d.h. exakt einige Dinge, die ich dort unter "Möglichkeitsgrenzen im Unterprogrammkonzept von QuickBASIC" erwähnt habe, sind in FreeBasic laut Befehlsreferenz nun möglich, z.B. ich könnte dort eine FUNCTION Schnittpunkt() schreiben, die das Ergebnis direkt als TYPE Punkt zurückliefert.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 19.10.2007, 10:23    Titel: Antworten mit Zitat

So, jetzt habe ich erstmal das Zielsystem von QB-Console auf Windows-Console umgestellt, das hat schon eine Menge Fehler gelöst... mit dem Kopf durch die Mauer wollen lachen

Nächste Frage: Wie frage ich die Pfeiltasten ab?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 19.10.2007, 10:48    Titel: Antworten mit Zitat

Ich werds mal versuchen....

Code:
#include "fbgfx.bi"
DIM AS INTEGER work_page, x, y
 'Bildschirmmodus 640x480x8 mit zwei Seiten initialisieren
SCREEN 18, ,2
COLOR 2, 15
work_page = 0
x = 320
y = 240
 DO
' Eine Seite beschreiben, während die andere angezeigt wird
SCREENSET work_page, work_page XOR 1
 ' Überprüfe die Pfeiltasten und aktualisiere die Koordinaten
' x, y entsprechend.
IF MULTIKEY(FB.SC_RIGHT) AND x < 639 THEN x += 1
IF MULTIKEY(FB.SC_LEFT) AND x >   0 THEN x -= 1
IF MULTIKEY(FB.SC_dOWN) AND y < 479 THEN y += 1
IF MULTIKEY(FB.SC_UP) AND y >   0 THEN y -= 1
CLS
CIRCLE(x, y), 30, , , , ,F
 ' Seite wechseln
work_page = work_page XOR 1
 LOOP UNTIL INKEY = CHR(27) ' Bis ESC gedrückt wird weitermachen
  ' Setze aktive und sichtbare Bildschirmseite wieder auf 0
SCREENSET
 PRINT "beliebige Taste drücken um zu beenden..."
GETKEY


Siehe auch: FB Referenz -> Multikey

Nachtrag: In der Referenz steht SC_LEFT (usw.), das stimmt alllerdings in den aktuellen Versionen nicht mehr. Jetzt ist es FB.SC_LEFT (usw.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 19.10.2007, 11:24    Titel: Antworten mit Zitat

Sollte gefixt sein. lächeln
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 19.10.2007, 15:22    Titel: Antworten mit Zitat

Das funktioniert nicht.
Also: ich möchte in meinem Menüsystem den Cursor mit den Pfeilen steuern (Maussteuerung kommt später dazu). In QB habe ich die Pfeile mit Inkey$ eingelesen und dann mit CHR$ den Ascii-Code überprüft. Bei Pfeil Links z. B.
Code:

Select Case Taste$
Case =CHR(0) + "K"

Aber in FB sind offenbar die Scancodes der Pfeiltasten anders, darum funktioniert das nicht. Außerdem wird im FB-Screen der Cursor nicht angezeigt oder ist nur so ein kleiner Strich. Er sollte aber ein gut erkennbares 8x8 oder 8x16-Rechteck oder von mir aus auch ein Zeichen (z. B. X oder O) sein.
Wie kann ich dafür die Pfeiltasten einlesen?


Zuletzt bearbeitet von Elektronix am 19.10.2007, 15:33, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 19.10.2007, 15:26    Titel: Antworten mit Zitat

Die Scancodes sind dieselben, nur statt chr$(0)+chr$(x) ist es jetzt chr$(255)+chr$(x).
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 19.10.2007, 15:35    Titel: Antworten mit Zitat

Ok, danke schon mal. Und wie mache ich den Cursor sichtbar?
Locate (X,Y,1) macht den Cursor nicht sichtbar (Hintergrund mit blau gefärbt)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 19.10.2007, 16:11    Titel: Antworten mit Zitat

Elektronix hat Folgendes geschrieben:
Das funktioniert nicht.


Und was genau funktioniert an meinem Beispiel nicht?

Bei mir (FB 0.18.2b + lang fb) funktioniert das Beispiel tadellos.
_________________
MfG Stuner
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 19.10.2007, 16:54    Titel: Antworten mit Zitat

Ich habe das Arbeitsfeld mit COLOR (a,b) eingefärbt. Der Cursor ist nicht sichtbar.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2007, 09:39    Titel: Antworten mit Zitat

Jetzt habe ich die FB0.18-b installiert, aber ich kann den Cursor immer noch nicht sehen, und offensichtlich reagiert er auch nicht auf die Pfeiltasten. Kann mir keiner helfen? missbilligen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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