Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 14.11.2007, 17:59 Titel: [gelöst] String-Array verursacht Fehler: |
|
|
Hallo, ich habe schon wieder ein Problem (immerhin konnte ich ja schon mal jemandem anderen helfen).
Ich möchte den Inhalt eines Bildschirmbereiches in einem Buffer als String zwischenspeichern, um ihn später wieder herzustellen. Dazu habe ich folgende Routine:
Code: | Sub SaveRestoreBackgnd(ByRef Flag As Integer, WindowFrame As Win, Buffer() As String)static
Dim Y As Integer
Dim X As Integer
Dim ForeColour As Integer
DIM BackColour As Integer
If Flag = 1 Then
ForeColour = SCREEN(WindowFrame.PosY, WindowFrame.PosX, 1) MOD 16
BackColour = SCREEN(WindowFrame.PosY, WindowFrame.PosX, 1) \ 16
'Print "WindowFrame:";WindowFrame.LengthX;WindowFrame.LengthY
For Y = 0 To WindowFrame.LengthY
For X = 0 To WindowFrame.LengthX
'Print X;Y
Buffer(Y) = Buffer(Y) + Chr(Screen(WindowFrame.PosY + Y, WindowFrame.PosX + X))
Next X
Next Y |
Genau gesagt soll die Sub immer eine Zeile des Bereiches abScreenen, die Zeichen darin als String in Buffer() speichern, dann in die nächste Zeile springen usw.
Beim Abspielen des Programms beendet Windows das Programm mit der Fehlermeldung "Ungültiger Vorgang", und zwar genau dann, wenn Y = 1 wird. Woran liegt das? Muß ich Buffer als 2-dimensionales Array einrichten? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett.
Zuletzt bearbeitet von Elektronix am 15.11.2007, 16:53, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 14.11.2007, 18:14 Titel: |
|
|
Da du in der SUB etwas an Buffer änderst (insbesondere die Länge seiner Elemente) würde ich Buffer BYREF übergeben oder in der SUB eine Kopie davon anlegen und mit der weiterarbeiten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 15.11.2007, 09:53 Titel: |
|
|
Wie sich aus der Parameterliste sehen läßt, ist Buffer ein Array. Soweit ich weiß, werden Arrays immer ByRef übergeben, auch, wenn man das nicht deklariert.
Kann mich natürlich irren. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.11.2007, 12:37 Titel: |
|
|
1. Das mit ByRef ist nicht nötig. Du hast recht: Arrays werden GRUNDSÄTZLICH als ByRef in Deklarationen Deklariert, und ByVal ist nicht möglich, in den Deklarationen, udn führt zu einem Compiler fehler.
2. Bei 1 deshalb, weil du ein Undimensioniertes array hast.
Bevor du Daten ein ein Mehrdimensionales Array Pumpen kannst, must du dem Array natürlich mitteilen, wie gross es sein soll.
ein Beispiel:
Code: | Dim Array() as Byte
Dim X as Byte
For X = 1 to 10
Array(X) = X
Next |
Hier entsteht ein Fehler ab X = 1. Das liegt daran, weil das Array zur zeit 0 Elemente besizt.
Daher muss man das Array "Redimensionieren". Das Macht man mit "ReDim" und optional "Preserve"
Redim bewirkt, das die Elemente des Array verändert werden, bzw die Anzahl davon.
Preserve bewirkt, das bei einem Redim die Einträge erhalten bleiben.
Ohne Preserve wird das Array Gelöscht.
Code: | Dim Array() as Byte
Dim X as Byte
Redim Array(10) as Byte 'Redimensionierung, Ohne den Inhalt beizubehalten
For X = 1 to 10
Array(X) = X
Next |
Code: | Dim Array() as Byte
Dim X as Byte
Redim Preserve Array(10) as Byte 'Redimensionierung, Inhalt beibehalten!
For X = 1 to 10
Array(X) = X
Next |
Warum Preserve? .. nun .. ein Beispiel: Du weist bei einem Durchlauf nicht genau, wie viele Elemente in das Array kommen sollen. Dadurch kannst du das Array nachträglich redimensionieren:
Code: | Dim Array() as Byte
Dim ArrayC as Byte
Dim X as Byte
For X = 1 to 10
If (X Mod 2) = 0 Then
ArrayC += 1 'ArrayAnzahl um 1 erhöhen
Redim Preserve Array(ArrayC) as Byte 'Anzahl ArrayElemente Anpassen, und Daten im Array beibehalten. Sonst wird der Inhalt im Array gelöscht.
Array(ArrayC) = X
End If
Next |
PS: Steht in der Doku von Freebasic-Portal.de drin.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 15.11.2007, 12:48 Titel: |
|
|
Danke für die ausführliche Antwort. Habs noch nicht probiert, klingt aber logisch.
In der Doku hab ich schon nachgesehen. Das Problem ist: Ich weiß, daß es drin steht, aber nicht WO und wie man es findet.
Die Tutorials müßten um solche Feinheiten mal ergänzt werden (kann ich vielleicht mal bei Gelegenheit übernehmen).
[EDIT] Bingo, hat geklappt! _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 15.11.2007, 16:12 Titel: |
|
|
Ja, ReDim kannte ich schon. Ich meinte die Feinheit, daß man übergebene Arrays neu dimensionieren muß. Ich habe die Array-Größe nämlich bei der ersten Dimensionierung schon festgelegt gehabt- also praktisch mit Größe übergeben. Wußte nicht, daß der Größenparameter bei der Übergabe verloren geht. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.11.2007, 16:24 Titel: |
|
|
Das sollte eigentlich nicht der fall sein ... schau mal nach, ob die Gröse wirklich festgelegt wurde.
z.B. befor du die Funktion aufrufst, gib einfach mal "Print LBound(Array)" aus .. vieleicht past die gröse nicht, wenn du sie berechnet hast.
Aber, normalerweise geht das nicht verlohren.
Noch n kleiner Tip: Man sollte solche Dinge, die esenziel zusammenhängen immer in einer Funktion zusammen packen, da es bei der weitergabe sonst zu problemen kommen kann.
Also .. die Grösenberechnung des Arrays, und die Redimensionierung mit in die Funktion. Das macht die fehlersuche auch etwas leichter.
JimJim
XUN _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 15.11.2007, 16:52 Titel: |
|
|
Jau, habs jetzt auch so gemaucht. Danke nochmal für die Tips.  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
|