Open Array: ist das normal ?

Für Fragen rund um die Ide und zum Debugger
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ein String ist ja intern auch nix anders als eine Klasse... so wie ich es mitbekommen habe.

Aber ich gebe dir recht, seltsam das es nicht einhandlich ist also jetzt entweder so oder so. Währe bestimmt einfacher, aber wenn man es weiß ist es ja nicht ganz so schlimm.

ich meine sogar das ein String eigentlich nix anders ist als ein Array.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Quatsch n string ist in Pascal ein eigenes konstrukt das vom Compiler gehandelt wird. In c++ gibt es Strings als Klasse.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich habe irgendwo gelesen, das ein String intern eine Klasse ist.... ich meine das wahr sogar hier in diesem Forum. Aber das ist ja letz endlich auch egal.

Deine Aussage würde Erklären warum, eine String bei der Zuweisung anders behandelt wird als der Rest, wobei das ist ja bei allen einfachen Datentypen der Fall wie z.b. Integer, Boolean, .....
MFG
Michael Springwald

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

Beitrag von theo »

Ne Pluto. Ein Ansistring (Long String) ist weder eine Klasse noch ein einfacher Datentyp.

Es ist ein Pointer auf einen Speicherbereich im Heap, wobei dieser vor dem Char Array auch noch einen Referenzzähler und einen Längenindikator enthält.

Mit dem Code unten kannst du in den Ansistring "hineinsehen".
Dann kriegst du in dem Beispiel sowas raus:

0: 01 00 00 00 07 00 00 00 61 62 63 64 65 66 67 |........abcdefg |

Das erste 01 00 00 00 ist der Referenzzähler (1)
Das 07 00 00 00 ist die Länge (7)
Der Rest sind die Chars.
Damit kann man nun rumspielen um zu sehen, was es tut mit dem Referenzzähler.

(Button und Memo auf ne Form legen, Button1Click Eventhandler einhängen und dann diesen Code drüberpasten)

Code: Alles auswählen

procedure GetHexDisplay(AData: Pointer; ASize: integer; AList: TStrings);
var
  i: integer;
  recLen: integer;
  tBuf: PChar;
  tLng: integer;
  theStream: TMemoryStream;
  tStr: string;
  tStrEnd: string;
begin
  recLen := ASize;
  AList.Add(EmptyStr);
 
  theStream := TMemoryStream.Create;
  try
    theStream.Write(AData^, ASize);
    theStream.Seek(0, soFromBeginning);
 
    while (theStream.Position < theStream.Size) do
    begin
      if (recLen > (theStream.Size - theStream.Position)) then
        recLen := theStream.Size - theStream.Position;
 
      tBuf := AllocMem(recLen);
      try
 
        theStream.Read(tBuf[0], recLen);
 
        tStrEnd := EmptyStr;
        tStr := EmptyStr;
 
        for i := 0 to recLen - 1 do
        begin
          if ((i = 0) or ((i mod 16) = 0)) then
          begin
            if (i <> 0) then
            begin
              AList.Add(tStr + '|' + tStrEnd + '|');
              tStrEnd := EmptyStr;
            end;
 
            tStr := Format('%5X', [i]);
            tStr := tStr + ': ';
          end;
 
          tStr := tStr + Format('%.02X ', [Byte(tBuf[i])]);
 
          if (tBuf[i] < char($20)) or (tBuf[i] > char($7F)) then
            tBuf[i] := '.';
 
          tStrEnd := tStrEnd + tBuf[i];
        end;
      finally
        FreeMem(tBuf);
      end;
 
      if (tStrEnd <> EmptyStr) then
      begin
        if (Length(tStrEnd) < 16) then
        begin
 
          tLng := 16 - Length(tStrEnd);
 
          while (tLng > 0) do
          begin
            tStr := tStr + ' ';
            tStrEnd := tStrEnd + ' ';
            Dec(tLng, 1);
          end;
        end;
        AList.Add(tStr + '|' + tStrEnd + '|');
        tStrEnd := EmptyStr;
      end;
    end;
  finally
    theStream.Free;
  end;
 
  if (tStrEnd <> EmptyStr) then
  begin
    if (Length(tStrEnd) < 16) then
    begin
      tLng := 16 - Length(tStrEnd);
 
      while (tLng > 0) do
      begin
        tStr := tStr + ' ';
        tStrEnd := tStrEnd + ' ';
        Dec(tLng, 1);
      end;
    end;
 
    AList.Add(tStr + '|' + tStrEnd + '|');
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var Str: AnsiString;
begin
  Memo1.Lines.Clear;
  Str := 'abcdef';
  Str := Str + 'g';
  GetHexDisplay(Pointer(PChar(Str) - 8), Length(Str) + 8, Memo1.Lines);
end;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Gut die Länger ist ja klar, aber warum ein Referenzzähler ?
wenn ich ein String habe, brauche ich doch nur die Anzahl zu wissen, also wie viele Zeichen ich habe,
Zuletzt geändert von pluto am Do 17. Mai 2007, 13:05, insgesamt 2-mal geändert.
MFG
Michael Springwald

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

Beitrag von theo »

pluto hat geschrieben:Gut die Länger ist ja klar,

Ne Pluto, es ist nicht einfach "klar".
PChar funktioniert z.B. nicht so, das hat ein #0 am Schluss und keinen Längenindex.
pluto hat geschrieben:aber warum ein Referenzzähler ?

Damit der Speicherbereich auf dem Heap wieder freigegeben werden kann, wenn kein Verweis mehr auf ihn besteht.
http://de.wikipedia.org/wiki/Referenzz%C3%A4hlung

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Naja ich meinte mit der Länger, das mir klar ist, wofür sie benötigt wird. Wie sie ermittelt wird... ist ja erstmal egal.

Also wird jeder String den ich benutzt bekommt ein Index zugeodernet
Anhand des Referenzzählers kann ich nun erkennen ob ich diesen String noch benötige oder nicht.

edit0.
Also, alles was auf diesen String zeigt, wird mit gezählt, wenn er gleich 0 ist wird dieser String freigeben, richtig ?
das habe ich von hier:
http://de.wikipedia.org/wiki/Automatisc ... ereinigung
MFG
Michael Springwald

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

Beitrag von theo »

pluto hat geschrieben:Anhand des Referenzzählers kann ich nun erkennen ob ich diesen String noch benötige oder nicht.

Fast, aber nicht DU sondern ES ;-)
Das ist ja gerade dazu da, damit DU dich nicht um die Freigabe kümmern musst.


pluto hat geschrieben:Also, alles was auf diesen String zeigt, wird mit gezählt, wenn er gleich 0 ist wird dieser String freigeben, richtig ?

Genau.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Also das finde ich etwas umständlich..... aber gut, wenn es geht, es ist ja nicht schlecht.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Diese Umständlichkeit bewahrt und vor reihenweisen Überläufen und Sicherheitslücken die daraus resultieren. Wenn man sich mal anschaut wie viele Sicherheitslücken allein darauf zurückzuführen sind und das betrifft OpenSource genau so wie closed. Dann bin ich echt froh das damals jemand mitgedacht hat. Und versteh nachwievor nicht warum man sich mit sowas wie C++ rumärgert ...
Industriestandart hin oder her Wirtschaftlich ists nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ja warum wird dann C++ am meisten eingesetzt von allen Programmiersprachen ?
und nicht, welche mit Auto. Speicher Belegung ?

Ich habe gelesen, das es bei Echtzeit Programm zu Problem führen kann.
Evlt. sollte dann die Auto. Speicher Belegung einfach abgeschaltet werden über eine Complier Anweisung... ob das möglich währe ?
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das ist ne Glaubensfrage pluto, fpc erzeugt jedenfalls den besseren Code. Und Pascal ist wesentlich sicherer wärend der Programmentwicklung als C/C++.
C# kann da sicher schon eher mithalten was die sicherheit belangt.
C hat sich damals durchgesetzt sicher weil
1. der meisste Code dafür bestand bzw Pascal später entstanden ist.
2. Viele Entwickler lieber Kryptisch statt lesbar Programmieren weil sie sich dann anscheinend sicherer Fühlen.
3. C in den Anfangszeiten hardwarenahe Programmierung noch wichtiger war worin C nunmal besser ist.

C++ ist auf C heraufgefrickelt und schwimmt auf dessen Welle mit.

C hat a auch durchaus eine gute Daseinsberechtigung aber was alle it C++ wollen versteh ich bis heut nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

pluto hat geschrieben:ja warum wird dann C++ am meisten eingesetzt von allen Programmiersprachen ?


Nehme auch an, das liegt an der Trägheit der Lehre an den Hochschulen.

Nehme außerdem an, dass es bei C++ zum Windows-Effekt gekommen ist: Da so viele Dinge in C++ geschrieben worden sind, muss man die Sprache halt einfach können als berufsmäßiger Programmierer. Und das obwohl C++ vielleicht garnicht so viele Vorteile hat, wie man aufgrund dessen Beliebtheit schließen könnte.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

gerade bei Pascal finde ich die Übersichtlichkeit in der man den Code schreiben kann, sehr schön.

z.b. die Variablen, dass sie nicht irgendwo stehen können, sondern nur am Anfang einer Proc/Func

ich habe mal c gemacht eine Zeitlang , bevor Windows kam. Ich finde die Sprache ist der letzte.....
Naja, was sollst. mal sehen was die Zukunft bringt.

Aber ich finde es gut, das die Autoren von C/C++ nur in Object Pascal Programmieren und nicht in ihrer Sprache *G*
MFG
Michael Springwald

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

Da ist wohl noch viel Überzeugungsarbeit zu leisten: http://www.heise.de/ix/artikel/2007/06/056/

knight

Antworten