|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 13.01.2018, 16:54 Titel: Label als Parameter? |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2018, 17:56 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 13.01.2018, 19:34 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 13.01.2018, 19:51 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2018, 20:19 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 13.01.2018, 21:13 Titel: |
|
|
Na gut, dann bleiben wir mal beim sauberen Programmieren .
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.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 13.01.2018, 21:48 Titel: MACRO für Restore-Label als Prozedur-Parameter |
|
|
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!
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 |
_________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
|
|
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.
|
|