Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 13.03.2021, 01:33 Titel: Variable mit 2 verschiedenen Datentypen? |
|
|
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 |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 563 Wohnort: Jüterbog
|
Verfasst am: 13.03.2021, 10:03 Titel: |
|
|
Manchmal kann es dicke kommen
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 13.03.2021, 11:12 Titel: |
|
|
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. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 13.03.2021, 19:34 Titel: |
|
|
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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 13.03.2021, 20:45 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 13.03.2021, 20:57 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.03.2021, 21:31 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 13.03.2021, 22:51 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 14.03.2021, 00:42 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 14.03.2021, 00:59 Titel: |
|
|
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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 14.03.2021, 12:16 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 14.03.2021, 13:03 Titel: |
|
|
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. 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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 14.03.2021, 13:30 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 14.03.2021, 13:43 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 15.03.2021, 11:12 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.03.2021, 19:52 Titel: |
|
|
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 |
|
|
|