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:

stuerzt CAllocate mein Programm???

 
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
Eastler_dart



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

BeitragVerfasst am: 11.10.2005, 17:54    Titel: stuerzt CAllocate mein Programm??? Antworten mit Zitat

Hallo erst mal.

Brauch nochmal eure Hilfe.

Folgende Fakten:
Arbeite unter W98SE
un entsrechendem FreeBasic 014b
Screen 18,8
(also 640x480 bei 8bit/256 Farben)

und dabei will ich Bildschirminhalte
sichern zum restaurieren.
Mit GET sichern,
Mit PUT restaurieren.

Und wie in anderem Thread schon befragt,
das ganze in einer SUB, ohne Eintraege
im Hauptteil des Basic-Codes.

Also Callocate ich Speicher mit:
Code:
STATIC AS INTEGER PTR BUScrSavePuffer(20):'Für 21 Sicherungen Buffers anlegen

Dimme ich ein Variablenarray mit 0-20 Felder, in denen die Adressen der Sicherungen liegen.

Auf Bedarf hole ich den Speicher mit:
Code:

    Breite%=BUB%(BuNr%)+2+BUShadowWidth%(BuNr%)
    Hoehe%=BUH%(BuNr%)+2+BUShadowWidth%(BuNr%)
    Groesse%=(  ((Breite%+2)*(Hoehe%+2)) \2)  +8
    IF ScrSavePuffer(BuNr%)=0 THEN ScrSavePuffer(BuNr%) = CALLOCATE( SIZEOF(INTEGER) * Groesse% )

In der Verzweiflung hab ich bereits bei Breite% und Hoehe% jeweils noch 2pixel dazugezaehlt
Auch in der Berechnung von Groesse% nochmals je weitere 2 Pixel. Und statt 4 Bytes, sogar 8 dazugezaehlt.
Es gab auch schon einen Versuch, da hab ich statt 8 volle 8000Bytes nochmal dazugezaehlt, immer noch Fehler.
An der Groesse scheint es nicht zu liegen.

Ach ja, Breite% * Hoehe% Teile ich durch 2, weil ich in Integer(=2Bytes) den Speicherbedarf errechne.
Denke mal, das ist so richtig.


Der Vollstaendigkeit halber noch das Sichern:
Code:

    GET ( BUX%(BuNr%)-1 , BUY%(BuNr%)-1 )-( BUX%(BuNr%)+Breite% , BUY%(BuNr%)+Hoehe%), ScrSavePuffer(BuNr%)

und das Restaurieren:
Code:

    PUT (BUX%(BuNr%)-1,BUY%(BuNr%)-1), ScrSavePuffer(BuNr%), PSET
    DEALLOCATE(ScrSavePuffer(BuNr%))



So, nun hoffe ich, hier erst mal alle relevanten Zeilen
aufgefuehrt zu haben.

Jetzt das Problem:
Kurz gesagt, Windows bricht das Programm per Fehlermeldung ab:
Programm verursacht einen Fehler durch eine ungueltige Seite

Aber nicht immer !
beim testen nach dem Erstellen lief unter (BuNr%) = 1,4,6,9,12,14 alles super,
mehrfach per Restaurieren bild wieder weg, wieder hin, wieder restaurieren,
an anderer Position zeigen, wieder restaurieren,
alles ueberhaupt kein Problem.
Aber wie gesagt, nur bei bestimmten BuNr%-Werten.
(stellt die jeweilige Array-Index-Nr dar,
unter der alle buttons nahezu identische Werte liegen haben)

Mach ich das gleiche z.B. mit BuNr%=0 oder 2 oder 3 oder 5,
sofort Programmabbruch.
Dachte dann, Callocateter Speicher reicht nicht,
dann die (siehe oben) je 2 pixel auf Breite und Hoehe dazugenommen,
dass mehr Speicher reserviert wird.
Jetzt ploetzlich gehts mit ganz anderen Index-Nummern einwandfrei,
und die, die bisher gingen, stuerzen das Programm.


Hab mir auch schon die Adressen des Callocateten Speichers angeguckt,
jeweils die Groesse% dazugerechnet, ueberlappen sich nicht.


VERMUTUNG:
Die Adressen werden ja von FreeBasic festgelegt, das wird wohl so stimmen.
Aber bei Groesse koennt ich mir vorstellen, das sowas Computereigenes
dahintersteckt, wie z.B. Groessen muessen durch 16 teilbar sein, oder so,
ich meine halt, dass meine Groessenberechnung nicht den gesamten
benoetigten Speicher ermittelt und dadurch doch Ueberlappung.
Dabei sollten aber jede 2. Index-Nr betroffen sein, was ja so nicht
der Fall ist.
So richtig ne Idee hab ich nun nicht mehr, vielleicht seht Ihr
wo die Saege klemmt.

Viel Spaß beim gruebeln (ich habs aufgegeben)
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Eastler_dart



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

BeitragVerfasst am: 11.10.2005, 20:36    Titel: Antworten mit Zitat

Ok Leute, Entwarnung

Habs selber gefunden mit dem Kopf durch die Mauer wollen

wenn man zum Callocaten prüft, ob die ZielAdressvariable = 0 ist
gehts schief, wenn man zwischendurch DeAllocatet,
aber die ZielAdressVariable nicht mit "=0" wieder auf null setzt.
Beim nächsten Aufruf sollte neu CAllocatet werden,
aber weil die (nicht mehr reservierte) Speicheradresse immer
noch in der ZielAdressVariable stand, wurde nicht neu
Speicher reserviert.

Jetzt funzt das ganze einwandfrei!

Danke trotzdem für alles

Euer Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
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