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:

Label als Parameter?

 
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 13.01.2018, 16:54    Titel: Label als Parameter? Antworten mit Zitat

Hallo allerseits!

Gibt es eine Möglichkeit, ein Label als Parameter an eine Sub zu übergeben, so daß ich innerhalb der Sub ein RESTORE <label> durchführen kann? Etwa in der Art:
Code:
Sub GetData(ar() As String, label As Any Ptr)
   Dim As Integer x
   
   Restore label
   Do
      ReDim Preserve ar(x)
      Read ar(x)
      x += 1
   Loop While Len(ar(x - 1))
End Sub

DataLabel:
Data "eins","zwei","drei",""

ReDim As String array(0)

GetData(array(), @DataLabel)


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
Jojo
alter Rang


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

BeitragVerfasst am: 13.01.2018, 17:56    Titel: Antworten mit Zitat

Warum speicherst du die Daten nicht einfach direkt einem Array, das du dann an die Funktion übergibst? Seit man Arrays direkt initialisieren kann, ist das 1000x sauberer als RESTORE/READ, was ja ein uraltes BASIC-Relikt ist und solche Flexibilität nicht unterstützt. Du müsstest wenn schon RESTORE vor dem Funktionsaufruf selbst aufrufen, was natürlich zu Spaghetticode führt.
_________________
» 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 13.01.2018, 19:34    Titel: Antworten mit Zitat

Na ja, die Sache ist etwas komplizierter. Ausgangspunkt ist ein Beitrag aus dem englischen Forum:
https://www.freebasic.net/forum/viewtopic.php?p=242507#p242499

Das Array ist Bestandteil eines Types und lässt sich nicht so einfach initialisieren. Die dort verwendete Methode, jedes Element mit Index einzeln zu setzen, finde ich ziemlich umständlich, also habe ich mit dem Code ein wenig herumgespielt.

Natürlich gibt es auch noch andere Verfahren, etwa ein externes Array zu initialisieren und dann mit einer For..Next - Schleife in den Type zu übertragen, oder einen String mit allen Schlüsselwörtern an eine Type - interne Sub zu übergeben, die mit einem entsprechenden Parser daraus das Array erstellt (diese Vorgehensweise würde ich bevorzugen).

Oder eben über ein DATA - Statement. Mir ist schon klar, daß die Label zur Compilezeit aufgelöst werden, aber RESTORE setzt ja ähnlich wie SEEK einen Zeiger auf eine bestimmte Stelle in der Programmdatei, und darauf müsste man doch -zumindest prinzipiell- auch zur Laufzeit zugreifen können. Ich bin einfach nur neugierig, ob das geht.

Gruß
grindstone

EDIT: Das Aufrufen von RESTORE <label> direkt vor dem Einlesen (mit einer Type - internen Sub) funktioniert tatsächllich.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 13.01.2018, 20:42, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.01.2018, 19:51    Titel: Antworten mit Zitat

Wenn du ja sowieso mit statischen DATA-Daten arbeitest, kannst du natürlich auch die RESTORE-Angaben statisch einbauen:
Code:
SELECT CASE language
  CASE "fb"  : RESTORE data_fb
  CASE "c"   : RESTORE data_c
  CASE "php" : RESTORE data_php
END SELECT

so in der Art. Sicher nicht das, was du suchst; aber wenn es es in irgendeiner Form variabel sein soll, wäre ich da heute sehr schnell bei externen Dateien zum Einlesen.
_________________
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
Jojo
alter Rang


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

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

grindstone hat Folgendes geschrieben:
Oder eben über ein DATA - Statement. Mir ist schon klar, daß die Label zur Compilezeit aufgelöst werden, aber RESTORE setzt ja ähnlich wie SEEK einen Zeiger auf eine bestimmte Stelle in der Programmdatei, und darauf müsste man doch -zumindest prinzipiell- auch zur Laufzeit zugreifen können. Ich bin einfach nur neugierig, ob das geht.

Restore erwartet halt syntaktisch einen Label, und keinen Zeiger. Auch wenn ein Label intern nichts anderes sein mag, so lässt es einfach die FreeBASIC-Syntax nicht zu, dort etwas anderes als einen Label anzugeben.
_________________
» 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 13.01.2018, 21:13    Titel: Antworten mit Zitat

Na gut, dann bleiben wir mal beim sauberen Programmieren grinsen .

Ein String ist ja auch deutlich flexibler als ein DATA - Statement. Ich habe dem Kollegen mal einen passenden Stringparser gebastelt, mal sehen, was er daraus macht. 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
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 13.01.2018, 21:48    Titel: MACRO für Restore-Label als Prozedur-Parameter Antworten mit Zitat

Egal, ob GOTO, GOSUB oder RESTORE - alles, was in Richtung Spaghetti-Code geht, macht noch mehr Spaß, wenn das ganze vorher noch durch Präprozessor-Ersetzungen läuft! grinsen

Code:
#MACRO ReadAndPrintNumber( labelName )
    Scope
        Restore labelName
        Dim number As Integer
        Read number
        PrintNumber( number )
    End Scope
#ENDMACRO

Declare Sub PrintNumber( ByVal x As Integer )

ReadAndPrintNumber( ipsum )
ReadAndPrintNumber( sit )
ReadAndPrintNumber( lorem )

GetKey
End

lorem:
DATA 1000
ipsum:
DATA 42
dolor:
DATA 1234
sit:
DATA 777



Sub PrintNumber( ByVal x As Integer )
    Print "Hallo, ausgelesen wurde der Wert " & x & "!"
End Sub

_________________
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 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