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:

Variable mit 2 verschiedenen Datentypen?

 
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1007
Wohnort: Niederbayern

BeitragVerfasst am: 13.03.2021, 01:33    Titel: Variable mit 2 verschiedenen Datentypen? Antworten mit Zitat

Macht es überhaupt Sinn, dass eine Variable ein Integer sowie ein String gleichzeitig ist?

Im Hauptprogramm definiere ich X als String und in der Sub steht Dim X as Integer drin. Der Compiler meldet keine Fehlermeldung und auch das Programm funktioniert ohne Probleme! Ist mir gerade einfach mal so aufgefallen, als ich mir mein Programm etwas genauer angeschaut habe. Sicher ein Versehen von mir...
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 13.03.2021, 10:03    Titel: Antworten mit Zitat

Manchmal kann es dicke kommen lächeln
Code:
dim shared as string x'sogar shared, wird aber von der Sub total ignoriert
x="Text"
sub Bla
  dim as integer x=1000
      for x as single=0 to 5 step 1.5
        print x'<----------!
      next x
  print x'<----------!
end sub

bla
print x'<----------!

sleep


ps: was ich sagen wollte, das muss kein Versehen sein. Wie du im Beispiel siehst, können alle Ickse("x") sehr wohl so dimensioniert sein. Sie haben aber alle ihren eigenen Geltungsbereich und kollidieren somit nicht. Es sind praktisch verschieden Variablen, trotz gleichem Namen.


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 13.03.2021, 11:12    Titel: Antworten mit Zitat

https://www.freebasic-portal.de/befehlsreferenz/gueltigkeitsbereich-von-variablen-623.html
Ob zwei Variablen, die sich in unterschiedlichen Scopes befinden, denselben oder einen unterschiedlichen Datentyp besitzen, ist unerheblich. Da spielt es auch keine Rolle, ob sie denselben Symbolnamen besitzen - es handelt sich um unterschiedliche Speicherbereiche (wie ja schon Muttonhead schrieb).

Ob es im Sinne der Verwendung sprechender Namen ratsam ist, den Variablennamen X zu verwenden, wenn man dann aus dem Namen nicht einmal erraten kann, welchen Datentypen es darstellen soll, sei einmal dahingestellt. cool
_________________
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1007
Wohnort: Niederbayern

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

Danke für die Antworten! Ich habe es im Quellcode geändert. War nur ein Versehen! Die eine Variable wurde nicht mal verwendet. Konnte also leicht entfernt werden.

Zitat:
Ob es im Sinne der Verwendung sprechender Namen ratsam ist, den Variablennamen X zu verwenden, wenn man dann aus dem Namen nicht einmal erraten kann, welchen Datentypen es darstellen soll, sei einmal dahingestellt. cool
Das mit dem X war jetzt nur ein Beispiel.

Edit: Die Frage die ich mir gerade stelle: Wirkt sich das irgendwie auf die Performance aus? Gibt es Einbußen beim Speicher?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 26

BeitragVerfasst am: 13.03.2021, 20:45    Titel: Antworten mit Zitat

Dazu habe ich auch eine Frage:
Man soll eine Variable dann deklarieren, wenn man sie braucht.
Kann man eine Variable und damit den Variablennamen freigeben, wenn man die Variable nicht mehr braucht?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 13.03.2021, 20:57    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Gibt es Einbußen beim Speicher?

Diese Frage ist im Zeitalter der GB - Speicherriegel wohl eher akademisch.


hhr hat Folgendes geschrieben:
Kann man eine Variable und damit den Variablennamen freigeben, wenn man die Variable nicht mehr braucht?

Ich halte das zwar nicht für besonders sinnvoll, aber offensichtlich geht es:
Code:
Dim x As Integer
x = 5
Print x
#Undef x
Dim x As String
x = "Hallo"
Print x
Sleep

Wobei die Frage ist, ob das wirklich Speicherplatz spart oder nicht vielleicht sogar irgendwelche unerwünschten Seiteneffekte verursacht.

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
dreael
Administrator


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

BeitragVerfasst am: 13.03.2021, 21:31    Titel: Antworten mit Zitat

In Java gibt es bekanntlich die Möglichkeit, Statements als Block mittels geschweiften Klammern zusammenzufassen, z.B.
Code:
int x=23;
System.out.println(x);
{
  String x="abc";
  System.out.println(x);
}
System.out.println(x);

=> Dort verlieren Variablem nach Blockende auch ihre Gültigkeit (hier der String), d.h. am Schluss des Beispiels käme dann wieder die Zahl als Ausgabe.

So betrachtet müsste man den FB-Entwickler auch ein SCOPE / END SCOPE-Block o.ä. anstelle von #undef vorschlagen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 13.03.2021, 22:51    Titel: Antworten mit Zitat

Wegen #UNDEF bin ich nicht sicher - soweit ich weiß, wird da nur der Symbolname gelöscht, nicht aber der belegte Speicher freigegeben.
Wenn ich (außerhalb einer Schleife, Bedingung o. ä.) eine Variable nur kurzzeitig nutze und sicherstellen will, dass sie danach "weg" ist, verwende ich SCOPE.
_________________
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: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 14.03.2021, 00:42    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Wegen #UNDEF bin ich nicht sicher - soweit ich weiß, wird da nur der Symbolname gelöscht, nicht aber der belegte Speicher freigegeben.

Scheinbar nicht, sonst müsste das hier irgendwann abstürzen:
Code:
Do
   For i As Integer = 1 To 10000
      Dim x As Double
      x = Timer
      Print x
      #Undef x
      Dim x As String
      x = "Hallo"
      Print x
      Locate 1,1
   Next
Loop Until Len(InKey)


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
nemored



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

BeitragVerfasst am: 14.03.2021, 00:59    Titel: Antworten mit Zitat

Da werden aber nur zwei Variablen deklariert; nach jedem Schleifendurchlauf ist ja dann wieder der Scope beendet.
_________________
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
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 26

BeitragVerfasst am: 14.03.2021, 12:16    Titel: Antworten mit Zitat

Vielen Dank für die Antworten.

Weil ich glaubte, dass Goto keinen Scope-Block verwenden würde, habe ich folgendes ausprobiert:

Code:
Ziel:
   Dim x As String
   x = "Hallo"
   Print @x,Strptr(x)
   Print x
   #Undef x
   Dim x As Double
   x = Timer
   Print @x
   Print x
   '#Undef x
   Locate 1,1
Goto Ziel


Es werden immer wieder dieselben Adressen verwendet. Sogar auf das zweite #Undef kann man verzichten.

Wenn man auf die Schleife verzichtet und die Blöcke untereinander kopiert, werden verschiedene Adressen verwendet.
Wenn genügend viele Blöcke untereinander stehen, läuft der Arbeitsspeicher voll und das Programm stürzt ab:

Code:
Dim x As String
x = "Hallo"
Print @x,Strptr(x)
Print x
#Undef x
Dim x As Double
x = Timer
Print @x
Print x
#Undef x

Print

Dim x As String
x = "Hallo"
Print @x,Strptr(x)
Print x
#Undef x
Dim x As Double
x = Timer
Print @x
Print x
#Undef x

Sleep


Wenn man dann Scope-Blöcke verwendet, bleiben die Adressen gleich:

Code:
Scope
   Dim x As String
   x = "Hallo"
   Print @x,Strptr(x)
   Print x
End Scope
Scope
   Dim x As Double
   x = Timer
   Print @x
   Print x
End Scope

Print

Scope
   Dim x As String
   x = "Hallo"
   Print @x,Strptr(x)
   Print x
End Scope
Scope
   Dim x As Double
   x = Timer
   Print @x
   Print x
End Scope

Sleep


Vielleicht habe ich immer noch nicht alles verstanden, aber es ist jetzt klarer.

Vielen Dank also.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.03.2021, 13:03    Titel: Antworten mit Zitat

Ich sitze gerade am Linux-Rechner mit fbc 1.05 und sehe, dass ich diese Programme dort gar nicht kompilieren kann - Fehler in der C-Datei wegen Typen-Konflikt. grinsen Ich schau gleich noch mal unter Windows.
_________________
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
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 26

BeitragVerfasst am: 14.03.2021, 13:30    Titel: Antworten mit Zitat

Die ersten beiden Programme lassen sich mit FB64 nicht kompilieren.
Das dritte Programm zeigt bei FB64 unterschiedliche Adressen.
Bei Windows 7 und FB32 funktioniert es so, wie ich es beschrieben habe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.03.2021, 13:43    Titel: Antworten mit Zitat

Bei Strings gebe ich übrigens noch zu bedenken, dass FreeBASIC eine eigene Verwaltung des Stringspeichers organisiert. Ein String wird bei Beendigung des Scopes sauber gelöscht, während ich mir das bei #UNDEF nicht vorstellen kann (aber vielleicht will ja jemand testen). Bei Zahl-Typen wird das nicht so problematisch sein.
_________________
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: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 15.03.2021, 11:12    Titel: Antworten mit Zitat

Falls es wirklich notwendig sein sollte, Variablen - Speicher wieder freizugeben, würde ich die Verwendung von dynamischen Arrays empfehlen. Das ist auf jeden Fall eine saubere Lösung.

Außerdem stellt ja jedes DO..LOOP, FOR..NEXT, IF..THEN usw. einen Scope - Block dar, d.h. alle in diesem Block dimensionierten Variablen verlieren mit Verlassen des Blocks ihre Gültigkeit. Wenn eine Variable also an einer geeigneten Stelle dimensioniert wird, ist das explizite Freigeben überflüssig.

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
dreael
Administrator


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

BeitragVerfasst am: 15.03.2021, 19:52    Titel: Antworten mit Zitat

Schon wieder etwas kennengelernt:

https://www.freebasic-portal.de/befehlsreferenz/scope-362.html

Demnach braucht es den Feature Request bereits nicht mehr, sondern das Gewünschte wurde bereits exakt umgesetzt. Heisst also: Dieses in Java bekannte Konzept mit dem Block ist bei FB genauso vorhanden.
_________________
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 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