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:

Bildschirm inkl. Farben schnell auslesen?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 20.02.2005, 19:24    Titel: Bildschirm inkl. Farben schnell auslesen? Antworten mit Zitat

Also, mein Problem ist, dass ich den Bildschirm (SCREEN 0) auslesen will und in einer Variable speichern, so das ich ihn später wieder ausgeben kann happy
Das Problem ist aber, das der Bildschirm farbige Zeichen enthält, und dass das auslesen der 2000 Zeichen mit SCREEN(x, y, z) recht langsam ist und auch recht viel Speicher frisst ...

Gibt es nicht eine schnellere Methode, die z.B. direkt auf den Bildschirmspeicher zugreifft (Ich kenn ich da nicht so aus).

Danke für die Hilfe!


Zuletzt bearbeitet von gandro am 20.02.2005, 20:14, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 20.02.2005, 19:52    Titel: Antworten mit Zitat

Das geht tatsächlich:

Code:

DIM Bildschirm (79, 24, 1) AS INTEGER
'Array, in dem später dr bildschirm gespeichert wird.

DIM offset AS LONG
'Adresse, auf die zugegriffen wird.


DEF SEG=&HB800
'Greife auf Bildschirmspeicher zu

FOR spalte = 0 TO 79
 FOR zeile = 0 TO 24
  FOR typ = 0 TO 1
'typ bedeutet entweder farbe oder zeichen
offset = (zeile * 80 + spalte) * 2 + typ
Bildschirm (spalte, zeile, typ) = PEEK(offset)
  NEXT
 NEXT
NEXT

DEF SEG
'Standardsegment wiederherstellen - nicht wichtig, aber man sollte
'es trotzdem tun *g*


Ich weiß nicht sicher, ob das Array so ohne weiteres in den BASIC-Speicher passt... wennd du QB 4.5 oder höher hast, kannst du es mit dem parameter

QB /AH

Aufrufen, dann sollte es keine probleme haben.
Oder, du speicherst direkt in eine datei.

aber das bleibt dir mal überlassen *g*


Viel spaß damit!
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 20.02.2005, 19:56    Titel: Antworten mit Zitat

Hallo!

Der Bildschirmspeicher beginnt im Segment &HA000. Lies ihn mit DEF SEG und PEEK aus. Dann geht es deutlich schneller.

DEF SEG = &HA000
?? Tut mir leid, aber ih habe den Aufbau dieses Speichers mal gewusst, aber jetzt weiß ich ihn nicht mehr traurig

Halt; schau mal auf www.east-power-soft.de in den Downloads nach; vielleicht ist da was, was du suchst...
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 20.02.2005, 19:58    Titel: Antworten mit Zitat

Jaja, das VIDEO-Segment ist &hA000, aber screen 0 verwendet &hb800.
Ich denk mal, das tut zum video-modus-aufbau spar ich mir jetzt, davon gibts genug *g*
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 20.02.2005, 20:01    Titel: Antworten mit Zitat

erstmal danke für die antworten ...

aber zum code von Dusky_Joe: Wie kann ich denn jetzt das Zeuges wieder ausgeben?
Ich hab leider gar keine Ahnung in solchen Sachen ...


Zuletzt bearbeitet von gandro am 20.02.2005, 20:14, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 20.02.2005, 20:07    Titel: Antworten mit Zitat

Das is kein problem.

dazu POKEst du das Array einfach wieder:

Code:

...

FOR spalte = 0 TO 79
 FOR zeile = 0 TO 24
  FOR typ = 0 TO 1
'typ bedeutet entweder farbe oder zeichen
offset = (zeile * 80 + spalte) * 2 + typ
POKE (offset), Bildschirm (spalte, zeile, typ)
  NEXT
 NEXT
NEXT



Ich kann dir übrigens nur die QB-Monster-FAQ empfehlen, da ist EXCELLENT erklärt, wie man mit DEF SEG, PEEK und POKE arbeitet.
(Kapitel direkter speichrzugriff, oder so *g*)

siehe: www.qbasic.de
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 20.02.2005, 20:10    Titel: Antworten mit Zitat

also in der QB-MonFAQ hab ich gestern den ganzen Tag nach einer solchen Routine gesucht ...

Aber jetzt funktionierts

Danke vielmals ... lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 20.02.2005, 20:16    Titel: Antworten mit Zitat

Sicher, ne direkte routine wirste wohl nicht finden, aber wenn man sich des durchliest, sollte man zumindest (irgendwann *g*) verstehen, wie denn der ram so organisiert ist *g*

naja, is eigentlich ganz einach.
Du hast 1 MB ram. (von Dos aus gesehen, unabhängig, wie groß deine echte ram-karte ist *g*)

Wenn du jetzt von einer beliebigen stelle ein byte lesen oder schreiben willst, brauchst du eine adresse.
So eine adresse ist in ein segment und ein offset aufgeteilt. mit DEF SEG= setzt du das Segment, mit PEEK(offset) liest du von nem offset ein, und mit POKE offset, byte schreibst du an das offset.

wichtige segmente sind:
&HA000 => Speicher für grafikmodi
&HB800 => Speicher für Textmodi
&H0040 => Bios-Segment

Das meiste lernste dann durch rumprobieren.
Sei aber vorsichtig beim Bios-Segment!
Da kannste einiges kaputtmachen, wenn du einfach so rum-POKEst *g*

aber zum glück gibts auch dafür die qbmonfaq *g*
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 20.02.2005, 20:47    Titel: Ergänzung zu SCREEN 0: Videoseiten Antworten mit Zitat

B800:0000 als Videospeicheradresse gilt speziell für
Code:
SCREEN 0,,0,0

d.h. Videoseite 0
=> bei den übrigen Videoseiten gelten entsprechend höhere Adressen. Hierbei kommt es noch darauf an, ob man sich im 80- oder 40-Zeichenmodus befindet, ebenso, ob 25, 43 oder 50 Zeilen.

Bei 40x25 gilt der 2048-Byte-Sprung, bei 80x25 der 4096-Byte-Sprung. Bei 43 und 50 Zeilen hat es dagegen keine Lücken. Beispiele:
Code:
SCREEN 0
WIDTH 40, 25
SCREEN ,,3, 3
DEF SEG=&HB800
POKE 3*2048, 65  ' linke obere Ecke


Code:
SCREEN 0
WIDTH 40, 43
SCREEN ,,1, 1
DEF SEG=&HB800
POKE 1*(40*43*2), 65  ' linke obere Ecke

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 31.03.2005, 19:44    Titel: Antworten mit Zitat

nun, hier bin ich wieder...

Nach einer Pause will ich jetzt wieder etwas QB proggen, steh aber wieder vor einem Problem:

Ich möchte jetzt hier nicht nur einen Bildschirm auslesen, sondern 7 (also eigentilch 7mal ). natürlich nicht hintereindander, sondern so, dass ich zwischen den Bildschirmen wechseln kann. Nun ist mein Problem wie ich das in eine Datei speichern kann (per Array ist das viel zu speicherfressend). Evtl. noch mit Zusatzinformationen in der Selben Datei z.B. aktulle Cursorposition und so...


Wäre kul wenn ihr ne Lösung finden würdet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 31.03.2005, 20:18    Titel: Antworten mit Zitat

mach doch ein string-array:

Code:

DIM Bildschirm (1 TO 25) AS STRING * 80


und dann machste halt
Code:

MID$(Bildschirm(zeile), Spalte) = PEEK(...)



sollte schonender sein, weil dann wirklich nur 1 byte pro stelle gespeichert wird.
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 31.03.2005, 20:22    Titel: Antworten mit Zitat

Ich werd dir meine Routine schicken, dauert einen Moment. Sobald ich sie hab, werde ich dieses Posting mit der Lösung bearbeiten. (Ich will mir ja eine nicht zu hohe Postingzahl erschleichen zwinkern )

cu, Stormy
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Stephan



Anmeldungsdatum: 05.10.2004
Beiträge: 358
Wohnort: Hessen - 20km Nördlich von Frankfurt am Main

BeitragVerfasst am: 31.03.2005, 20:28    Titel: Antworten mit Zitat

Vielleicht schonender, aber nicht schneller,
das dieses String <-> Integer hin und her gewurschtel zeit kostet.

Code:

MID$(Bildschirm(zeile), Spalte) = PEEK(...)


Fehlt da nicht unter anderem ein STR$()
_________________
'Wir schätzen die Zeit erst, wenn uns nicht mehr viel davon geblieben ist.'
Leo Tolstoi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 31.03.2005, 21:12    Titel: Antworten mit Zitat

Sicher, sicher, aber es sollte genügen. ansonsten kannst es ja mit direktem speicherzugriff versuchen:

Code:

DIM Bildschirmpuffer (1 TO 25) AS STRING * 80
Segment = VARSEG(Bildschirmpuffer())
Offset = VARPTR(Bildschirmpuffer())
DEF SEG = Segment


Funzt, aber dann haste wieder das selbe, wie beim einmaligen auslesen.


Tip:
Verwende einfach mehrere Bildschirmseiten:

SCREEN 0, , 1

und du hast nen völlig leeren bildschirm, aber der alte is immer noch gespeichert. den bekommst du mit

SCREEN 0, , 0 zurück.


kann sein, dass ein komma zu wenig da is....
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 31.03.2005, 22:09    Titel: Antworten mit Zitat

gandro hat Folgendes geschrieben:
Nun ist mein Problem wie ich das in eine Datei speichern kann (per Array ist das viel zu speicherfressend).

Nichts Leichteres als das: BSAVE und BLOAD bieten Dir exakt das an, z.B.
Code:
' Bildschirm speichern
DEF SEG=&HB800
BSAVE "BILDSCH.DAT", 0, 4000
' Bildschirm wiederherstellen
DEF SEG=&HB800
BLOAD "BILDSCH.DAT", 0

Zur Cursorposition: Auslesen geht mit POS(0) und CSRLIN, Setzen mit LOCATE, z.B.
Code:
' Position sichern
x% = POS(0)
y% = CSRLIN
' Position wiederherstellen
LOCATE y%, x%

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 31.03.2005, 23:12    Titel: Antworten mit Zitat

... oder auch im BIOS-Seg:

DEF SEG=&H0040
col = PEEK(&H50)
row = PEEP(&H52)

Aber warum kompliziert, wenns auch einfach geht. Nimm lieber dreaels Lösung.
Wollte nur alle Möglichkteiten Anbieten *g*

Übrigens bin ich mir bei den Adressen gar ned ganz sicher. Wenn du's so machen willst, schau am besten in die QBMonFAQ.
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 01.04.2005, 15:25    Titel: Antworten mit Zitat

Dusky_Joe hat Folgendes geschrieben:

Code:

row = PEEP(&H52)


Vor allen Dingen PEEP. mit den Augen rollen lachen lachen lachen zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 01.04.2005, 15:33    Titel: Antworten mit Zitat

Hallo!

Mach dich nicht drüber lustich im Internet ist es fast schon normal dass man sich vesrhcriebt lächeln
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 01.04.2005, 15:41    Titel: Antworten mit Zitat

Quark48 hat Folgendes geschrieben:

im Internet ist es fast schon normal dass man sich vesrhcriebt

Jaja. Schon OK. mit den Augen rollen
Aber wenn's nun mal lustig ist... Zunge rausstrecken
So war's doch nicht gemeint. traurig

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Quark48



Anmeldungsdatum: 16.10.2004
Beiträge: 559
Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern

BeitragVerfasst am: 01.04.2005, 15:48    Titel: Antworten mit Zitat

Hallo!

Aber trozdem sollte man den Leuten ein bisschen SPaß nicht vorenthalten zwinkern
PIEP anstatt POINT... lächeln
Oder anstelle von PRINT GRINT zwinkern

Na egal happy
_________________
Grüßle, Stefan lächeln
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht! happy
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN 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 QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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