 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 14.12.2013, 22:14 Titel: Array an Sub/Funktion übergeben |
|
|
Ich versuche gerade, ein Programm von QuickBasic auf FreeBasic zu portieren.
In Quickbasic hatte ich einigen Subs mit Marken und GOSUB - RETURN gearbeitet. Das hatte den gewissen Vorteil, dass alle Variablen innerhalb dieser Sub natürlich auch für den Abschnitt gültig sind, zu dem ich mit GOSUB springe.
In FreeBasic darf ich das nicht mehr, und muss diese Prozeduren also in eigene Subs oder Functions auslagern, und die erforderlichen Variablen als Argumente übergeben.
Das ist zwar umständlich, hat aber zumindest geklappt, bis ich in einem Fall eine Fehlermeldung bekomme.
Hier ein (sinnloses) Testbeispiel, das NICHT funktioniert:
Code: | Type testtype
element1 as Integer
element2 as String
End type
Declare Sub Wurstel (A1 as TestStype())
Dim Feld(1 to 4) as TestType
DIM as Integer i
For i=1 to 4
Feld(i).element1 = i
Feld(i).element2 = "Test"
Next i
Wurstel(Feld())
Sleep
End
Sub Wurstel (Testfeld() as TestStype())
DIm as integer k
DIM as String Erg
For k=1 to 4
Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2
Print l
next k
end sub |
Was mache ich falsch?
Grüße
Rainer |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 14.12.2013, 22:43 Titel: |
|
|
Code: | Type testtype
element1 as Integer
element2 as String
End type
Declare Sub Wurstel (A1() as Testtype)
Dim Feld(1 to 4) as TestType
DIM as Integer i
For i=1 to 4
Feld(i).element1 = i
Feld(i).element2 = "Test"
Next i
Wurstel(Feld())
Sleep
End
Sub Wurstel (Testfeld() as Testtype)
DIm as integer k
DIM as String Erg
For k=1 to 4
Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2
Print k
next k
end sub |
Ich habe großzügig das letzte l durch k ersetzt, keine Ahnung, was du da ausgeben wolltest ...  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 00:01 Titel: |
|
|
Ähm ja, "L" war Mist, sollte ERG ausgeben. Ist aber eh nur ein Testprogramm, das irgendwas verwursteln soll.
Entscheidend ist die Fehlermeldung, hätte ich vielleicht gleich anhängen sollen:
Zitat: | Compiler output:
D:\programs\FreeBASIC\tmp_sub_array.bas(6) error 58: Illegal specification, at parameter 1 (A1) of Wurstel() in 'Declare Sub Wurstel (A1 as TestStype())'
D:\programs\FreeBASIC\tmp_sub_array.bas(17) error 57: Type mismatch, at parameter 1 of WURSTEL() in 'Wurstel(Feld())'
D:\programs\FreeBASIC\tmp_sub_array.bas(23) error 58: Illegal specification, at parameter 1 (Testfeld) of Wurstel() in 'Sub Wurstel (Testfeld() as TestStype())'
D:\programs\FreeBASIC\tmp_sub_array.bas (28 ) error 247: Symbol not a CLASS, ENUM, TYPE or UNION type, before '.' in 'Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2'
Results:
Compilation failed
System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.90.1 |
Grüße
Rainer
Zuletzt bearbeitet von TimesChange am 15.12.2013, 00:30, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 15.12.2013, 00:04 Titel: |
|
|
Und, klappt denn meine Verbesserung für deine Zwecke? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 00:33 Titel: |
|
|
Nein, obige 4 Fehler bekomme ich auch mit Änderung.
Das Codebeispiel habe ich nur gemacht, da ich irgendeine Subroutine mit einem Array mit benutzerdefinierten Daten aufrufen wollte, um die Fehlermeldung zu zeigen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 15.12.2013, 00:42 Titel: |
|
|
Zitat: | Nein, obige 4 Fehler bekomme ich auch mit Änderung. |
Das ist aber komisch, bei compiliert es fehlerlos.
Wie auch immer: Klammern hinter der Arraybezeichnung, aber keine hinter dem Datentyp. In der Befehlsreferenz zu DIM findet sich auch ein Beispiel. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 15.12.2013, 00:45 Titel: |
|
|
TimesChange hat Folgendes geschrieben: | Nein, obige 4 Fehler bekomme ich auch mit Änderung.
Das Codebeispiel habe ich nur gemacht, da ich irgendeine Subroutine mit einem Array mit benutzerdefinierten Daten aufrufen wollte, um die Fehlermeldung zu zeigen. |
Also bei mir funktioniert Nemoreds Version ohne Probleme!
Die Stellen mit Fehler bzw. Ungenauigkeiten sind folgende:
Code: | Declare Sub Wurstel (A1 as TestStype()) |
Code: | Declare Sub Wurstel (A1() as Testtype) |
Code: | Sub Wurstel (Testfeld() as TestStype()) |
Code: | Sub Wurstel (Testfeld() as Testtype) |
|
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 00:57 Titel: |
|
|
Oh, sorry, ich habe nicht bemerkt dass du noch bisschen mehr korrigiert hast als nur das "L".
Wenn ich meine ganzen "Verschreiber" korrigiere, klappts auch bei mir
Den eigentlichen Fehler habe ich inzwischen auch gefunden:
Ich hatte (anders als im Beispiel oben) die Funktion wie folgt deklariert, da die Werte im übergebenen Feld geändert werden sollen:
Code: | Declare Sub Wurstel (ByRef A1() as Testtype) |
Offenbar hat hier das BYREF gestört, da "user-defined Types are passed ByRef by default"
Grüße und Danke
Rainer |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 03:09 Titel: |
|
|
So, einen hab' ich noch
Ich habe ein Array aus Strings fester Länge. Wenn ich dieses an eine SUB übergeben will bekomme ich untenstehende Fehlermeldungen.
What's wrong?
Code: | Declare Sub DRUCK (Anz as Integer, ByRef Zeig() as String * 10)
Dim Zeig(4) as String * 10
DIM as Integer i
For i=1 to 4
Zeig(i) = STR(i) + ". Element"
Next i
Druck (4, Zeig())
Sleep
End
Sub DRUCK (i as Integer, ByRef Z() as String * 10)
DIM as Integer k
For k=1 to i
Print Z(k)
next k
End Sub |
Zitat: | Compiler output:
D:\programs\FreeBASIC\FBIDETEMP.bas(1) error 58: Illegal specification, at parameter 2 (Zeig) of DRUCK() in 'Declare Sub DRUCK (Anz as Integer, Zeig() as String * 10)'
D:\programs\FreeBASIC\FBIDETEMP.bas(10) error 57: Type mismatch, at parameter 2 of DRUCK() in 'Druck (4, Zeig())'
D:\programs\FreeBASIC\FBIDETEMP.bas(16) error 58: Illegal specification, at parameter 2 (Zeig) of DRUCK() in 'Sub DRUCK (i as Integer, Zeig() as String * 10)' |
Grüße
Rainer |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 15.12.2013, 10:51 Titel: |
|
|
Zunächst einmal ist die Angabe von BYREF bei Arrays nicht erlaubt, da Arrays immer BYREF übergeben werden und BYVAL gar nicht möglich wäre.
Strings fester Länge können wohl grundsätzlich nicht als Parameter gefordert werden. Man kann einen String fester Länge angeben, wenn ein String variabler Länge gefordert ist - dieser wird dann automatisch umgewandelt. Bei String-Arrays geht das allerdings nicht.
Man würde da wohl üblicherweise mit ZSTRING PTR der STRING PTR arbeiten. Mit UDTs kann man auch etwas tricksen (auch wenn ich nicht weiß, ob meines die beste mögliche Lösung ist):
Code: | Type FixedLength10
As String*10 inh
Declare Operator Cast As String
Declare Operator Let(value As String)
End Type
Operator FixedLength10.Cast As String
Return This.inh
End Operator
Operator FixedLength10.Let(value as String)
This.inh = value
End Operator
Declare Sub DRUCK (Anz as Integer, Zeig() as FixedLength10)
Dim Zeig(4) as FixedLength10
DIM as Integer i
For i=1 to 4
Zeig(i) = STR(i) + ". Element"
Next i
Druck (4, Zeig())
Sleep
End
Sub DRUCK (i as Integer, Z() as FixedLength10)
DIM as Integer k
For k=1 to i
Print Z(k)
next k
End Sub |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 13:51 Titel: |
|
|
Ja, mit BYREF habe ich einen Bock geschossen, da wir das mit Arrays ja gerade erst beim Beispiel weiter oben hatten.
Ich habe mich da von der Hilfsdatei verwirren lassen: Zitat: | When passing Strings as parameters to Subs, they should always be passed by reference (ByRef) |
Zu meiner Ehrenrettung: Ich habe auch den Aufruf ohne BYREF versucht
Deinen Vorschlag mit UDTs und den Operatoren finde ich ziemlich raffiniert.
Auch wenn es "doof" ist, dass ich kein Array aus Fiexd Strings ohne Umwege übergeben kann.
FreeBasic kann schon bissl mehr als Quickbasic, aber man muss sich erst daran gewöhnen und umdenken, und es ist auch deutlich anspruchsvoller.
Grüße
Rainer |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 15.12.2013, 14:19 Titel: |
|
|
@TimesChange: Du könntest die fraglichen Variablen ja auch mit Dim Shared... als globale Variablen deklarieren. Dann kannst du wie einst bei GOSUB ohne Parameterübergabe von jedem Unterprogramm aus uneingeschränkt darauf zugreifen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 15.12.2013, 16:33 Titel: |
|
|
@grindstone: Ja, DIM SHARED würde das Problem auch lösen.
Das fände ich aber nicht so "elegant", da es hier nur um temporäre "Hilfsvariablen" geht, die nur kurzfristig innerhalb einer Sub benötigt werden.
In diesem speziellen Fall werde ich vermutlich sogar ganz darauf verzichten, den ehemaligen GOSUB-Block in eine Sub auszulagern, da er nur von 2 oder 3 Stellen innerhalb der Routine aufgerufen wird, und nur wenige Zeilen lang ist. Da erscheint es mir vertretbar, dieselben paar Zeilen an 2 oder 3 Stellen im Programm einzufügen.
Was anderes wäre es, wenn diese Subroutine umfangreicher wäre, oder von mehr Stellen aus aufgerufen werden würde.
Grüße
Rainer
P.S. @all: Ich hoffe, dass ich (hier und in meinen anderen Fragen) nicht undankbar wirke, wenn mir manche Vorschläge nicht "passen".
Ohne den hilfreichen Input hier aus dem Forum hätte ich's schon aufgegeben... |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 15.12.2013, 17:38 Titel: |
|
|
Du kannst globale und lokale Variablen je nach Bedarf beliebig kombinieren. Das ist nicht unelegant, sondern äußerst praktisch und macht die Programmierung sehr flexibel.
Wenn du einige wenige Programmzeilen hast, die an mehreren Stellen identisch auftauchen, kannst du sie auch als Makro definieren und wie einen Unterprogrammaufruf an den entsprechenden Stellen platzieren. Der Kompiler fügt die Programmzeilen dann so ein, als wenn du sie dort explizit hingeschrieben hättest. Etwas störend ist nur, daß ein Makro vor seinem ersten Aufruf definiert werden muß. So etwas wie Declare gibt es für Makros nicht.
TimesChange hat Folgendes geschrieben: | Ich hoffe, dass ich (hier und in meinen anderen Fragen) nicht undankbar wirke, wenn mir manche Vorschläge nicht "passen". | Jeder hat seinen eigenen Programmierstil, dazu gehört manchmal auch der Wunsch, etwas so und nicht anders lösen zu wollen.
Irgendwann kannst du sicher auch die "nicht passenden" Lösungen gebrauchen (behalte sie daher im Hinterkopf). Und außerdem gibt es da ja auch noch eine ganze Anzahl von Mitlesern im Hintergrund (jetzt oder in Zukunft), die dabei sicher den einen oder anderen "Aha-Effekt" erleben.
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: 4702 Wohnort: ~/
|
Verfasst am: 15.12.2013, 19:40 Titel: |
|
|
Es wäre noch zu überlegen, ob statt eines Strings fester Länge einer mit variabler Länge reichen würde. Ggf. kann er ja mit LEFT gekürzt werden. Die Feldlänge müsstest du übrigens gar nicht übergeben, LBOUND und UBOUND wird bei der Übergabe mitgeliefert. Außer du willst nicht das ganze Feld verwenden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 08.01.2014, 01:29 Titel: |
|
|
Jetzt hänge ich nochmal eine aktuelle Frage hier dran, da wir eh schon über Fixed Strings als Parameter gesprochen haben.
Grundsätzlich kann ich ja auch einen String fester Länge an eine Sub/Function übergeben, die einen STRING erwartet.
Zu meiner Überraschung funktioniert das in folgendem Beispiel auch, wenn der String ein 0-Byte enthält:
Code: | DIM S as String*20
Declare Sub Druck (St as String)
S="Hallo"+CHR(0)+"Du"
Druck(S)
? "done..."
sleep
end
Sub Druck (St as String)
? "*";St;"*"
end Sub |
Es wird "HalloDu" ausgegeben (warum das chr(0) einfach "verschluckt wird, verstehe ich allerdings nicht).
Das nächste Beispiel ist näher an meiner Anwendung (ich habe Datumswerte in einem 4-Byte-String fester Länge gespeichert. Eine Funktion soll z.B. das Datum im Format "TT.MM.JJJJ" ausgeben).
Hier übergebe ich eine Integer-Zahl, die mittels MKI in einem (fixed-)String gespeichert wurde, an eine Funktion. Die Zahl im Beispiel ist so gewählt, dass 0-Bytes enthalten sind.
Hier wird nicht nur der fixed-String "falsch" übergeben, sondern zu allem Überfluss wird auch der ursprüngliche Inhalt des String durch die Übergabe geändert.
Und das verstehe ich nun überhaupt nicht mehr.
Code: | DIM as integer Z
DIM as STRING*4 SF
Declare Function Value (S as String) as integer
Z=65537
SF=MKI(Z)
Print "Zahl original : "; CVI(SF)
Print "Wert : "; Value(SF)
Print "Zahl nach Function: "; CVI(SF)
Print "Done..."
sleep
End
Function Value (S as String) as integer
Value=CVI(S)
end function |
Kann mich jemand erhellen ?
Ganz egal ob FB die Parameter per ByRef (Standard bei Stings, bei Fixed Strings?) oder ByVal übergibt, dürfte sich der Inhalt der übergebenen Variablen doch nicht ändern, wenn die aufgerufene Funktion nichts verändert ?!?
Grüße
Rainer
P.S.: Ich finde FreeBasic wirklich eine tolle Sache, aber die Stringbehandlung ist zum  |
|
Nach oben |
|
 |
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 110
|
Verfasst am: 08.01.2014, 03:07 Titel: |
|
|
Zitat: | Kann mich jemand erhellen ? |
Die Funktion erwartet einen String, du übergibst aber einen String * 4.
Konnte ich jetzt nicht mit FB testen.
PB kommt mit einer Fehlermeldung. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 08.01.2014, 09:05 Titel: |
|
|
Ich bin auch erstaunt. Offenbar ist es nicht erlaubt, einen String mit fester Länge als Parameter an eine Function zu übergeben. In der Befehlsreferenz habe ich dazu nichts gefunden. Mit einem String ohne Längenfestlegung arbeitet das Programm korrekt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 08.01.2014, 12:39 Titel: Binär-Rohdaten-Umwandlungen nach String sind nicht nötig |
|
|
Hallo,
wenn man entweder ZString als Argumenttyp verwendet oder den String BYVAL übergibt, wird die Variable immerhin durch den Funktionsaufruf nicht beschädigt. Ich glaube, mich dunkel zu erinnern, dass FB intern für Strings fester Länge ZString benutzt.
Allerdings kommt auch dann in der Funktion nicht der richtige Wert an, weil ja bei 0 terminiert wird und die "Binärzeichenkette" mit einem Nullbyte anfängt.
Generell muss man aber sagen, dass solche Binär-Rohdaten-Umwandlungen von Typ (Integer, Double, ...) zu String in FreeBASIC vollkommen überflüssig sind. Das macht eigentlich keiner mehr. Wozu sollte man die 4 Bytes eines Integers o. ä. erst in einen 4 Byte langen String packen, wenn man mit dem Integer direkt alles machen kann?
Man kann z. B. einen Pointer, der eigentlich auf einen Integer zeigt, auch mit CAST als Pointer auf einen Float "umdeuten" und dann so den Integer-Rohinhalt als Gleitkommazahl interpretieren lassen. Mir fällt spontan nichts in FB ein, wofür man mit MKI / CVI und Konsorten String-Operationen auf Binärdaten machen müsste (Rückwärtskompatibilität zu alten QB-Programmen von "anno dazumal" einmal ausgenommen).
Stattdessen kann man sich z. B. mit (C)ALLOCATE Speicherblöcke beliebiger Länge erstellen lassen. Oder man kann ein UBYTE()-Array verwenden. Dann hat man auch gleich Zugriff auf die einzelnen Bytes und muss sie nicht mit MID(...) aus einem n Byte langen String raussuchen.
Die primitiven Datentypen kann man in FB auch direkt in Dateien schreiben und auslesen (Dateimodus BINARY). Also man muss einen Integer nicht erst in einen 4-Byte-Binärstring verwandeln, um ihn als 4-Byte-Datum in eine Datei zu schreiben (statt als Dezimalrepräsentation variabler Länge).
Vielleicht kannst du den Anwendungsfall konkret beschreiben. Dann finden sich vielleicht bessere Lösungen als diese String-Umwandlungen. Die Rohdaten, z. B. eines Integers oder einer Gleitkommazahl, erst nach String umzuwandeln, um dann etwas damit zu tun, ist in FB einfach überflüssig geworden. In FB hat man auf jedes Byte direkten Zugriff, ohne solche Umwege ("von hier aus über Oslo nach Rom reisen") einbauen zu müssen, die auch noch für Fehler sorgen können.
Du kannst ja mal dieses Beispiel hier testen:
Code: | Declare Sub ShowBytes (byval x As Integer)
Dim i As Integer
i = 65537
'i = 255
Print "Wert im Dezimalsystem: " & i
Print "Ein Integer hat wie viele Bytes? " & SizeOf(Integer)
Print "Wert im Dualsystem: " & Bin(i, SizeOf(Integer)*8) 'Anzahl Bytes * 8 Bits
Print "---"
ShowBytes(i)
Print "---"
Print "i dezimal nach der SUB: " & i
Const Dateiname = "TimesChange.dat"
Print
Print "Schreibe den Integer in die Datei " & Dateiname & "..."
'Datei "blanko" ueberschreiben:
Open Dateiname For Output As #1
Close #1
' => Datei ist jetzt leer / ueberschrieben.
'Den Integer in die Datei schreiben:
Open Dateiname For Binary As #1
Put #1, , i
Close #1
' => Die Datei ist jetzt genau 4 Bytes lang, egal, welchen Wert der Integer hat.
Print "Fertig."
Sleep
End
Sub ShowBytes (byval x As Integer)
'http://de.wikipedia.org/wiki/Byte-Reihenfolge
dim b As UByte Ptr
b = Cast(UByte Ptr, @x) 'Zeiger auf Integervariable als Zeiger auf Byte umdeuten
for i As Integer = 1 To SizeOf(Integer) 'Die Bytes des Integers durchlaufen
Print "Das " & i & ". Byte in deinem Integer ist: &H" & Hex(*b, 2) & " (oder dezimal: " & *b & ")"
b += 1 ' Pointer um 1 erhoehen, um zum naechsten Byte zu kommen
next i
End Sub |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 08.01.2014, 15:09 Titel: |
|
|
Zitat: | Zu meiner Überraschung funktioniert das in folgendem Beispiel auch, wenn der String ein 0-Byte enthält |
Ein String darf durchaus 0-Bytes enthalten; diese können dann halt am Bildschirm nicht dargestellt werden. Sie terminieren aber den String nicht. ZSTRING und WSTRING dürfen im Gegensatz dazu kein 0-Byte enthalten bzw. werden von diesem terminiert. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
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.
|
|