Wie am besten in die Konsole Zeichen ausgeben?

Für Fragen von Einsteigern und Programmieranfängern...
Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Jole hat geschrieben:Du vergisst aber das FP nicht mehr direkt in den VRAM schreibt, DirectVideo existiert, soweit ich weiß, nur noch aus Kompatibilitätsgründen. Der gleiche Test mit TP ergibt erst dann eine zeit Differenz wenn DirectVideo auf False gesetzt wird.

Unter FP für Windows läuft der Code nicht.
Und wenn du seinen Post genauer gelesen hättest, hättest du gelesen das er für den 8086 ist.

Jole hat geschrieben:Dafür bietet sich die Prozedur WINDOW an.

'Windows ist murks. Es arbeitet nur relativ zu 'Write' und den übrigen. Die Standardeinstellung von Window sind die der Auflösung. Fällt dir das was ein? ;)

Jole hat geschrieben:Ich persönlich kämme nie wieder auf die Idee Fenster, MsgBoxen u.ä. mit Write/WriteLn oder eigenen VRAM Prozeduren zu zeichnen.

1. Weil ich den Code nicht aufpumpen wollte.
2. Weil ich was eigenes haben wollte und immer noch will.

Jole hat geschrieben:Warum nicht das nutzen was bereits vorhanden ist?

1. Siehe oben.
2. Es wesentlich komplizierter ist als mit Visual Basic für DOS, Delphi oder Lazarus zu machen.

Das habe ich jetzt vor. Denn die Arbeit an der MessageBox ist zu einem eigenen Projekt ausgeartet.
Ich wollte dann die MessageBox nutzen, aber leider (wie gesagt) ist es kompliziert.
Einfach die Unit einbinden und die Funktion aufrufen geht nicht.

@Mathias
Ich habe mal ein kleines bisschen deinen Test-Quellcode angepasst, so das die Aussagen mir was sagen, das es auch unter TP funktioniert und ein paar kosmetische Veränderungen.
Ich habe den Durchlauf auf 1 Million .erhöht.
Da ich immer zwischen TP und FP geändert habe, ist mir was aufgefallen.
Wenn ich für die Schleife den Datentyp von 'Integer' zu 'LongInt' ändere, braucht 'Write' ja ewig bis es durch ist, bei dem VRAM-Durchlauf geht es dann schneller.
Mein Interrupt-Test funktioniert leider unter FP nicht. Ich habe auf 'ShortString' und '{$ASMMODE INTEL}' geachtet.
Aber unter TP ist er langsamer als Write.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Jole »

Nixsager hat geschrieben:Unter FP für Windows läuft der Code nicht.
Und wenn du seinen Post genauer gelesen hättest, hättest du gelesen das er für den 8086 ist.

1: Ich habe nie behauptet das es unter Windows läuft.
2. Das er für einen 8086iger Kompiliert hat hab ich gesehen, es ist aber immer noch ein FBC und kein TPC.

@Mathias: Du könntest ja mal dein Programm durchlaufen lassen und die Zeiten festhalten. Setze dann mal im Hauptprogramm hinter BEGIN die Variable DirectVideo auf False und schau mal ob sich an den Zeiten etwas ändert.
Nixsager hat geschrieben:'Windows ist murks. Es arbeitet nur relativ zu 'Write' und den übrigen. Die Standardeinstellung von Window sind die der Auflösung. Fällt dir das was ein? ;)

Das einzige was da relativ ist, ist die Fensterposition zur Auflösung. Das Window Standardmäßig auf diese Auflösung eingestellt ist ist doch klar, auf was soll sie denn sonst eingestellt sein? :) Im TP Verzeichnis Examples gibt es eine Demo mit namen CRTDEMO.PAS, vielleicht hilft das ja mehr als meine Erklärung.
Nixsager hat geschrieben:Einfach die Unit einbinden und die Funktion aufrufen geht nicht.

Meinst du jetzt die Unit MsgBox? Das Funktioniert nicht! Dazu müsstest du eine Instanz von TApplication erzeugen, erst dann kannst du die MessageBox aufrufen. Beispiel:

Code: Alles auswählen

 
program Test_MsgBox;
uses App, MsgBox;
 
type
  TMyApp = object(TApplication)
    constructor Init;
  end;
 
constructor TMyApp.Init;
begin
  Inherited Init;
  MessageBox(#3'Das wäre jetzt eine Messagebox'#13 + #3'mit zentrierter Textausgabe', nil, mfInformation or mfOKButton);
End;
 
var
   MyApp: TMyApp;
 
Begin
  MyApp.Init;
  MyApp.Run;
  MyApp.Done;
End.
 

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von marcov »

Nixsager hat geschrieben:Hi

Wie gibt man am besten Zeichen in der Konsole aus?
Wenn man über den rechten Rand schreibt, wird die Ausgabe am Anfang der nächsten Zeile fortgeführt.
Der Quellcode von Free Vision ist mir zu hoch, ich habe nur was von MoveBuf mitbekommen.


Siehe mal in die Demoes FPCTRIs und Lister. Die nutzen unit Video direkt ohne der Rest von FV

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

Ich persönlich kämme nie wieder auf die Idee Fenster, MsgBoxen u.ä. mit Write/WriteLn oder eigenen VRAM Prozeduren zu zeichnen.

Gegenwärtig auch nicht mehr, aber zur DOS-Zeiten sah dies anders aus. Da gab es kein Internet, in dem man mal schnell was runterladen konnte.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Jole hat geschrieben:Das einzige was da relativ ist, ist die Fensterposition zur Auflösung. Das Window Standardmäßig auf diese Auflösung eingestellt ist ist doch klar, auf was soll sie denn sonst eingestellt sein? :) Im TP Verzeichnis Examples gibt es eine Demo mit namen CRTDEMO.PAS, vielleicht hilft das ja mehr als meine Erklärung.

Das brauch ich nicht
Wenn ich 'WIndow' nutze arbeitet ClrScr, Write, GotoXY für den mit Window festglegt Bereich.
Also ganz normal, und somit auch wieder keine Lösung

Jole hat geschrieben:Meinst du jetzt die Unit MsgBox? Das Funktioniert nicht! Dazu müsstest du eine Instanz von TApplication erzeugen, erst dann kannst du die MessageBox aufrufen.

Da bin ich dabei. Und das ganze wird jetzt wieder komplizierter. Wenn ich das mache, kriege den Desktop zu sehen, den Mauscursor den ich nicht will weil ihn nicht brauche, die Standard Statusleiste mit 'Alt-X Exit' und die MessageBox reagiert nicht auf die Tastatur.
Für Turbo Vision muss ich mir wohl extra ein Buch holen. Weil so einfach wie mit einer LFM-Datei bei Lazarus ist das auch nicht so ganz, die werden ja zur Laufzeit interpretiert das sie eine Resource sind, und die Fenster nicht per Code erstellt werden. Ich weiß das auch TP Ressourcen hat, aber das muss man auch erst mal verstehen.

Und ich wollt nur eine einfache MessageBox die die eine Frage ausgibt und wo man mit dem drücken eines Knopfes die Abfrage bestätigen kann.
Mir gefällt auch meine MessageBox, nur das mit dem Zeichnen der Textausgabe gibt es bekanntlich Probleme.
Das Array wollte ich ursprünglich um das aktuelle Bild zu sichern, um es nach dem schließen der MessageBox wiederherzustellen.
Dann dachte ich daran wie das ist wenn ich mehrere Boxen habe? Da dachte ich ja an ein dynamisches Array, aber für jede Box ein Array das sind zu viele Daten.
Und was ich wenn ich die Boxen verschieben will oder eines in den Vordergrund holen will? Das wird alles ziemlich kompliziert mit einfachen Mitteln.
Ich habe keinen Plan wie ich das lösen soll.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von marcov »

Jole hat geschrieben:TP schreibt mit Write/WriteLn standardmäßig direkt in den VRAM!


(Nein, nur wenn mann Crt nutzt. Standard scheibt TP mit ich glaube int10, oder vielleicht int21)

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

(Nein, nur wenn mann Crt nutzt. Standard scheibt TP mit ich glaube int10, oder vielleicht int21)

Ess muss int 21h sein, sonst würde die Umleitung nicht gehen nicht gehen.

Code: Alles auswählen

test.exe > test.txt


@Mathias: Du könntest ja mal dein Programm durchlaufen lassen und die Zeiten festhalten. Setze dann mal im Hauptprogramm hinter BEGIN die Variable DirectVideo auf False und schau mal ob sich an den Zeiten etwas ändert.
Die Zeiten sind fast gleich. Höchstens 1% Abweichung.

Code: Alles auswählen

  DirectVideo := true;
  t := now;
  for i := 0 to 10000 do begin
    OutTextXYCrt(10, 15, 'Hello World !');
  end;
  z2 := now - t;
 
  DirectVideo := false;
  t := now;
  for i := 0 to 10000 do begin
    OutTextXYCrt(10, 15, 'Hello World !');
  end;
  z3 := now - t; 
 
 Writeln('DirectVideo = true: ', z2, '  DirectVideo = false ', z3);

Ich habe mir die Unit Crt genauer angeguckt, da ist wohl die Variable DirectVideo vorhanden, aber gebraucht wird sie nirgends. Auch in der Unit System kann ich sie nicht finden.
Wo ist eigentlich Write und Writeln versteckt, diese beiden Proceduren kann ich auch nirgends finden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Mathias hat geschrieben:Wo ist eigentlich Write und Writeln versteckt, diese beiden Proceduren kann ich auch nirgends finden ?

Das würde mich auch interessieren. Denn wenn man sich dir info von http://www.freepascal.org/docs-html/rtl/system/writeln.html anschaut, kann das doch nicht der ganze Code für die Prozedur in der Datei sein.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von marcov »

Es funktioniert wie im TP :-)

(dort findet man sie auch nicht. read(ln) und write(ln) und writestr/readstr werden durch dem Kompiler in Reihen anrufen nach Helperprozeduren umgesetzt. Die sind meinstens in rtl/inc/Filerec.inc und rtl/inc/text.inc implementiert)

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

(dort findet man sie auch nicht.

TP war auch nicht OpenSource.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von marcov »

Mathias hat geschrieben:
(dort findet man sie auch nicht.

TP war auch nicht OpenSource.


Nein, aber einige Versionen hatten Quellen dabei wie zb Borland Pascal 7, und auch einige TP6 (akademische?) Versionen

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Jole »

Mathias hat geschrieben:Gegenwärtig auch nicht mehr, aber zur DOS-Zeiten sah dies anders aus. Da gab es kein Internet, in dem man mal schnell was runterladen konnte.

Leider, aber man kam wenigstens auf dem weg zur Bücherei mal an die frischeluft :mrgreen: .

Nixsager hat geschrieben:Das brauch ich nicht
Wenn ich 'WIndow' nutze arbeitet ClrScr, Write, GotoXY für den mit Window festglegt Bereich.
Also ganz normal, und somit auch wieder keine Lösung

Ok, ich werde dir mit WINDOW nicht mehr auf den Wecker gehen :) .

Nixsager hat geschrieben:Da bin ich dabei. Und das ganze wird jetzt wieder komplizierter. Wenn ich das mache, kriege den Desktop zu sehen, den Mauscursor den ich nicht will weil ihn nicht brauche, die Standard Statusleiste mit 'Alt-X Exit' und die MessageBox reagiert nicht auf die Tastatur.

Warum bei dir die Tastatur nicht reagiert ist mir schleierhaft, bei mir funktioniert das sowohl mit TP7 (DosEmu) als auch mit FP(Linux).

marcov hat geschrieben:
Jole hat geschrieben:TP schreibt mit Write/WriteLn standardmäßig direkt in den VRAM!


(Nein, nur wenn mann Crt nutzt. Standard scheibt TP mit ich glaube int10, oder vielleicht int21)

Das stimmt, hab ich leider vergessen zu erwähnen.

Mathias hat geschrieben:Die Zeiten sind fast gleich. Höchstens 1% Abweichung.

Wenn man mit TP einen Grafikmodus aktiviert kann mit Write/WriteLn kein Text mehr ausgegeben werden, außer man setzt wieder DirectVideo vor der InitGraph Prozedur auf False. Ich kann es nicht testen weil ich kein FPC für DOS installiert hab. Es muss aber ein Modus sein, bei dem das BIOS die Zeichenausgabe noch unterstützt (z.B. 640x480x16), dann wüste man genau ob DirectVideo noch etwas bewirkt oder nicht.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Jole hat geschrieben:Warum bei dir die Tastatur nicht reagiert ist mir schleierhaft, bei mir funktioniert das sowohl mit TP7 (DosEmu) als auch mit FP(Linux).

Also in der im Init-Contructor funktioniert die Tastenabfrage, nur nicht wenn ich irgendwo die MessageBox aufrufe.
Also für mich ist TV zu kompliziert.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Mathias »

marcov hat geschrieben:
Mathias hat geschrieben:
(dort findet man sie auch nicht.

TP war auch nicht OpenSource.


Nein, aber einige Versionen hatten Quellen dabei wie zb Borland Pascal 7, und auch einige TP6 (akademische?) Versionen

Als ich kann keine system.pas oder crt.pas in meinem BP7 finden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Wie am besten in die Konsole Zeichen ausgeben?

Beitrag von Nixsager »

Die ist auf einer extra Diskette. Die nennt sich 'Borland Pascal with Objects 7.0'.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Antworten