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:

Problem mit Subs/Functions

 
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
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 12.08.2008, 20:01    Titel: Problem mit Subs/Functions Antworten mit Zitat

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 mit dem Kopf durch die Mauer wollen
_________________
MfG Stuner
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 12.08.2008, 20:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 12.08.2008, 21:15    Titel: Antworten mit Zitat

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:
Code:
test2("Test2")

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 12.08.2008, 21:47    Titel: Antworten mit Zitat

nicht ganz so, dies
Code:
SUB test1(BYVAL variable1 AS STRING)
   ? variable1
   variable1 = "alte Variable "
END SUB
ist der Übeltäter grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 12.08.2008, 21:50    Titel: Antworten mit Zitat

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 Kopf schütteln

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 12.08.2008, 22:22    Titel: Antworten mit Zitat

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
Code:
Test
Test
Test
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 12.08.2008, 22:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht 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