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:

Programm aus Programm aufrufen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 10.09.2014, 19:34    Titel: Programm aus Programm aufrufen Antworten mit Zitat

Hi Gemeinde!


ich wollte man nachfragen, ob ich bzw. wie ich sinniger Weise ein Programm von einem Programm aus aufrufe.
Ich möchte mit dem Aufruf Parameter übergeben und Ergebnisse zurück erhalten.
Genauer: Programm B besteht aus einer festen Eingabe, einer Rechen- und Ausgabeschleife in eine Datei. Ich möchte nun dieses Programm von Programm A aus derart steuern, dass ich zB erreiche, dass das Prog B eine oder auch mehrere Progdurchläufe unternimmt und mir die Daten übergibt, also ich bestimme wo und wie die gespeichert werden.

Wie macht man das denn?

grüsse aus der Gewitterstadt nils
_________________
Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 10.09.2014, 22:56    Titel: Antworten mit Zitat

Hallo Nils

Der Befehl, den du suchst, heißt "Chain". Eine direkte Parameterübergabe ist, anders als bei FB (dort gibt es dafür den Befehl "Command"), bei QBasic allerdings nicht möglich. Hier müsstest du zum Informationsaustausch den Umweg über eine Datei wählen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

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

Hallo,

vielleicht wäre es sinnvoll, beide Programme in eins zusammenzulegen und mit SUBs und FUNCTIONs (Unterprogrammen) zu arbeiten. FUNCTIONs können auch Werte zurückgeben.

Wenn tatsächlich mehrere compilierte Programme zusammenarbeiten sollen, könnten COMMAND und OPEN PIPE interessante Schlüsselwörter sein.

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | 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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 11.09.2014, 10:09    Titel: Antworten mit Zitat

OPEN PIPE gibts meines Wissens nach in QB nicht.

Es kommt darauf an was das für ein Programm ist, mit dem du kommunizieren willst und in welcher Form du es vorliegen hast.

Wenn du beispielsweise ein 16-Bit DOS Programm in kompilierter Form (.exe) hast würde es durchaus Sinn machen QB zu verwenden.

In allen anderen Fällen würde ich davon abraten bzw. manche Kombinationen sind mit QB erst gar nicht möglich.
Bei 32-Bit oder 64-Bit Windows/Linux Programmen in kompilierter Form kannst du z.B. OPEN PIPE in FreeBasic verwenden. FB unterstützt jedoch bidirektionale Pipes nicht von Haus aus - wenn du sowas brauchst müsstest du auf die entsprechenden APIs des jeweiligen Betriebssystems zurückgreifen.

Wenn du den Quellcode vorliegen hast ist eine direkte Integration in dein Programm via Unterprogramme/Module wohl am einfachsten, wie von Sebastian bereits genannt.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 11.09.2014, 11:04    Titel: Antworten mit Zitat

@ alle:

Danke für Eure Antworten!

Programm B ist ein QB Prog.

Mir kam der "Fernsteuergedanke", weil ich nicht gerne in einem gut funktionierenden Programm rumfummle. Außerdem könnte man es sozusagen "taub schalten" und nur über Prog A nutzen.

Schade, dass es da keine Hilfe für mich gibt.

nils (nach dem regen ist vor dem regen)
_________________
Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Jojo
alter Rang


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

BeitragVerfasst am: 11.09.2014, 13:52    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Hallo Nils

Der Befehl, den du suchst, heißt "Chain". Eine direkte Parameterübergabe ist, anders als bei FB (dort gibt es dafür den Befehl "Command"), bei QBasic allerdings nicht möglich. Hier müsstest du zum Informationsaustausch den Umweg über eine Datei wählen.

Gruß
grindstone


Hmm, das ist jetzt schon bald 10 Jahre her, aber ich habe irgendwie in Erinnerung, dass es da einen Unterschied zwischen CHAIN und RUN gab, und man die globalen Variablen des einen Programms noch im anderen sehen konnte, solange man den QB-Interpreter nutzte. Ist natürlich nicht wirklich nützlich weil's nur interpretiert funktioniert. Erinnere ich mich da falsch?
_________________
» 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
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 11.09.2014, 15:26    Titel: SUBs und FUNCTIONs Antworten mit Zitat

St_W hat Folgendes geschrieben:
OPEN PIPE gibts meines Wissens nach in QB nicht.

Ja, klar, OPEN PIPE ist neu in FreeBASIC. Ich hab nicht auf die Rubrik geachtet. In QB bleibt einem eigentlich nur der Umweg über externe Dateien.

Nils hat Folgendes geschrieben:
Mir kam der "Fernsteuergedanke", weil ich nicht gerne in einem gut funktionierenden Programm rumfummle.

Normalerweise realisiert man das, indem man Unterprogramme schreibt. Die sollten nur ihre Parameter verarbeiten und am Ende ein Ergebnis irgendeines Typs liefern. Das Programm drumherum sollte normalerweise keine Auswirkungen auf das innere Funktionieren der Unterprogramme haben. Man macht sich diesen Vorteil natürlich kaputt, wenn man Daten mit SHARED oder COMMON "kreuz und quer" durch alle Ebenen des Programms wurstelt.

Bei Unterprogrammen ist es typischerweise so, dass der Aufrufer nur die Schnittstelle des Unterprogramms, seine Signatur, kennen muss, um es zu benutzen. Wie es intern funktioniert, braucht den Aufrufer nicht zu interessieren. Das "Innenleben" des Unterprogramms kann jederzeit geändert werden, ohne dass dies Auswirkungen auf das umgebende Programm hat, wenn weiterhin die definierten Vor- und Nachbedingungen erfüllt werden.

Unterprogramme haben viele Vorteile:

  • Erstellen eigener "Befehle": Codes, die mehrfach in einem Programm gebraucht werden, können mit einem einzigen "Wort" aufgerufen werden, ähnlich wie SLEEP oder BEEP, und müssen nicht mehrfach geschrieben werden.
  • Dadurch Vermeidung von Redundanzen ...
  • und verbesserte Wartbarkeit des Programms. Ich muss meine Berechnung nur an einer Stelle zentral im Programm ändern, um alle Vorkommen davon abzudecken. Ich muss nicht an x Stellen im Programm suchen, wo überall eine bestimmte Berechnung (Fläche eines Kreises oder irgendwas) vorkommt
  • Wiederverwendbarkeit: Ein Unterprogramm mit einem bestimmten Zweck (Liste der Dateien in einem Verzeichnis ermitteln, Oberfläche einer Kugel anhand ihres Radius berechnen, ...) lässt sich nicht nur in diesem Programm benutzen, sondern auch später in anderen Programmen "recyclen".
  • Flexibilität: Ein Unterprogramm kann später leicht ausgetauscht / überarbeitet werden, ohne dass man das ganze Programm neu schreiben muss.


Hier mal ein Beispiel (FreeBASIC; das Prinzip ist auch auf QB übertragbar, auch dort gibt es SUBs und FUNCTIONs) zum Austausch des "Innenlebens" einer FUNCTION, ohne dass das Hauptprogramm dadurch betroffen ist:
Code:
' FreeBASIC-Code
' Anm.: Das Berechnungsbeispiel ist nicht sehr sinnvoll. Es soll lediglich einen
'       Eindruck Richtung Geheimnisprinzip / Abstraktion liefern.

' Multipliziert 2 positive Ganzzahlen und gibt das Ergebnis als Integer zurueck.
' Wird mind. 1 negative Zahl uebergeben, wird immer der Fehlerwert -1 zurueckgeliefert.
Declare Function MultiplizierPositiveZahlen (A As Integer, B As Integer) As Integer

Dim As Integer x, y, ergebnis

Input "x = ", x
Input "y = ", y

ergebnis = MultiplizierPositiveZahlen (x, y)

Print "x * y = "; ergebnis

Sleep
End


Function MultiplizierPositiveZahlen (A As Integer, B As Integer) As Integer
    If ((A = 0) Or (B = 0)) Then Return 0
    If ((A < 0) Or (B < 0)) Then
        Print "OMG, das kann ich nicht berechnen!"
        Return -1
    End If
    Dim As Integer zaehler, summe=0
    For zaehler = 1 To A
        summe = summe + B
    Next zaehler
    Return summe
End Function

' Jetzt bemerken wir, dass die Function, so wie wir sie implementiert haben,
' eigentlich nicht optimal ist. Wir schreiben das Innenleben neu:

'Function MultiplizierPositiveZahlen (A As Integer, B As Integer) As Integer
'    If ((A < 0) Or (B < 0)) Then
'        Print "OMG, das kann ich nicht berechnen!"
'        Return -1
'    End If
'    Return A*B
'End Function

' Fuer das Hauptprogramm aendert sich gar nichts. Die Function tut weiterhin
' das gleiche, auch wenn sie intern jetzt anders aussieht.


Statt irgendwelche EXE-Dateien über temporäre Dateien miteinander zusammenzuflicken, sollte man lieber Unterprogramme mit abgegrenztem Aufgabengebiet schreiben. Dann kann man ein Unterprogramm leicht überarbeiten, ohne dass dies negative Seiteneffekte auf das restliche Programm hat.
_________________

Der Markt regelt das! | 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 11.09.2014, 21:59    Titel: Antworten mit Zitat

Ich habe mein altes QBasic noch einmal ausgegraben und es ausprobiert: Die Inhalte von Variablen bleiben bei CHAIN erhalten, wenn diese (in beiden Modulen) mit COMMON deklariert wurden. Bei RUN wird alles gelöscht.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 11.09.2014, 22:49, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 11.09.2014, 22:48    Titel: COMMON Antworten mit Zitat

Hast du COMMON ausprobiert?
Code:
COMMON SHARED MeineVariable%

_________________

Der Markt regelt das! | 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 11.09.2014, 22:53    Titel: Antworten mit Zitat

@Sebastian:
Entschuldigung, ich habe die erste Fassung etwas voreilig abgeschickt (ist halt schon eine Weile her, seit ich mit QBasic gearbeitet habe). peinlich

So, wie es jetzt dort steht, ist es richtig.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 12.09.2014, 13:53    Titel: Antworten mit Zitat

@ alle: Danke für Eure Mühe!
@ sebastian: Insbesondere für Dein Programmbeispiel!

Also ich muß Euch mal was beichten:
Ich hab noch nie mit subs oder functions gearbeitet! Ich arbeite meistens mit gosub und wenn ich bedingt wo hinspringen will mit goto mit einer Sprungmarke, die ich definiert habe. Mir ist klar, dass das seine Vorteile hat, was Ihr da sagt, aber ich hab' das noch nie gemacht!

Also "chain" ist der Befehl meiner Wahl?! Da hab' ich ein paar Fragen:

- kann ich an einer beliebiger Stelle des aufzurufenden Programms selbiges starten? Und wie mach' ich das?

- wie übergebe ich Variableninhalte?

- und wie krieg' ich die zurück?

- muß ich dann das ganze aufgerufene Prog ausführen?

- merkt sich das aufgrufene Prog, dass es von Außen aufgerufen wurde? Kann ich also zB sagen: Wenn ich von außen aufgrufen worden bin, dann ende an dieser Stelle?


grüsse Nils (ich seh' schon, ich bin fast der Letzte der QB-Fragen hier stellt!)
_________________
Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 12.09.2014, 16:01    Titel: Antworten mit Zitat

CHAIN ist ein wirklich altes Relict aus alten QuickBasic Zeiten, um mehr als ein 64 KByte Code + zwei 64KByte Datensegmente nutzen zu können. Dafür werden alle gemeinsam genutzten Variablen mit COMMON bzw. "COMMON SHARED" definiert. Das funktioniert aber nur zwischen 2 QB Programmen.

Viel flexibler ist der Einsatz von Aufrufparametern. Guck dir COMMAND an.
Wenn du viele Werte übergeben willst, dann übergibst du den Pfad zu einer Datei mit den Daten. Die muss dann entspechend eingelesen werden.

Z.b. könnte dein Steuerungsprogramm das in QB geschriebene Programm mit Parametern aufrufen. Das ginge sogar mit einem QB Programm was in einer DOSOX gestartet wird, womit es dann auch auf 64bit Systemen liefe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 12.09.2014, 18:39    Titel: Antworten mit Zitat

Den Befehl COMMAND gibt es in QBasic nicht.

Nils hat Folgendes geschrieben:
- kann ich an einer beliebiger Stelle des aufzurufenden Programms selbiges starten? Und wie mach' ich das?
Du kannst in übergebenen Variablen alle Arten von Informationen transportieren.
Programm A:
Code:
COMMON sprungmarke$
PRINT "Sprungmarke w„hlen (1-3)"
DO
     g$ = INKEY$
LOOP WHILE g$ = ""
SELECT CASE g$
     CASE "1"
          sprungmarke$ = "marke1"
     CASE "2"
          sprungmarke$ = "marke2"
     CASE "3"
          sprungmarke$ = "marke3"
END SELECT
CHAIN "c:\prog_b.bas"

Programm B:
Code:
COMMON sprungmarke$
SELECT CASE sprungmarke$
     CASE "marke1"
          GOTO marke1
     CASE "marke2"
          GOTO marke2
     CASE "marke3"
          GOTO marke3
END SELECT

marke1:
PRINT "Abschnitt1"
CHAIN "c:\prog_a.bas"

marke2:
PRINT "Abschnitt2"
CHAIN "c:\prog_a.bas"

marke3:
PRINT "Abschnitt3"
CHAIN "c:\prog_a.bas"
Zitat:
- wie übergebe ich Variableninhalte?
Mit COMMON <Variable>, siehe oben.
Zitat:
- und wie krieg' ich die zurück?
Ebenfalls mit COMMON <Variable>
Zitat:
- muß ich dann das ganze aufgerufene Prog ausführen?
Nein, siehe Beispiel
Zitat:
- merkt sich das aufgrufene Prog, dass es von Außen aufgerufen wurde? Kann ich also zB sagen: Wenn ich von außen aufgrufen worden bin, dann ende an dieser Stelle?
Auch diese Information kannst du in einer (anderen) COMMON - Variable übergeben und entsprechend auswerten.

Aber wenn das alles sowieso neu für dich ist und du es erst lernen mußt, solltest du wirklich die Gelegenheit nutzen und jetzt auf FB umsteigen. Das Portieren der alten QB-Programme ist wirklich kein Hexenwerk, nur ein bisschen Fleißarbeit.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 12.09.2014, 19:01    Titel: Antworten mit Zitat

Klar gibt es auch in QB auch eine command$ function.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 12.09.2014, 19:13    Titel: Antworten mit Zitat

Zu COMMON sprungmarke$ - QB müsste doch auch ein ON sprungmarkte GOTO ... kennen?
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 12.09.2014, 19:24    Titel: Antworten mit Zitat

@RockTheSchock:
Du meinst wahrscheinlich QuickBasic. Ich habe es zur Sicherheit noch einmal ausprobiert: Wenn ich versuche, von der Konsole aus ein QBasic-Programm zu starten, das die Zeile
Code:
PRINT COMMAND$
enthält, bekomme ich die Fehlermeldung "Erweiterte Funktionen nicht verfügbar".

@nemored:
Stimmt. Allerdings steht in der Hilfe auch der Hinweis, daß hierfür CASE...SELECT besser geeignet ist. Ist wohl Geschmackssache. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 12.09.2014, 19:55    Titel: Antworten mit Zitat

CASE SELECT in Verbindung mit GOTO halte ich nicht für besser geeignet. Gemeint ist, GOTO komplett zu vermeiden und stattdessen die Inhalte direkt in den CASE-Blöcken einzufügen. happy
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 12.09.2014, 20:22    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Gemeint ist, GOTO komplett zu vermeiden und stattdessen die Inhalte direkt in den CASE-Blöcken einzufügen.
Vermutlich. Aber wenn man das nachträglich in ein existierendes Programm einfügen möchte, geht das mit GOTOs und Sprungmarken wohl einfacher. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 12.09.2014, 20:56    Titel: Antworten mit Zitat

@grindstone
Du hast Recht mit Command das gibts erst mit QuickBasic. Es gibt dafür einen Workaround mit Call Absolute
Beispiel ist aber nicht von mir
http://www.network54.com/Forum/182035/thread/1019004222/Accessing+command+line+parameters+from+qbasic+1.1
Code:

DECLARE FUNCTION get.psp% ()
DECLARE FUNCTION commandX$ ()
PRINT "Parameters: " + commandX$

DEFINT A-Z
FUNCTION commandX$

a$ = ""
DEF SEG = get.psp
l = PEEK(&H80)
FOR i = &H81 TO &H81 + l - 1
a$ = a$ + CHR$(PEEK(i))
NEXT i
DEF SEG
commandX$ = a$

END FUNCTION

DEFINT A-Z
FUNCTION get.psp

a$ = MKL$(&HB4E58955) + MKL$(&H8B21CD62) + MKL$(&H1D89067E) + MKL$(&H2CA5D)
DEF SEG = VARSEG(a$)
CALL absolute(s%, SADD(a$))
DEF SEG
get.psp = s%

END FUNCTION


Man könnte auch ENVIRON$ verwenden.

Test.bas
Code:

DECLARE FUNCTION get.psp% ()
DECLARE FUNCTION commandX$ ()

CLS
PRINT "Parameters: " + commandX$

i% = 1
DO
        env$ = ENVIRON$(i%)
        PRINT env$
        i% = i% + 1
LOOP UNTIL env$ = ""
PRINT "ENVIRON A ist gleich "; ENVIRON$("A")
SLEEP

DEFINT A-Z
FUNCTION commandX$

a$ = ""
DEF SEG = get.psp
l = PEEK(&H80)
FOR i = &H81 TO &H81 + l - 1
a$ = a$ + CHR$(PEEK(i))
NEXT i
DEF SEG
commandX$ = a$

END FUNCTION

FUNCTION get.psp

a$ = MKL$(&HB4E58955) + MKL$(&H8B21CD62) + MKL$(&H1D89067E) + MKL$(&H2CA5D)
DEF SEG = VARSEG(a$)
CALL absolute(s%, SADD(a$))
DEF SEG
get.psp = s%

END FUNCTION



Man kann die Umgebungsvariablen mit SET setzen. Wenn man von einem Windows Programm die DOSBOX aufruft könnte das in etwa so aussehen (eine Zeile):
"C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe" -c "SET A=B" -c "C:\QB\QBASIC.EXE /RUN C:\QB\Test.bas" -userconf


Ich habe ans Ende der DOSBOX Config einen mount befehl eingefügt sodass mein Verzeichnis mit allen DOS Programmen automatisch als Laufwerk C eingebunden wird.
[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount C C:\DOS_C

Wenn du keine DOSBOX einsetzt, sondern das Programm direkt aufrufst kannst du mit Freebasic SETENVIRON verwenden. bzw. mit QBASIC müsste auch ENVIRON "A=B" gehen das gibt aber bei mir einen Speicherfehler.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 12.09.2014, 21:52    Titel: Antworten mit Zitat

Nils hat Folgendes geschrieben:
Also ich muß Euch mal was beichten:
Ich hab noch nie mit subs oder functions gearbeitet! Ich arbeite meistens mit gosub und wenn ich bedingt wo hinspringen will mit goto mit einer Sprungmarke, die ich definiert habe. Mir ist klar, dass das seine Vorteile hat, was Ihr da sagt, aber ich hab' das noch nie gemacht!

In diesem Fall ein idealer Zeitpunkt für meinen Artikel (Tutorial):

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

RockTheSchock hat Folgendes geschrieben:
CHAIN ist ein wirklich altes Relict aus alten QuickBasic Zeiten, um mehr als ein 64 KByte Code + zwei 64KByte Datensegmente nutzen zu können. Dafür werden alle gemeinsam genutzten Variablen mit COMMON bzw. "COMMON SHARED" definiert. Das funktioniert aber nur zwischen 2 QB Programmen.

Ein guter Grund, auf FreeBasic zu wechseln, wo bis zu 4 GB Speicher in 32-Bit und beim x64-Compiler (derzeit experimentell) sogar theoretisch mehrere Exabytes (soviel RAM hat nicht einmal der grösste und teuerste Server eingebaut!) linear adressiert werden können. Kurz & bündig: Keine Speichersorgen mehr.

Kleinere Projekte passen bei entsprechender Programmierung aber ebenfalls ins RAM vom DOS-basierten QB hinein, speziell bei Vermeidung von grossen DATA-Zeilenbestände und Code-Wiederholungen. => Ohne CHAIN und COMMON machst Du Dir also das Leben erheblich einfacher.

grindstone hat Folgendes geschrieben:
Ich habe es zur Sicherheit noch einmal ausprobiert: Wenn ich versuche, von der Konsole aus ein QBasic-Programm zu starten, das die Zeile
Code:
PRINT COMMAND$
enthält, bekomme ich die Fehlermeldung "Erweiterte Funktionen nicht verfügbar".

Dies ist der Fall bei der "Lite"-Interpreterversion (QBASIC.EXE), wie sie bei MS-DOS 6.22 mitgeliefert wurde. Beim QB 4.5-Compiler steht COMMAND$ voll zur Verfügung.

@Nils: Am besten einmal das gesamte Projekt etwas genauer beschreiben, so dass für uns ersichtlich wird, ob es tatsächlich einen Grund gibt, bei DOS und damit den Limitierungen des konventionellen Speichers zu bleiben, oder ob das Ganze ebensogut für eine moderne Plattform entwickelt werden kann.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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 -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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