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:

Prüfen ob eine Variable exisitert

 
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 23.11.2011, 10:30    Titel: Prüfen ob eine Variable exisitert Antworten mit Zitat

Hallo zusammen!

Im prinzip hab ich wieder eine kleine Frage:

Wie prüft man ob eine Variable exisitert?

Folgende Lösung habe ich bisher, welche aber mir nicht genügt:

Code:

#macro IsDefined(v)
    #if defined(v)
        print "Variable wurde definiert!"
    #else
        print "Variable wurde nicht definiert!"
    #endif
#endmacro

Type testtype1
    a as integer
    b as string
end type

dim test1 as testtype1
'Hier möchte ich prüfen ob eine Variable namens "test1" exisitert
IsDefined(test1)

sleep


Diese Lösung genügt mir nicht, weil ich damit nicht auf die Existenz einer Variable innerhalb einer Type prüfen kann:

Code:

#macro IsDefined(v)
    #if defined(v)
        print "Variable wurde definiert!"
    #else
        print "Variable wurde nicht definiert!"
    #endif
#endmacro

Type testtype1
    a as integer
    b as string
end type

dim test1 as testtype1
'Hier möchte ich prüfen ob test1 eine Variable namens "a" hat
IsDefined(test1.a)

sleep


Und letzteres klappt nicht, mit der Compiler-Meldung: "Expected ')', found '.' in 'IsDefined(test1.a)'"

Kann mir jemand weiterhelfen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 23.11.2011, 18:57    Titel: Antworten mit Zitat

test1.a ist keien variable
test1 ist eine variable die aus integer + string = 4byte + 3x 4byte besteht

du kannst also nicht testen ob test1.a existiert. aber wenn test1 existiert, dann existiert auch test1.a udn test1.b


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 24.11.2011, 00:33    Titel: Antworten mit Zitat

Das ergibt so erstmal wenig Sinn, da zur compilezeit evaluiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.11.2011, 08:21    Titel: Antworten mit Zitat

Ich möchte prüfen ob eine x-beliebige TYPE eine variable namens a hat. Klingt doch erstmal nicht nach einer schweren Anforderung.. traurig ...

Diese prüfroutine soll Bestandteil eines Macros sein welches eine beliebige TYPE verarbeitet. Und damit es das kann, muss es feststellen können ob eine variable/sub/Funktion innerhalb der TYPE existiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 24.11.2011, 08:37    Titel: Antworten mit Zitat

vielleich hilft dir
Code:
#if TypeOf(v)=testtype1
wenn der macro nur mit einem bestimmten type funktionieren soll.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 24.11.2011, 08:38    Titel: Antworten mit Zitat

28398 hat Folgendes geschrieben:
Das ergibt so erstmal wenig Sinn, da zur compilezeit evaluiert.

So wie er es notiert, macht es ungefähr genau so viel Sinn wie in C++, wo du z.B. auch sizeof für Membervariablen nur auf "Instanzen" von structs anwenden kannst (auch wenn der Compiler diese wegoptimiert, wenn man sie nur für diese eine Sache braucht).
_________________
» 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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.11.2011, 10:02    Titel: Antworten mit Zitat

Mir gehts nicht darum festzustellen ob eine Variable ein bestimmter Datentyp ist.

Mir gehts darum festzustellen, ob ein Element einer TYPE definiert wurde oder nicht.

normalerweise kann man mit #IFDEF (oder #IF DEFINED() )herrausfinden ob ein "Ausdruck" definiert wurde oder nicht. Die definition einer normalen Variable kann als Ausdruck festgestellt werden.

Die Elemente einer TYPE können aber anscheinend mit #IFDEF nicht als Ausdruck festgestellt werden. Da wäre meine Frage, ob das irgendwie doch anders geht.

Behelfsweise hätte vielleicht jemand zu diesem PSEUDO-Code eine Idee:

Dim test1 as beliebig

Wenn test1 ein Element mit namen "Alter" hat dann
Setze test1.Alter = 21
Ansonsten
Mach gar nix
Ende der Bedingung

Wenn es eine Möglichkeit gäbe, dem Compiler sowas wie "on error resume next" unterzuschieben, würde das meine Zwecke auch erfüllen. (Ist mir aber nicht bekann)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 24.11.2011, 11:02    Titel: Antworten mit Zitat

TPM hat mit seinem Hinweis Recht, IFDEF funktioniert nur mit Variablen, nicht mit Subteilen einer Variable. Ich vermute mal, das wird so nicht gehen.

Eine Möglichkeit gibt es aber dennoch. Du könntest einen FB-Parser erstellen und den eigenen Code durchsuchen. Nicht gerade schön, aber naja.

Ich verstehe aber auch den Sinn dahinter nicht. Wenn du dir die Records deiner Types nicht merken kannst, benenne sie eindeutiger oder verwende eine IDE mit Autovervollständigung. An Variablen aus Libs kommst du über keine Methode mehr, da Namen aufgelöst werden. Wenn du Code abhängig von den Variablen machen willst, lege einen zweiten Type an, dann kannst du nach TypeOf entscheiden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.11.2011, 11:11    Titel: Antworten mit Zitat

@MOD: Echt schade traurig ..

Es geht nicht darum das ich mir irgendwas nicht merken kann. Auch die IDE spielt keine Rolle. Es geht darum, dass ich eine ganze palette unterschiedlicher TYPEs habe und einige von ihnen haben die selben Elemente, manche nicht. Und nun soll ein macro, jede dieser TYPEs mit der selben Methodik durchgehen. Hat eine TYPE ein bestimmtes Element, soll das Macro was damit machen, wenn nicht, dann nicht.

Gibt es nicht sowas wie "on error resume next" auf präprozessor-ebene?
Frei nach dem Motto "Tuh was du tun kannst, sonst tuh einfach nix" ... (Ich hasse es "tuhen" als Verb zu verwenden, aber um die Einfachheit meiner "Anforderung" Ausdruck zu verleihen, musste ich es doch verwenden traurig ...)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 24.11.2011, 11:27    Titel: Antworten mit Zitat

Einen ersten Vergleich kannst du ja über SizeOf machen. Der Rest: schwierig. Selbst wenn du weißt, dass etwas definiert wurde, dann braucht diese Variable trotzdem noch einen Datentyp, damit da ncihts schief geht. An Methoden kommst du noch schwerer, da sie nicht wirklich Teil des Types sind.
Die beste und flexibelste Möglichkeit ist also wirklich einen Parser schreiben, der einfach nur nach Types sucht und dessen Records aufnimmt. Eine andere Möglichkeit wäre eine linked list, bei der du per Hand alle Types nochmal aufnimmst und die Prüfung ganz normal zur Laufzeit machst.

Über den Präprozessor wird das vermutlich nichts (ich bin aber auch kein Experte dafür, vielleicht hat da ja jemand anderes mehr Ahnung davon).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.11.2011, 11:53    Titel: Antworten mit Zitat

Auch SizeOf() nützt mir nichts. Es würde mir auch nichts nützen einen Parser zu schreiben, weil ich das Projekt dann eher schlecht als recht veröffentlichen könnte.

Übrigens: Innerhalb von Routinen oder im Konstruktor/Destruktor einer TYPE kann man feststellen ob die Type eine Variable besitzt:

Code:

#macro IsDefined(v)
    #if defined(v)
        print "Variable " & #v & " wurde definiert!"
    #else
        print "Variable " & #v & " wurde nicht definiert!"
    #endif
#endmacro

Type testtype1
    a as integer
    b as string
    declare sub c()
end type

sub testtype1.c()
    IsDefined(a)
    IsDefined(x)
    IsDefined(c)
end sub

dim test1 as testtype1

test1.c

sleep


Das Blöde ist, ich wills ja von Aussen feststellen, nicht von innerhalb der TYPE traurig(
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 24.11.2011, 12:03    Titel: Antworten mit Zitat

Interessant, denn mit THIS geht es nicht. Scheint, dass der FB-Parser was gegen Punkte hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.11.2011, 12:08    Titel: Antworten mit Zitat

@MOD: Das kann man generell auch nicht sagen, denn ausserhalb von einem Namensraum kann man die Ausdrücke prüfen:
Code:

#macro IsDefined(v)
    #if defined(v)
        print "Variable " & #v & " wurde definiert!"
    #else
        print "Variable " & #v & " wurde nicht definiert!"
    #endif
#endmacro

namespace testtype1
    Dim a as integer
    Dim b as string
    declare sub c()
end namespace

sub testtype1.c()
    a = 123
end sub

IsDefined(testtype1.a)
IsDefined(testtype1.b)
IsDefined(testtype1.c)

sleep
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