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:

[gelöst] String-Array verursacht Fehler:

 
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
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 14.11.2007, 17:59    Titel: [gelöst] String-Array verursacht Fehler: Antworten mit Zitat

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 14.11.2007, 18:14    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 15.11.2007, 09:53    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 15.11.2007, 12:37    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 15.11.2007, 12:48    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 15.11.2007, 15:47    Titel: Antworten mit Zitat

kein Problem.

Is Übrigens hier zu finden:
http://www.freebasic-portal.de/ -> Menu: Befehlsreferenz -> Alphabetische Befehlsreferenz -> R -> ReDim


JimJim
XUN
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 15.11.2007, 16:12    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 15.11.2007, 16:24    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 15.11.2007, 16:52    Titel: Antworten mit Zitat

Jau, habs jetzt auch so gemaucht. Danke nochmal für die Tips. Daumen rauf!
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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