AGB  ·  Datenschutz  ·  Impressum  







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

Array of Integer und crash

Ein Thema von EWeiss · begonnen am 19. Mär 2017 · letzter Beitrag vom 27. Sep 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Array of Integer und crash

  Alt 19. Mär 2017, 21:37
Zitat:
Was deinen Fix angeht: ich fürchte, du hast immer noch den Fehler drin, er äußert sich jetzt vermutlich nur anders weil andere Variablen überschrieben werden. Hier gilt immer noch die goldene Regel: Wenn du nicht verstehst, warum eine Änderung den Fehler behebt, dann hast du ihn wahrscheinlich auch nicht behoben.
Möglich da ich wirklich nicht weiß warum dieser das Problem behoben hat.
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56

Hmmmm


gruss

Geändert von EWeiss (11. Jul 2019 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 21:54
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.
Wohl eher: damit andere Daten überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56
Daraus schließe ich, daß jetzt die ersten 56 Byte hinter dem PropItem Feld überschrieben werden. Deklariere dort doch zum Test mal einen entsprechend großen Bereich, initialisiere ihn (sollte sowieso alles 0 sein) und schau nach, was nach dem Aufruf drin steht. Würde mich auch nicht wundern, wenn der Value-Pointer genau auf diesen Bereich zeigt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Array of Integer und crash

  Alt 19. Mär 2017, 21:58
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.
Wohl eher: damit andere Daten überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56
Daraus schließe ich, daß jetzt die ersten 56 Byte hinter dem PropItem Feld überschrieben werden. Deklariere dort doch zum Test mal einen entsprechend großen Bereich, initialisiere ihn (sollte sowieso alles 0 sein) und schau nach, was nach dem Aufruf drin steht. Würde mich auch nicht wundern, wenn der Value-Pointer genau auf diesen Bereich zeigt.
Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.
Oder was meinst du genau.

Danke für deine Hilfe hab da echt ein Verständnis Problem.
gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:09
Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.
Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.

Delphi-Quellcode:
   PropSize: UINT;
   PropItem: PPropertyItem; // dynamischer Pointer auf Record


  if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
  begin
    GetMem(PropItem, PropSize); // Record in passender Größe bereitstellen
    // Daten auslesen
    if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem^) = S_OK then // Alternativ den Typ des Parameters in PPropertyItem ändern
    ...
    FreeMem(PropItem); // Delphi merkt sich die Size intern
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:13
Zitat:
Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.
Jo das meinte ich doch Danke.

So wie du sagst es gibt immer noch Probleme eigentlich müsste ich als Ergebnis für jedes Frame 80 MS Wartezeit haben.
Die sind aber nicht richtig da die Daten durcheinander sind die Ankommen.

Danke werde mal das Memory so allokieren wie du gezeigt hast.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:30
Es geht nicht wirklich musste es ändern da sich die Typen nicht vertragen haben.

TProp musste ich umdefinieren..
  TProp = array of Byte;
Delphi-Quellcode:
var
  p: Pointer;
//###############
// Bytearray dimensionieren
p := @PropItem;
GetMem(p, PropSize);

SetLength(Prop, (PropItem.length - 1));
CopyMemory(@Prop[0], @PropItem.value, PropItem.length);

FreeMem(p);
Hab irgendwo ein denk Fehler.
Die Einträge nach meinem Verständnis müssten eigentlich so aussehen
8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0

Sehen aber aus wie im Bild gezeigt.
Irgendwas stimmt noch nicht. (Ein durcheinander)
NA ja hab mich noch nicht wirklich mit dem GIF Kram auseinandergesetzt.


gruss

Geändert von EWeiss (11. Jul 2019 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:32
Versuch doch mal so (value ist doch ein Pointer auf den Datenbereich):

CopyMemory(@Prop[0], PropItem.value, PropItem.length);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:47
Das sieht aber immer noch nicht so aus, wie ich das gezeigt hatte:

Delphi-Quellcode:
var
  p: Pointer;
//###############
// Bytearray dimensionieren
p := @PropItem;
GetMem(p, PropSize);

SetLength(Prop, (PropItem.length - 1));
CopyMemory(@Prop[0], @PropItem.value, PropItem.length);

FreeMem(p);

So sollte es auch mit dem Prop-Array gehen:

Delphi-Quellcode:
   PropSize: UINT;
   PropItem: PPropertyItem; // dynamischer Pointer auf Record, deswegen PPropertyItem und nicht TPropertyItem


  if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
  begin
    GetMem(PropItem, PropSize); // Record in passender Größe bereitstellen
    // Daten auslesen
    if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem^) = S_OK then begin
      SetLength(Prop, PropItem.length); // nix -1 !!!
      CopyMemory(@Prop[0], PropItem.value, PropItem.length);
      ...
    end;
    FreeMem(PropItem); // Delphi merkt sich die Size intern
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 06:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz