memcpy, gibts nicht, ? [ gelöst ]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: memcpy, gibts nicht, ? [ gelöst ]

Beitrag von Warf »

Mathias hat geschrieben:
Mi 20. Sep 2023, 08:35
So wie es aussieht, ist der Unterschiede zwischen C und Pascal.
Bei C muss man den Pointer der Variable mitgeben, und bei Pascal ist es die Pure Variable
Und Src und Dest ist auch vertauschst.
Pascal versteckt halt den pointer Zugriff, was dann zu lustigen Seiteneffekten führen kann, wie das z.b. das folgende

Code: Alles auswählen

Move(str1[1], str2[1], str1.length);
Einen range check error für leere strings verursachen kann, obwohl wenn length 0 ist der Wert hinter Str[1] nie gelesen bzw geschrieben wird

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

Re: memcpy, gibts nicht, ? [ gelöst ]

Beitrag von Mathias »

Einen range check error für leere strings verursachen kann, obwohl wenn length 0 ist der Wert hinter Str[1] nie gelesen bzw geschrieben wird
Genau wie bei folgendem Beispiel, früher hatte bei solchen Sachen immer @xxx[0] zugegriffen anstelle mit einem Pxxx(xxx).
Entweder hatte man die Länge geprüft, oder es gab den Range Check Error.

Code: Alles auswählen

const
  vertices: array of TVector2f = (
    (-0.90, -0.90), (0.85, -0.90), (-0.90, 0.85),
    (0.90, -0.85), (0.90, 0.90), (-0.85, 0.90));
begin
    SetLength(vertices, 0);

  // Alt
  glNamedBufferStorage(Buffers[Buffer_IDs_ArrayBuffer], Length(vertices) * SizeOf(vertices), @vertices[0], 0);

  //Neu
  glNamedBufferStorage(Buffers[Buffer_IDs_ArrayBuffer], Length(vertices) * SizeOf(vertices), PVector2f(vertices), 0);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten