mikrocontroller.net

Forum: PC-Programmierung C gesammte Konsole auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Llemaban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Ich suche verzweifelt einen Weg, um in C den gesamten angezeigten Text 
auf der Konsole auszulesen, um diesen zwischenzuspeichern.

Hintergrund:
Ich bin dabei einige Spiele zu programmieren, welche auf der Konsole 
laufen. Beim drücken von ESC soll das Spiel unterbrochen werden und sich 
in der Mitte des "Spielfeldes" ein "Unterbruch-Fenster" über den Rest 
aufbauen:
Beispiel Snake-Feld:     Beispiel bei Unterbrechung:
+--------------------+   +--------------------+
|                    |   |                    |
| ooooooooo          |   | ooooooooo          |
|         o          |   |   +============+   |
|         o          |   |   |            |   |
|         o          |   |   | Unterbruch |   |
|         oooo>   $  |   |   |            |$  |
|                    |   |   |            |   |
|                    |   |   +============+   |
|                    |   |                    |
|                    |   |                    |
+--------------------+   +--------------------+

Sobald ich das "Unterbruch-Fenster" wieder schliesse, sollte das 
vorherige "Spielfeld" wieder eingeblendet (bzw aufgebaut) werden.
Aufbau des "Unterbruch-Fenster" ist kein Problem, aber leider weiss ich 
nicht, wie ich direkt aus der Konsole auslesen kann, um dessen Inhalt 
zuvor zwischenzuspeichern.

lg Llemaban

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
4 lesenswert
nicht lesenswert
Merke dir doch besser, was vorher dort stand.

Autor: Nase (Gast)
Datum:

Bewertung
5 lesenswert
nicht lesenswert
Llemaban schrieb:
> wie ich direkt aus der Konsole auslesen kann, um dessen Inhalt
> zuvor zwischenzuspeichern.

Garnicht.

Historische Erklärung: "Konsole" war früher ein Nadeldrucker. Wie 
wolltest du da irgendetwas auslesen?

Zeitgemäße Erklärung: Google mal nach "ncurses", damit wirst du 
sicherlich weiterkommen.

Autor: Max M. (jens2001)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Llemaban schrieb:
> einige Spiele zu programmieren, welche auf der Konsole
> laufen

Llemaban schrieb:
> aus der Konsole auslesen

Wiso willst du da was "auslesen"?
Du musst doch selbst am besten wissen was du da hinein geschrieben hast!

Autor: Mag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. so falsch ist der Gedanke garnicht. Zu Zeiten von DOS lagen die Daten 
ab Adresse 0x800, und eine Kopie mit memcpy war ein effektiver Weg.
Unter Linux wird das praktisch nichts mehr, da die Konsole anders 
abstrahiert ist (als Drucker bzw. Stream).

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Wenn du das snake-Feld einmal gezeichnet hast, wirst du es doch noch 
einmal, nach dem Schließen des Fensters, schaffen...

Autor: Llemaban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für alle Antworten.

Nase schrieb:
> Google mal nach "ncurses"

Danke, die kannte ich bisher noch nicht. Sieht auch ziemlich mächtig 
aus...

Mag schrieb:
> Zu Zeiten von DOS lagen die Daten
> ab Adresse 0x800, und eine Kopie mit memcpy war ein effektiver Weg.

Genau an sowas hatte ich gedacht, nur habe ich keine Ahnung, an welcher 
Adresse das Zeugs jetzt drin liegt (Win10).

Meine Idee war eben NICHT alles doppelt zu speichern. Ich sehe jedoch 
langsam ein, dass dies der einfachste Weg sein wird.
Das Snake-Beispiel soll es nur veranschaulichen. Dahinter steckt eine 
ganze Reihe an verschiedenen Spielen, welche ich immer durch Aufruf der 
gleichen Unterbruch-Funktion unterbrechen möchte.
In dem Fall übergebe ich der Funktion einen Pointer zum 
Zwischenspeicher...

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Llemaban schrieb:
> Das Snake-Beispiel soll es nur veranschaulichen. Dahinter steckt eine
> ganze Reihe an verschiedenen Spielen, welche ich immer durch Aufruf der
> gleichen Unterbruch-Funktion unterbrechen möchte.
> In dem Fall übergebe ich der Funktion einen Pointer zum
> Zwischenspeicher...

Ja speichert denn das Spiel nicht den eigenen Zustand? Snake muss doch 
wissen wo die Schlange ist, Pong muss wissen wo der Ball ist... Wozu da 
noch einen zusätzlichen Zwischenspeicher bauen?

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Llemaban schrieb:
> Meine Idee war eben NICHT alles doppelt zu speichern.

Nimm doch einfach ncurses wie jeder andere es auch tun würde statt Dir 
da umständlich einen abzuwürgen und das perfekt funktionierende Rad 
unvollständig und fehlerbehaftet neu zu erfinden.

Oder wenn Du zufällig mit Lazarus/FPC unterwegs bist dann nimm Free 
Vision, das ist das gleiche in grün und objektorientiert und läuft 
ebenfalls überall. Oder Turbo Vision wenn Du mit Borland Tools 
arbeitest.

Autor: Llemaban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd K. schrieb:
> Nimm doch einfach ncurses wie jeder andere es auch tun würde

Die schaue ich mir schon an :)

Dr. Sommer schrieb:
> Ja speichert denn das Spiel nicht den eigenen Zustand?

Gewiss doch, aber ich wollte es gerne über die Unterbruch-Funktion 
realisieren und nicht jedes mal auf die eigentlichen Funktionen des 
Spieles zurückgreifen.

Danke an die Antworten!

Autor: Heiko L. (zer0)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Llemaban schrieb:
> Genau an sowas hatte ich gedacht, nur habe ich keine Ahnung, an welcher
> Adresse das Zeugs jetzt drin liegt (Win10).

Da musst du wohl die API welzen
https://docs.microsoft.com/en-us/windows/console/console-functions

ist ein bisschen frickelig, aber mit ein bisschen Übung bekommt man auch 
einen Backbuffer-Readback für full-scene Lichtbrechungseffekte in einer 
ASCII-art 3d engine hin. :)

: Bearbeitet durch User
Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Llemaban schrieb:
> (Win10)

Ah, na immerhin wissen wir jetzt mal, dass es um Windows geht.

Llemaban schrieb:
> Dr. Sommer schrieb:
>> Ja speichert denn das Spiel nicht den eigenen Zustand?
>
> Gewiss doch, aber ich wollte es gerne über die Unterbruch-Funktion
> realisieren und nicht jedes mal auf die eigentlichen Funktionen des
> Spieles zurückgreifen.

Verstehe ich nicht. Wie soll das Spiel denn so ganz allgemein 
weiterlaufen, ohne auf dessen Funktionen "zurückzugreifen"? Und wenn es 
weiterläuft, muss es doch sowieso neu zeichnen.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Man findet den Linux-Console-Inhalt in /dev/vcs bzw. /dev/vcs1, 
/dev/vcs2 usw.

cat /dev/vcs1

zeigt den Inhalt von /dev/tty1, also der 1. Linux-Console an, allerdings 
ohne die Zeilenumbrüche. Bei einer Textauflösung von 80x25 Zeichen sind 
dies exakt 2000 Zeichen:

# wc -c /dev/vcs1
2000

Das geht natürlich nur mit der entsprechenden Berechtigung, also in der 
Regel root. Außer man ändert die Berechtigung von /dev/vcsX.

Aber ich schließe mich den Vorrednern an: Entweder merkt man sich den 
ausgegebenen Bildschirminhalt selbst oder man benutzt einfach ncurses.

: Bearbeitet durch Moderator
Autor: Vlad T. (vlad_tepesch)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Llemaban schrieb:
> Gewiss doch, aber ich wollte es gerne über die Unterbruch-Funktion
> realisieren und nicht jedes mal auf die eigentlichen Funktionen des
> Spieles zurückgreifen.
>

Ich glaub da ist was am design faul.
Klassischerweise sieht ein Spiel doch so aus:
enum GameState{
  GS_Menu,
  GS_Action,
  GS_GameOver,
  GS_Pause,
  GS_Exit
};


struct Game{
  GameState state;
  //Andere Spieldate
}game;


void irgendneMainFunktion{
  while(game.state != GS_Exit){
    leseInput;
    updateZustand;
    erzeugeAusgabe;
  }
}
Je nach Art des oder programmtechnischen Design des Spiels, hat auch 
jeder Zustand diese Funktionen, oder jede dieser Funktionen hat eine 
Unterscheidung, in welchem Zustand das Spiel gerade ist (Menü, 
Hauptspiel, Inventar, ..., Pause)

Im Falle von "Pause" macht "updateZustand" eben gar nix, und 
"erzeugeAusgabe" ruft nur die Pause-Bildschirm-Zeichnen Funktion auf 
(die braucht dann von dem Spiel auch überhaupt nix wissen). Erst wenn in 
"leseInput" entschieden wird, dass der Benutzer den Zustand 
zurückwechselt, erzeugt "erzeugeAusgabe" wieder den Spielbildschrim.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.