Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
stuner
Anmeldungsdatum: 29.06.2006 Beiträge: 45
|
Verfasst am: 12.08.2008, 20: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, 20: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: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 12.08.2008, 21: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, 21: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, 21: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, 22: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, 22: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 |
|
 |
|