| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 13.03.2021, 00: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: 570
 Wohnort: Jüterbog
 
 | 
			
				|  Verfasst am: 13.03.2021, 09: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 13.03.2021, 10: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: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 13.03.2021, 18: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. 
 
 Das mit dem X war jetzt nur ein Beispiel. 	  | 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 | 
 
 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: 116
 
 
 | 
			
				|  Verfasst am: 13.03.2021, 19: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 13.03.2021, 19: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: 2531
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 13.03.2021, 20: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 13.03.2021, 21: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 13.03.2021, 23: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 13.03.2021, 23: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: 116
 
 
 | 
			
				|  Verfasst am: 14.03.2021, 11: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 14.03.2021, 12: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: 116
 
 
 | 
			
				|  Verfasst am: 14.03.2021, 12: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 14.03.2021, 12: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 15.03.2021, 10: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: 2531
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 15.03.2021, 18: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 |  | 
	
		|  | 
	
		|  |