| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		stuner
 
 
  Anmeldungsdatum: 29.06.2006 Beiträge: 45
 
  | 
		
			
				 Verfasst am: 12.08.2008, 19:01    Titel: Problem mit Subs/Functions | 
				     | 
			 
			
				
  | 
			 
			
				Ist es normal, dass bei diesem Code:
 
 
 	  | Code: | 	 		  Declare sub test1(ByVal variable1 As String)
 
Declare Sub test2(Byref variable2 As String)
 
Declare Sub test3(variable3 As String)
 
 
Sub test1(ByVal variable1 As String)
 
   ? variable1
 
   variable1 = "alte Variable "
 
End Sub
 
 
Sub test2(byref variable2 As String)
 
   ? variable2   
 
   variable2 = "alte Variable "   
 
End Sub
 
Sub test3(variable3 As String)
 
   ? variable3
 
   variable3 = "alte Variable "
 
End Sub
 
 
test1("Test1")
 
test1("Test")
 
test1("Test")
 
?
 
test2("Test2")
 
test2("Test")
 
test2("Test")
 
?
 
test3("Test3")
 
test3("Test1")
 
test3("Test")
 
sleep | 	  
 
 
das herauskommt?
 
 
 
 
 
Ich freue mich auf eine Antwort, da ich derzeit am verzweifeln bin    _________________ MfG Stuner | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		raph ael
 
 
  Anmeldungsdatum: 12.04.2006 Beiträge: 472
 
  | 
		
			
				 Verfasst am: 12.08.2008, 19:40    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hmm, interessant, bei mir bricht das Programm mit einem Segmentation Fault ab ( 	  | Code: | 	 		  Test1
 
Segmentation fault | 	  )Zwar unter Linux aber der Code müsste eigentlich portabel sein...
 
Und seltsam genug, der Fehler tritt beim Kopieren der Zeichenkette auf... Ich würde auf einen Compilerfehler tippen...
 
Wahrscheinlich gesteht sich Windows einfach nicht den Segmentation Fault zu, aber das ist nur eine vage Vermutung... _________________
  	  | Zitat: | 	 		  | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. | 	 
  | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Eastler_dart
 
  
  Anmeldungsdatum: 24.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
  | 
		
			
				 Verfasst am: 12.08.2008, 20:15    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo Leute,
 
 
ich hatte auch schon mal ein ähnliches Problem, 
 
dort gings aber um selbstdeffinierte Variablenstrukturen,
 
in welchen auch Strings mit drin waren.
 
Den Fehler konnte ich nie wirklich analysieren, kann mich
 
aber erinnern, daß ich BYREF und BYVAL übergeben hatte.
 
 
Man sollte mal folgendes durchdenken:
 
in der SUB: 	  | Code: | 	 		  SUB test2(BYREF variable2 AS STRING)
 
   ? variable2   
 
   variable2 = "alte Variable "   
 
END SUB | 	  
 
wird ByRef die Variable übergeben, wenn ich jetzt nix 
 
durcheinander bringe, bedeutet daß, die Sub kriegt
 
einen Ramspeicherzeiger auf den übergebenen Text:
 
 
Also auf einen String im Speicher mit Länge 5 Buchstaben.
 
In der Sub wird erst der Inhalt geprintet "Test2",
 
danach wird im Ram an dem StringZeiger der Text
 
"alte Variable " reingesetzt. Und das sind dann 14 Buchstaben.
 
Keine Ahnung, ob ich recht hab, aber es kann doch sein,
 
daß durch die 14 Buchstaben im Ram über den eigentlichen
 
Variablenbereich hinaus der Ram verändert wird ?
 
Sowas bringt ungewisse und immer wieder anders aussehende
 
Fehler.
 
 
Ich hatte bei mir dann die Strings auf feste Länge gedimmt,
 
aber auch das Programm aus anderen Gründen komplett
 
umgestrickt.
 
Ob ich den Fehler durch das Dimmen oder das Stricken
 
eliminiert hatte, kann ich nicht sagen.
 
 
Jedenfalls hab ich mir angewöhnt, wenn ich 
 
per byRef Strings übergebe, dann mit fester Länge,
 
und ich achte peinlichst sowohl im Main und vor allem
 
in der Sub darauf, diese Längen nicht zu überschreiten.
 
 
hoffe es hilft ein Stück
 
 
 
Eastler _________________ Kaum macht mans richtig, schon geht's | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 12.08.2008, 20:47    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				nicht ganz so, dies 	  | Code: | 	 		  SUB test1(BYVAL variable1 AS STRING)
 
   ? variable1
 
   variable1 = "alte Variable "
 
END SUB
 
 | 	  ist der Übeltäter   
 
Hier wird, genau wie Eastler_dart beschreibt, im Datenbereich andere Strings überschrieben.
 
Ändere mal die Aufrufreihenfolge: 	  | Code: | 	 		  test2("Test1")
 
test2("Test2")
 
test2("Test3")
 
?
 
test3("Test1")
 
test3("Test2")
 
test3("Test3")
 
?
 
test1("Test1")
 
test1("Test2")
 
test1("Test3") | 	  da zeigt sich das! _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		stuner
 
 
  Anmeldungsdatum: 29.06.2006 Beiträge: 45
 
  | 
		
			
				 Verfasst am: 12.08.2008, 20:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ok, das mit dem ByRef und dann verändern ist klar, dass das nicht gut kommt, aber das ist nicht mein eigentliches Problem, sondern ich habe es nur eingebaut um zu sehen ob es einen Unterschied macht.
 
 
Ich habe den Code einmal zusammengekürzt:
 
 
 	  | Code: | 	 		  Declare sub test1(ByVal variable1 As String)
 
Sub test1(ByVal variable1 As String)
 
   ? variable1
 
   variable1 = ""
 
End Sub
 
test1("Test")
 
test1("Test")
 
test1("Test")
 
sleep | 	  
 
 
Das gibt bei mir nur einmal "Test" aus, anstatt wie ich es erwartet hätte 3 mal. Es scheint so, als würde es den Wert von "Test" verändern   
 
 
Edit: Ich dachte immer, wenn ich eine Variable byval übergebe, wird eine neue Variable erstellt, die ich nur innerhalb der Sub verändern kann und sobald die Sub abgearbeitet ist, bekommt die Variable wieder den Zustand von vor der Sub. Scheinbar hat aber das Verändern der Variable in der Sub auch Einfluss auf die Variable ausserhalb der Sub. Habe ich da bei 'byval' etwas falsch verstanden? _________________ MfG Stuner | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		raph ael
 
 
  Anmeldungsdatum: 12.04.2006 Beiträge: 472
 
  | 
		
			
				 Verfasst am: 12.08.2008, 21:22    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Wenn ich das ByVal entferne funktionierts bei mir. 	  | Code: | 	 		  DECLARE SUB test1(variable1 AS STRING)
 
SUB test1(variable1 AS STRING)
 
   ? variable1
 
   variable1 = ""
 
END SUB
 
test1("Test")
 
test1("Test")
 
test1("Test")
 
SLEEP | 	  Was natürlich absolut keinen Sinn ergibt, da ByVal eigentlich Standard ist... _________________
  	  | Zitat: | 	 		  | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. | 	 
  | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 12.08.2008, 21:45    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				nicht unbedingt 	  | Zitat: | 	 		  | In -lang fb dialect, Byval is the default parameter passing convention for all built-in types except String; String and user-defined Types are passed Byref by default. | 	  http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgByref _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		 |