AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Arrays vergleichen\sortieren

Ein Thema von EWeiss · begonnen am 22. Nov 2017 · letzter Beitrag vom 30. Nov 2017
Antwort Antwort
Seite 3 von 7     123 45     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#21

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 01:40
Zitat:
Sollte in etwa so aussehen. Ist nur so runtergetippt, also kann noch Fehler enthalten:
Werde es mal testen.
------
Funktioniert leider nicht.. Danke.

langsam nervt Delphi nur noch
Ein einfaches MoveMemory oder auch CopyMemory ist das gleiche!
Delphi-Quellcode:
    
for K := 0 to g_Prop[gP].Ordersize do
begin
  MoveMemory(@Item, g_Prop[gP].order + K * sizeof(short), sizeof(short));
funktioniert nicht einmal.
Das Item sollte eigentlich inkrementieren tut es aber nicht.

Das will der Compiler auch nicht.
Ich verwende hier FillChar anstelle von FillMemory auch hier das gleiche spielt also keine rolle was ich verwende
um den Speicher mit nullen zu füllen.

Delphi-Quellcode:
buffer: array [0 .. 2047] of Char;
....
FillChar(buffer, sizeof(buffer), 0);
for K := 0 to Count do
  MoveMemory(@buffer[0] + K * sizeof(Short), @A2[K], sizeof(Short));
Zitat:
[DCC Fehler] uSpriteContainer.pas(2656): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
@buffer[0] + K * sizeof(Short)
Das sind doch ganz einfache primitive API calls.
Und müssten eigentlich überall gleich funktionieren.

Ein char bleibt ein char egal ob in c++ oder Delphi, ein Array bleibt ein Array.
Warum macht der Compiler unter Delphi so einen Aufstand.

Und ja short ist SmallInt spielt also keine rolle ob ich es direkt eingebe oder short verwende.
Daran dürfte es nicht scheitern.

Zitat:
SHORT = Smallint;
{$EXTERNALSYM SHORT}

gruss

Geändert von EWeiss (23. Nov 2017 um 06:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#22

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 09:58
MoveMemory(@buffer[0] + K * sizeof(Short), @A2[K], sizeof(Short));
Zitat:
[DCC Fehler] uSpriteContainer.pas(2656): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
@buffer[0] + K * sizeof(Short)
Dort versuchst du auch einen Pointer und einen Integer zu addieren. Probier mal PByte(@buffer[0]) + K * sizeof(Short) . Wenn das nicht geht, dann Pointer(NativeUInt(@buffer[0]) + K * sizeof(Short)) .
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 15:25
Zitat:
Dort versuchst du auch einen Pointer und einen Integer zu addieren.
Das ist richtig was du sagst.

Nur..
Das tue ich auch unter c++ da gibt es keine Probleme bei der gleichen Übergabe.
Letztendlich verwenden beide sprachen die gleiche API darauf wollte ich hinaus.
Um so mehr ich mit C++ Arbeite um so mehr stelle ich fest wie verkorkst die Sprache Delphi(Compiler) eigentlich ist.

Was ist an MoveMemory in Delphi anders als in C++ eigentlich nichts.

MoveMemory(Pointer(NativeUInt(@buffer[0])) + K * sizeof(Short), @A2[K], sizeof(Short)); Das gleiche Problem.

MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short)); Lässt sich kompilieren aber ob es richtig ist bzw.. die Daten korrekt verarbeitet werden ist mir nicht ersichtlich.

Damit steht bzw. fällt das Projekt.

Delphi-Quellcode:
procedure TSkinSpriteContainer.gDrawZorderObjects(WinHandle: HWND; hDCdest: HDC;
  InPrintMode: Integer);
var
  K, Item, gP: Integer;
begin

  Item := 0;

  // Draw objects with respect of the z-order
  gP := GetObjectOrder(WinHandle);
  if (gP > -1) then
  begin
    for K := 0 to g_Prop[gP].Ordersize do
    begin
      MoveMemory(@Item, g_Prop[gP].order + K * sizeof(short), sizeof(short)); // Das Item hier müsste inkrementiert werden geht aber nicht.
      // Draw only visible objects
      if (g_Obj[Item].Visible) then
        GI_DrawObject(hDCdest, g_Obj[Item], InPrintMode);
    end;
  end;
end;
gruss

Geändert von EWeiss (23. Nov 2017 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 15:43
Um so mehr ich mit C++ Arbeite um so mehr stelle ich fest wie verkorkst die Sprache Delphi(Compiler) eigentlich ist.


Du vergleichst C++ und Delphi und nennst Delphi verkorkst?
Delphi ist typsicher und das einzige was du brauchst ist ein Cast. Also kein großer Akt.

Das Problem ist dass du manche Dinge eben nicht 1:1 übersetzen kannst und du übersetzt halt 1:1 und wunderst dich über Probleme
Du fährst besser wenn du versuchst den Code zu verstehen und den Kram sinngemäß in Delphi implementierst.
So wie ich das sehe ist der C++ Code da nämlich DEUTLICH einfacher und kürzer in Delphi implementierbar.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 15:44
Um so mehr ich mit C++ Arbeite um so mehr stelle ich fest wie verkorkst die Sprache Delphi(Compiler) eigentlich ist.
Komisch, bei mir verfestigt sich genau der umgekehrte Eindruck. Man sollte seine Sprache halt passend zu seiner Denkweise aussuchen. Sieht man sich mal deine Threads der vergangenen Monate an, manifestiert sich bei mir die Vermutung, daß Du und Delphi einfach nicht füreinander geschaffen seid.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 15:50
Zitat:
daß Du und Delphi einfach nicht füreinander geschaffen seid.
Jetzt keinen erneuten Hype um Delphi hier sachlich bleiben.

Zitat:
Das Problem ist dass du manche Dinge eben nicht 1:1 übersetzen kannst
Fakt ist das MoveMemory eine einfache Win32 API ist und von allen Sprachen gleich interpretiert werden sollte.
Also warum funktioniert es unter C++ und nicht mit Delphi.

Bitte Sachlicher Hinweis und keine persönlichen Angriffe Herr Uwe Rabe. (Ich weis sie lieben Delphi)
PS: Für mich ist es ein Werkzeug nichts anderes.

Zitat:
So wie ich das sehe ist der C++ Code da nämlich DEUTLICH einfacher und kürzer in Delphi implementierbar.
DEUTLICH und einfach?
Sorry ich sehe nicht das du dich mal daran versucht hättest.. Papier ist geduldig.

gruss

Geändert von EWeiss (23. Nov 2017 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#27

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 15:58
Also warum funktioniert es unter C++ und nicht mit Delphi.
Es funktioniert bei beiden. Delphi Syntax ist anders und in Delphi ist (standardmäßig) Pointerarithmetik nicht erlaubt weswegen du die Berechnung der Adresse als Integer machen musst und das Ergebnis dann auf Pointer castest.
MoveMemory ist wie gesagt eine Windows API und die KANN in Delphi nicht anders funktionieren als in C++.

Code:
MoveMemory(&buffer[0] + K * sizeof(short) , &A2[K], sizeof(short));
=
MoveMemory(Pointer(NativeUInt(@buffer[0]) + K * sizeof(Short)), @A2[K], sizeof(Short));

Edit: Soviel zu meinem Punkt "Der C++ Code ist unnötig kompliziert" (zumindest auf Delphi übertragen):
MoveMemory(@buffer[K * sizeof(Short)], @A2[K], sizeof(Short));
geht auch.

Es hilft halt, wenn man den Code den man überträgt auch versteht
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (23. Nov 2017 um 16:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#28

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 16:03
MoveMemory(Pointer(NativeUInt(@buffer[0])) + K * sizeof(Short), @A2[K], sizeof(Short)); Das gleiche Problem.
Da ist dir allerdings auch eine Klammer verrutscht. Pointer() darfst du erst schließen, nachdem du fertig addiert hast.

MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short)); Lässt sich kompilieren aber ob es richtig ist bzw.. die Daten korrekt verarbeitet werden ist mir nicht ersichtlich.
Sollte passen; ist zumindest die empfohlene Vorgenehsweise für genau solche Dinge.

Delphi-Quellcode:
procedure TSkinSpriteContainer.gDrawZorderObjects(WinHandle: HWND; hDCdest: HDC;
  InPrintMode: Integer);
var
  K, Item, gP: Integer;
begin
  Item := 0;
  ...
  MoveMemory(@Item, g_Prop[gP].order + K * sizeof(short), sizeof(short)); // Das Item hier müsste inkrementiert werden geht aber nicht.
  ...
end;
Nicht, wenn an g_Prop[gP].order + K * sizeof(short) eine 0 (bzw. 2 Nullen) im Speicher steht.

Fakt ist das MoveMemory eine einfache Win32 API ist und von allen Sprachen gleich interpretiert werden sollte.
Also warum funktioniert es unter C++ und nicht mit Delphi.
Dein konkretes Problem ist ja unabhängig von der API. Die Funktion macht unter beiden Sprachen das Gleiche; der Unterschied liegt im Aufruf. Hier unterscheiden sich die Sprachen wie gesagt in der unterschiedlichen Zeigerarithmetik. Was man hier präferiert ist ein Stück weit Geschmackssache. C/C++ ist hier eher implizit (und auch um einiges komplizierter) und bei Delphi musst du explizit casten.

MoveMemory(@buffer[K * sizeof(Short)], @A2[K], sizeof(Short)); geht auch.
Dann aber bitte ohne das SizeOf(Short) im Index
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 16:10
Zitat:
Da ist dir allerdings auch eine Klammer verrutscht. Pointer() darfst du erst schließen, nachdem du fertig addiert hast.
Danke habe ich so eben bemerkt.

Zitat:
Sollte passen; ist zumindest die empfohlene Vorgenehsweise für genau solche Dinge.
OK.. Werde es so übernehmen. (Auch wenn ich noch keinen sichtbaren Erfolg sehe denke da ist an anderer stelle noch ein kleines Problem.

Zitat:
Nicht, wenn an g_Prop[gP].order + K * sizeof(short) eine 0 (bzw. 2 Nullen) im Speicher steht.
Werde ich nochmals gegen prüfen.

Zitat:
Dein konkretes Problem ist ja unabhängig von der API. Die Funktion macht unter beiden Sprachen das Gleiche; der Unterschied liegt im Aufruf. Hier unterscheiden sich die Sprachen wie gesagt in der unterschiedlichen Zeigerarithmetik. Was man hier präferiert ist ein Stück weit Geschmackssache. C/C++ ist hier eher implizit (und auch um einiges komplizierter) und bei Delphi musst du explizit casten.
Ok .. Danke für die Informationen.

Zitat:
Es hilft halt, wenn man den Code den man überträgt auch versteht
Du hast natürlich recht.

gruss

Geändert von EWeiss (23. Nov 2017 um 16:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#30

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 16:23
MoveMemory(@buffer[K * sizeof(Short)], @A2[K], sizeof(Short)); geht auch.
Dann aber bitte ohne das SizeOf(Short) im Index
Nope. "buffer" ist ein Byte-Array
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 7     123 45     Letzte »    


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 12:08 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