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:

QB Code mit "Def Seg" unter FB Compilieren

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



Anmeldungsdatum: 28.06.2011
Beiträge: 10

BeitragVerfasst am: 04.11.2012, 13:27    Titel: QB Code mit "Def Seg" unter FB Compilieren Antworten mit Zitat

Hallo,
ich versuche einen QB Code unter FB zu Kompilieren um ein Dos Programm unter Win7 X64 zum laufen zu bringen, ohne auf den DOSBOX Emulator zuzugreifen. Leider Hab ich eine "Def Seg" Anweisung die vom Compiler nicht unterstützt wird; Kommentier ich die aus, startet das Programm zwar, stürtzt nur wieder ab (was ja vorrauszusehen war).

Meine Frage ist jetzt, wie kann ich die Def Seg Anweisung umgehen bzw. FB Kompatibel schreiben, sind meine ersten Versuche in FreeBasic. (-lang qb und so weiter hab ich durch, ist bei qb nur die def anweisung...)

Im Endeffekt soll das nur ein Nachgeschriebener Starfield Simulator Screensaver wie bei Win 3.xx sein. Momentan gehe ich halt den Umweg mit QB und dem Ausführen in der Dosbox, geht zur Not auch, wäre aber schöner das Komplett in FB zu Realisieren...

Jetzt wollt ihr wahrscheinlich meinen Quellcode haben... Aber den behalte ich noch nen moment für mich (zu faul für Strg+v...) lachen
_________________
"Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.11.2012, 14:10    Titel: Antworten mit Zitat

Das kommt ganz drauf an, was für eine DEF SEG-Anweisung das war. Dazu sollte man optimalerweise verstehen, was der Code tun sollte. Typische Anwendungsbeispiel waren bei QB z.B. das direkte Schreiben in den VGA-Grafikspeicher (DEF SEG = &HA000), wodurch dann mit PEEK und POKE direkt Pixelwerte gelesen und geschrieben werden konnten. Diese ganzen Anweisungen kann man mit FB-Bordmitteln (POINT und PSET) ersetzen. DEF SEG ist eine 16-Bit-Altlast, die so unter modernen 32-Bit-Systemen nicht existiert, deswegen kann man sie in FB nicht einfach nachbauen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Matrix



Anmeldungsdatum: 28.06.2011
Beiträge: 10

BeitragVerfasst am: 04.11.2012, 14:27    Titel: Antworten mit Zitat

Hallo,
dann war mein Codeverständnis doch ganz gut, sah für mich nämlich nach direkten schreiben in den VGA-Speicher aus.

Hier mal der Code:
Code:
       DECLARE SUB Init ()
        DECLARE SUB MoveStars ()
        DECLARE SUB NewStar (N!)

        COMMON SHARED Amount
       
        Amount = 256

        DIM SHARED StarsX(Amount, 1), StarsY(Amount, 1) AS SINGLE
        DIM SHARED SXA(Amount, 1), SYA(Amount, 1)
       
        DEF SEG = &HA000

       
        Init
       
        DO WHILE INKEY$ = ""
                MoveStars
        LOOP

        END

SUB Init
   SCREEN 13
   FOR X = 1 TO Amount: NewStar X: NEXT X
 
   FOR X = 1 TO 60: OUT &H3C8, X: OUT &H3C9, X + 10: OUT &H3C9, X + 10: OUT &H3C9, X + 10: NEXT X
END SUB

SUB MoveStars
        FOR X = 1 TO Amount
                POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), 0
                StarsX(X, 1) = StarsX(X, 1) - SXA(X, 1)
                StarsY(X, 1) = StarsY(X, 1) - SYA(X, 1)
                IF StarsX(X, 1) < 4 OR StarsX(X, 1) > 316 THEN NewStar X
                IF StarsY(X, 1) < 4 OR StarsY(X, 1) > 196 THEN NewStar X
                SXA(X, 1) = SXA(X, 1) + (SXA(X, 1) / 32)
                SYA(X, 1) = SYA(X, 1) + (SYA(X, 1) / 32)
               
                'For star shading, use this one:
                'POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (SXA(X, 1) * SXA(X, 1)) + (SYA(X, 1) * SYA(X, 1)) * 3
               
                POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (X AND 15) + 15
        NEXT X
        EXIT SUB
END SUB

SUB NewStar (N)
       
        SXA(N, 1) = (RND(1) * 2) - 1
        SYA(N, 1) = (RND(1) * 2) - 1
        StarsX(N, 1) = 160 - (SXA(N, 1) * 32)
        StarsY(N, 1) = 100 - (SYA(N, 1) * 32)

END SUB



Also sollte ich mir jetzt in der Referenz Point und PSET durchlesen, wie ich den Code dann anpassen muß ist mir aber bis jetzt noch nicht so ganz klar...
_________________
"Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.11.2012, 16:09    Titel: Antworten mit Zitat

Code:
   FOR X = 1 TO 60: OUT &H3C8, X: OUT &H3C9, X + 10: OUT &H3C9, X + 10: OUT &H3C9, X + 10: NEXT X

Wird zu
Code:

For X = 1 TO 60
  Dim As Integer c = (X + 10) * 255 / 63
  Palette X, c, c, c
Next

Bin mir nicht ganz sicher, ob es beim Originalcode einen Überlauf gegeben hätte, da hier RGB-Anteile >= 64 rauskamen - die werden entweder auf 63 zurechtgefixt oder abgeschnitten. Wird aber keinen großen Unterschied machen...

Code:
POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), 0

Wird zu
Code:

Pset(StarsX(X, 1), StarsY(X, 1)), 0


Code:
POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (X AND 15) + 15

Wird zu
Code:

Pset(StarsX(X, 1), StarsY(X, 1)), (X AND 15) + 15


Alles ungetestet, müsste so aber stimmen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Matrix



Anmeldungsdatum: 28.06.2011
Beiträge: 10

BeitragVerfasst am: 04.11.2012, 16:59    Titel: Antworten mit Zitat

Danke! Hab den Code abgeändert, nur nimmt der Compiler unter Lang QB "Dim as Integer" nicht, und unter Deprecated nimmt er den halben QB code nicht...

Die genaue Fehlermeldung:
Zitat:
FbTemp.bas(2cool error 134: Only valid in -lang fb or deprecated or fblite, found '='
Dim As Integer c = (X + 10) * 255 / 63


Bin Leider in Basic noch nicht fit, sonst wäre das mit Sicherheit einfach zu beheben, aber ich bin FB noch ganz frisch am Lernen, da meine bevorzugte Programmiersprache wohl noch Jahre für ein Update braucht (Stand Win XP...).

Hier der Geupdatete Code:
Code:
        DECLARE SUB Init ()
        DECLARE SUB MoveStars ()
        DECLARE SUB NewStar (N!)

        COMMON SHARED Amount
       
        Amount = 256

        DIM SHARED StarsX(Amount, 1), StarsY(Amount, 1) AS SINGLE
        DIM SHARED SXA(Amount, 1), SYA(Amount, 1)
       
        'DEF SEG = &HA000

       
        Init
       
        DO WHILE INKEY$ = ""
                MoveStars
        LOOP

        END

SUB Init
   SCREEN 13
   FOR X = 1 TO Amount: NewStar X: NEXT X
 
   For X = 1 TO 60
        Dim As Integer c = (X + 10) * 255 / 63
        Palette X, c, c, c
   Next
END SUB

SUB MoveStars
        FOR X = 1 TO Amount
                Pset(StarsX(X, 1), StarsY(X, 1)), 0
                StarsX(X, 1) = StarsX(X, 1) - SXA(X, 1)
                StarsY(X, 1) = StarsY(X, 1) - SYA(X, 1)
                IF StarsX(X, 1) < 4 OR StarsX(X, 1) > 316 THEN NewStar X
                IF StarsY(X, 1) < 4 OR StarsY(X, 1) > 196 THEN NewStar X
                SXA(X, 1) = SXA(X, 1) + (SXA(X, 1) / 32)
                SYA(X, 1) = SYA(X, 1) + (SYA(X, 1) / 32)
               
                'For star shading, use this one:
                'POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (SXA(X, 1) * SXA(X, 1)) + (SYA(X, 1) * SYA(X, 1)) * 3
               
                Pset(StarsX(X, 1), StarsY(X, 1)), (X AND 15) + 15
        NEXT X
        EXIT SUB
END SUB

SUB NewStar (N)
       
        SXA(N, 1) = (RND(1) * 2) - 1
        SYA(N, 1) = (RND(1) * 2) - 1
        StarsX(N, 1) = 160 - (SXA(N, 1) * 32)
        StarsY(N, 1) = 100 - (SYA(N, 1) * 32)

END SUB



Schonmal danke für die Hilfe bis jetzt!
_________________
"Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 04.11.2012, 17:02    Titel: Antworten mit Zitat

Zitat:
nur nimmt der Compiler unter Lang QB "Dim as Integer" nicht

Lässt sich leicht umgehen:
Code:
DIM c AS INTEGER
c = (X + 10) * 255 / 63

Das andere ist ein Shortcut dazu, der unter QB noch nicht existiert hat.


edit: kleine Übungsaufgabe (grinsen): Passe den Code (ist ja nicht lang) so an, dass er ohne -lang qb läuft. Das wichtigste ist dazu erst einmal, alle vorkommenden Variablen explizit zu deklarieren, bevor sie verwendet werden. Was ich so beim überfliegen gesehen habe, müsste das fast schon reichen.
_________________
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
Matrix



Anmeldungsdatum: 28.06.2011
Beiträge: 10

BeitragVerfasst am: 04.11.2012, 17:25    Titel: Antworten mit Zitat

Super, jetzt läufts. Sieht zwar jetzt lustig aus, im vergleich zur Dosbox, aber das wird schon. Werde jetzt erstmal meine Übungsaufgabe machen zwinkern und dann mich mit meinen nächsten Problem(n) melden... grinsen

PS: Ich hab noch ein anderes Projekt, was ich als Übung von Rapidbatch in Freebasic übersetze, die Gui steht schon zu 99%, ist aber mit firefly keine Kunst...
_________________
"Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 14.12.2012, 02:48    Titel: Antworten mit Zitat

Mach unter den Aufruf von MoveStars mal das hier:

Code:
__Sleep 10, 1


__Sleep ruft hier die FB-Version von Sleep auf, die im Gegensatz zur QB-Version Millisekunden statt ganzer Sekunden entgegennimmt.

Das Problem dass es "lustig aussieht" ist wohl, dass der Code viel schneller abläuft. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


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

BeitragVerfasst am: 14.12.2012, 12:10    Titel: Antworten mit Zitat

Da ich auf den meisten Rechnern noch eine MS-DOS 6.22-Partition habe: Müsste direkt einmal die DOS-Version von FreeBasic testen und dabei speziell darauf achten, wie weit all diese 16-bit-DOS-spezifischen Sachen dort noch vorhanden sind, denn von der Plattform her würde dort "-lang qb" noch am meisten Sinn machen.

Ist natürlich klar, dass die Portabilität verloren geht.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.12.2012, 12:29    Titel: Antworten mit Zitat

FB für DOS ist zu FB für alle anderen Systeme in dieser Hinsicht äquivalent (kann aber im Vergleich weniger, z.B. keine Threads). DEF SEG gibt es dort auch nicht, da FB Protected-Mode-Anwendungen erzeugt, die auf linear adressierten Speicher zugreifen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen 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