Open Array: ist das normal ?
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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.
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
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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, .....
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
Michael Springwald
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)
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;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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,
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
Michael Springwald
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.
Damit der Speicherbereich auf dem Heap wieder freigegeben werden kann, wenn kein Verweis mehr auf ihn besteht.pluto hat geschrieben:aber warum ein Referenzzähler ?
http://de.wikipedia.org/wiki/Referenzz%C3%A4hlung" onclick="window.open(this.href);return false;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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" onclick="window.open(this.href);return false;
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" onclick="window.open(this.href);return false;
MFG
Michael Springwald
Michael Springwald
Fast, aber nicht DU sondern ESpluto hat geschrieben: Anhand des Referenzzählers kann ich nun erkennen ob ich diesen String noch benötige oder nicht.

Das ist ja gerade dazu da, damit DU dich nicht um die Freigabe kümmern musst.
Genau.pluto hat geschrieben: Also, alles was auf diesen String zeigt, wird mit gezählt, wenn er gleich 0 ist wird dieser String freigeben, richtig ?
-
- 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:
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.
Industriestandart hin oder her Wirtschaftlich ists nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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 ?
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
Michael Springwald
-
- 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:
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.
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/
-
- 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:
Nehme auch an, das liegt an der Trägheit der Lehre an den Hochschulen.pluto hat geschrieben:ja warum wird dann C++ am meisten eingesetzt von allen Programmiersprachen ?
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.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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*
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
Michael Springwald
Da ist wohl noch viel Überzeugungsarbeit zu leisten: http://www.heise.de/ix/artikel/2007/06/056/" onclick="window.open(this.href);return false;
knight
knight