Wort[0]:=CHR(1*5); Verständnisproblem

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
corado
Beiträge: 48
Registriert: Mi 7. Aug 2013, 17:00

Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von corado »

Hallo,
ich verstehe irgendwie diese Funktion nicht..
Es werden untereinander immer länger werdende Striche gezeichnet.
Aber wieso?
Wort[0]:=CHR(1*5);
würde doch bedeuten, er wandel die Zahl 1*5 also 5 von einem Bytewert in ein Char aus der Tabelle Nr. 5 um und weist diess Zeichen der Variable Wort[0] im ersten Array zu (String besteht ja aus einer Zeichenkette vom Typ Char)
Aber er weißt doch dieses Zeichen immer wieder nur dem 0 array zu, also der ersten Position!??
Und im Zweiten Durchgang ist es doch 2*5, also 10, also sollte Wort[0] doch wieder ein anderes Zeichen zugewiesn werden als _?!?!

Code: Alles auswählen

 
Program HelloWorld(output);
VAR 
 Wort : STRING[60];
 Lang : BYTE;
begin
  Wort := '________________________________________________';
  FOR lang := 1 TO 12 DO BEGIN
           Wort[0] := CHR(Lang * 5);
           WriteLn(Wort);
 
           WriteLn;
 end;
end.
 

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von Michl »

Das Problem ist, dass das erste sichtbare Zeichen des Strings nicht Wort[0] sondern Wort[1] ist. In Wort[0] ist die Länge des ShortStrings definiert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

corado
Beiträge: 48
Registriert: Mi 7. Aug 2013, 17:00

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von corado »

ahhhh, ok, dann ist mir das klar.
Könnt schwören, davon steht nicht in meinem alten Turbo PAscal 7.0 Buch :-)
Muss ich nhoch mal drin stöbern
Danke

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von m.fuchs »

Diese Beispiel solltest du aber schnell wieder vergessen. Das ist übler Code. Wo stammt es denn her?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von m.fuchs »

Zur Verdeutlichung warum das schlecht ist, noch ein Beispiel:

Code: Alles auswählen

program LengthManipulation;
{$mode objfpc}{$H+}
 
procedure Test;
var
  s: array[1..2] of String[30];
begin
  s[1] := 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  s[2] := 'This is a very secret string!!';
  s[1][0] := Chr(61);
  WriteLn(s[1]);
end;
 
begin
  Test;
  ReadLn;
end.
Das ergibt dann fröhlich die Ausgabe:

Code: Alles auswählen

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▲This is a very secret string!!
Heartbleed lässt grüßen!


Wobei ich durchaus erstaunt bin, dass diese Manipulation überhaupt zulässig ist und nicht in einem Fehler endet.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

corado
Beiträge: 48
Registriert: Mi 7. Aug 2013, 17:00

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von corado »

hmm, ich finde das Beispiel passt nicht.
Das Beispiel stammt aus meinem Turbo PAscal 7 Buch :-) das ich mal wieder ausgekrahmt habe :-)
Ist aber sonst eigentlich alles super gut erklährt.
Habe jetzt auch die Stelle mit der Stringmanipulation gefunden :-)

http://www.amazon.de/Das-Einsteigersemi ... al+7.0+bhv

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von m.fuchs »

corado hat geschrieben:hmm, ich finde das Beispiel passt nicht.
Was stört dich denn?
corado hat geschrieben:Das Beispiel stammt aus meinem Turbo PAscal 7 Buch :-) das ich mal wieder ausgekrahmt habe :-)
Schmeiß es weg, es taugt nichts. Ernsthaft, wenn so ein (übrigens nicht einmal funktionierendes) Beispiel da drin steht, wird der Rest auch nichts taugen.

Genau solche direkten Zugriffe, die aber völlig unnötig sind, bescheren uns heute die ganzen Sicherheitslücken.

Schau dir auch einmal dieses Werk an: http://www.marcocantu.com/epascal/default.htm
Ist um Längen besser und kostet dich nichts. Die deutsche Version findest du weiter unten auf der Seite.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

corado
Beiträge: 48
Registriert: Mi 7. Aug 2013, 17:00

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von corado »

schau ich mir mal an.
Aber funktionieren tut es doch tadelos

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

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von Mathias »

Diese Code krahmte bei mir eine Erinnerung empor.
In Turbo-Pascal gabe es eine Limite von Konstantengrösse, somit habe ich eine Procedure missbraucht um eine grosse Konstante zu speichern.

Code: Alles auswählen

// Ausschnitt aus newchar.inc
procedure CharTab; assembler;
asm                          
 db    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 db    0,   0, 126, 129, 165, 129, 129, 189, 153, 129, 126,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 db    0,   0, 126, 255, 219, 255, 255, 195, 231, 255, 126,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 db    0,   0,   0, 108, 254, 254, 254, 254, 124,  56,  16,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
......
 db  240, 240, 240, 240,  15,  15,  15, 240, 240, 240, 240,  15,  15,  15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 db    0,   0,   0,   0, 124, 124, 124, 124, 124, 124,   0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 db  255, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
end;
Hier hatte ich den Inhalt der Procedure in den Video-Speicher geschrieben.

Code: Alles auswählen

{$I NEWCHAR.INC}
 
procedure InitCharTab;
begin
  chSeg := Seg(CharTab); //  Adresse der Procedure ermitteln.
  chOfs := Ofs(CharTab);
  FontOpen;
  MoveW(Mem[chSeg:chOfs], Mem[SegA000:0], $1000);  
  FontClose;
end;
 
procedure FontOpen; assembler;
asm
        mov     dx, 03C4h
        mov     ax, 0402h
        out     dx, ax
        mov     ax, 0704h
        out     dx, ax
        mov     dx, 03CEh
        mov     ax, 0406h
        out     dx, ax
end;
 
procedure FontClose; assembler;
asm
        mov     dx, 03C4h
        mov     ax, 0302h
        out     dx, ax
        mov     ax, 0304h
        out     dx, ax
        mov     dx, 03CEh
        mov     ax, 0E06h
        out     dx, ax
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von m.fuchs »

corado hat geschrieben:Aber funktionieren tut es doch tadelos
Nö, wenn ich das ausführe, sind die letzten drei Linien gleich lang. Was daran liegt, dass die Initialisierung nicht alle 60 Zeichen mit einem Unterstrich belegt.
Zuletzt geändert von m.fuchs am Di 5. Aug 2014, 15:41, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

corado
Beiträge: 48
Registriert: Mi 7. Aug 2013, 17:00

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von corado »

das war mein Fehler, ich hatte es nur nicht korrigiert, weil es ja fürs Verständnis nicht wichtig war :-)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von m.fuchs »

Achso. Aber wie dem auch sei. Das ist schlechter Stil, gewöhn dir so etwas lieber nicht an.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von Mathias »

Dazu hätte ich auch eine Frage, was ist besser ?

Die 2. Variante ist sicher schneller als die erste, aber nicht sauber, wie oben beschreiben.

Dies

Code: Alles auswählen

  function ZeichenKette(c: char; anz: byte): ShortString;
  var
    i: integer;
  begin
    Result := '';
    for i := 1 to anz do begin
      Result := Result + c;
    end;
  end; 
oder

Code: Alles auswählen

  function ZeichenKette(c: char; anz: byte): ShortString;
  var
    i: integer;
  begin
    Result[0] := char(anz);
    FillChar(Result[1], anz, c);
  end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von theo »

Was willst du eigentlich erreichen?
Warum arbeitest du nicht mit dem normalen String unter Lazarus, dem AnsiString?
Dafür gibt es die Fkt. StringOfChar http://lazarus-ccr.sourceforge.net/docs ... fchar.html

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

Re: Wort[0]:=CHR(1*5); Verständnisproblem

Beitrag von Mathias »

Warum arbeitest du nicht mit dem normalen String unter Lazarus, dem AnsiString?
Weil ich nicht gewusst habe, das es dafür eine fertige Funktion gibt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten