AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi kann keine Arrays konkatenieren wenn...
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi kann keine Arrays konkatenieren wenn...

Ein Thema von Der schöne Günther · begonnen am 9. Feb 2015 · letzter Beitrag vom 10. Feb 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 21:04
Delphi-Version: XE7
Ich verstehe die Welt nicht mehr.

Folgende Konsolenanwendung:
Delphi-Quellcode:
program Project24;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit10 in 'Unit10.pas';
begin
  try
   concatenateBytes();
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
Unit10.pas:
Delphi-Quellcode:
unit Unit10;

interface uses System.SysUtils;


   (* type TSomeClass = class(TObject)
      class function getSomeBytes(): TBytes; virtual; abstract;
   end; *)


   function concatenateBytes(): TBytes;

implementation uses System.IOUtils;

function concatenateByteS(): TBytes;
   var
      firstArray, secondArray: TBytes;
   begin
      firstArray := TFile.ReadAllBytes(ParamStr(0));
      secondArray := TFile.ReadAllBytes(ParamStr(0));
      concatenateBytes := firstArray + secondArray;

   end;

end.
Ausführen. Läuft durch. Nun entfernen wir einmal den Kommentar um TSomeClass . Das Ausführen von concatenateBytes verursacht nun eine AV. Kann mir das jemand erklären? Wtf?
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 21:16
Putzig.
Allerdings kannte ich bisher nur den expliziten Weg über SetLength():

Delphi-Quellcode:
function concatenateByteS : TBytes;
   var
      firstArray, secondArray: TBytes;
   begin
      firstArray := TFile.ReadAllBytes('C:\Development\DelphiLib\FastMM\FastMM4_FAQ.txt');
      secondArray := TFile.ReadAllBytes('C:\Development\DelphiLib\FastMM\FastMM4_FAQ.txt');

      SetLength(result, Length(firstArray) + Length(secondArray));
      Move(firstArray[0], result[0], Length(firstArray));
      Move(secondArray[0], result[Length(firstArray)], Length(secondArray));
      //result := firstArray + secondArray;
   end;
Der geht.
Ich hielte es bislang auch für einen Fehler, auf SetLength() zu verzichten.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 21:19
Ja, das wäre auch mein "Workaround" nachdem ich erst einmal schauen musste wie die Welt vor XE7 Arrays konkateniert hat. Aber verstehen was da für verrückte Dinge ablaufen tue ich nicht im geringsten

Wir haben doch hier Assembler-Spezialisten. Ob einer aus dem generierten Code mit und ohne TSomeClass schlau wird?

Ist ja nicht so als hätte mich die Fehlersuche mindestens eine halbe Stunde gekostet. AAARGH
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 21:22
Was für eine Exception?
Funktioniert es mit der Klasse ohen abstrakte Methode?

Wenn ich mir Dein 2. Beispel anschaue vermute ich mal du wolltset im 1. ParamStr(1) statt ParamStr(0) schreiben, den ParamStr(0) ist ja die Exe selber.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 22:27
Ich würde das für einen Compilerfehler halten...
Code:
Unit28.pas.19: firstArray := TFile.ReadAllBytes('J:\Eigene Dokumente\...');
004D3A42 8D55F8           lea edx,[ebp-$08]
004D3A45 B8A83A4D00       mov eax,$004d3aa8
004D3A4A E891F9FFFF      call TFile.ReadAllBytes
Unit28.pas.20: secondArray := TFile.ReadAllBytes('J:\Eigene Dokumente\...');
004D3A4F 8D55F4           lea edx,[ebp-$0c]
004D3A52 B8343B4D00       mov eax,$004d3b34
004D3A57 E884F9FFFF      call TFile.ReadAllBytes
Unit28.pas.21: Result := firstArray + secondArray;
004D3A5C A19C3AA100       mov eax,[$00a13a9c]    // <-- diese Zeilen
004D3A61 50               push eax               // <-- diese Zeilen
004D3A62 8B45FC          mov eax,[ebp-$04]
004D3A65 8B4DF4           mov ecx,[ebp-$0c]
004D3A68 8B55F8           mov edx,[ebp-$08]
004D3A6B E87081F3FF      call @DynArrayCat3
Unit28.pas.23: end;
004D3A70 33C0             xor eax,eax
004D3A72 5A              pop edx
004D3A73 59               pop ecx
004D3A74 59               pop ecx
Die einzige Änderung zwischen mit und ohne der Klassendeklaration ist die Adresse in dem mov. Mit Klassendeklaration steht an der Adresse bei mir z.B. ein String mit einer Umgebungsvariable.
Eigentlich sollte da aber der Pointer auf die RTTI des dynamischen Arrays stehen, das da verkettet wird... sprich von TBytes. Mit der Klassendeklaration stimmt dieser Zeiger nicht.

Hintergrund:
DynArrayCat3 bekommt vier Parameter, deshalb landet der vierte Parameter, also der Typpointer, auf dem Stack, daher das push.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 22:29
So geht's auch:

Delphi-Quellcode:
function concatenateByteS(): TBytes;
var
  resArray,
  firstArray,
  secondArray: TBytes;
begin
  firstArray := TFile.ReadAllBytes(ParamStr(1));
  secondArray := TFile.ReadAllBytes(ParamStr(1));
  resArray := TFile.ReadAllBytes(ParamStr(1));
  result := resArray;
end;
Machst du einen Bugreport dazu auf?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 22:52
Statt der Klasse reicht auch schon:

Delphi-Quellcode:
var
  x: TBytes;
Das Vorkommen von TBytes an anderer Stelle im Interface Teil scheints da beim Codegen zu zersägen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 23:28
Machst du einen Bugreport dazu auf?
Habe ich mal gemacht:
https://quality.embarcadero.com/browse/RSP-10051
Die Verwendung von TArray<Byte> bringt den gleichen Fehler, das Beispiel ist so und mit Verwendung der simplen Variablen wie Stevie meinte noch simpler.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 9. Feb 2015, 23:45
Der 64-Bit Compiler scheint es richtig zu machen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Delphi kann keine Arrays konkatenieren wenn...

  Alt 10. Feb 2015, 09:04
Erinnert irgendwie daran wie DCC32 auch dabei versagte, zwei Strings mit der selben Länge zu konkatenieren, DCC64 es aber hinbekam (siehe hier)

Danke fürs das Zusammenkürzen des Beispiels. War für mich gestern schon zu spät dafür
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz