Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Record Feld align unter Delphi 2009 (https://www.delphipraxis.net/120644-problem-mit-record-feld-align-unter-delphi-2009-a.html)

igel457 14. Sep 2008 11:35


Problem mit Record Feld align unter Delphi 2009
 
Hallo,
ich habe mit die Trial von Delphi 2009 heruntergeladen und versuche gerade meine Grafikbibliothek damit zum laufen zu kriegen. Das funktioniert soweit auch schon ganz gut. Ein Problem habe ich jedoch noch mit der Acinerella-Videoschnittstelle.

Ich habe folgende Typedeklaration:
Delphi-Quellcode:
{$MINENUMSIZE 1}
{$ALIGN 8}
//                                          Addr Offs. TurboDelphi 2006 | Delphi 2009
TAc_stream_info = record                   //         0                | 0
  stream_type: TAc_stream_type;            //         0                | 0
  case additional_info: byte of            //         4                | 8
    0: (video_info: TAc_video_stream_info); //         8                | 16 
    1: (audio_info: TAc_audio_stream_info); //         8                | 16
end;
Wie man sieht sind die Speicheradressen bei Delphi 2009 verschoben: Die Dummy-Variable "additional_info" wird bei TurboDelphi einfach zu Offset "4" verschoben, bei Delphi 2009 wird sie als eigenes Feld behandelt und bekommt Adresse "8". Die darauffolgenden Felder werden entsprechend weiter verschoben.

Hat jemand eine Idee wie ich dieses Problem beheben könnte? Ist das so gewollt? Oder ist es ein Bug im neuen Delphi?

Danke für eure Antworten,
Andreas

Daniel 14. Sep 2008 11:39

Re: Problem mit Record Feld align unter Delphi 2009
 
Was stecken denn für Variablen hinter Deinen Typen?
Ein Char beispielsweise ist jetzt nicht mehr nur 1 Byte lang. Analoges gilt für Strings. Das könnte eine mögliche Ursache sein. Die "alten" Typen heißen jetzt "AnsiChar" bzw. "AnsiString".

jbg 14. Sep 2008 11:42

Re: Problem mit Record Feld align unter Delphi 2009
 
Zitat:

Zitat von Daniel
Analoges gilt für Strings.

Ein String ist trotzdem nur ein 4-Byte Zeiger. Somit gilt nicht "Analoges", sondern das was bisher auch gegolten hat.

Was sich aber geändert hat ist dass Delphi 2008 sich nun strikter an dass {$ALIGN x} hält.

Daniel 14. Sep 2008 11:57

Re: Problem mit Record Feld align unter Delphi 2009
 
:gruebel:

Ich war jetzt gedanklich bei Strings mit fixer Länge. Wenn ich so einen String in einem Record habe, dann sitzt der doch komplett in diesem Record und verschiebt alle weiteren Felder entsprechend seiner Größe nach hinten.

jbg 14. Sep 2008 12:00

Re: Problem mit Record Feld align unter Delphi 2009
 
Nur nutzen ShortStrings immernoch AnsiChar als Element.

Daniel 14. Sep 2008 12:02

Re: Problem mit Record Feld align unter Delphi 2009
 
Na schön - hast Recht. :mrgreen:

igel457 14. Sep 2008 12:31

Re: Problem mit Record Feld align unter Delphi 2009
 
Hallo,
schonmal danke für die Antworten.

Hier sind die Deklarationen der anderen Datentypen:
Delphi-Quellcode:
TAc_decoder_type = (
  AC_DECODER_TYPE_VIDEO = 0,
  AC_DECODER_TYPE_AUDIO = 1
);
Delphi-Quellcode:
TAc_audio_stream_info = record
  samples_per_second: integer;
  bit_depth: integer;
  channel_count: integer;
end;
Delphi-Quellcode:
 
TAc_video_stream_info = record
  frame_width: integer;
  frame_height: integer;
  pixel_aspect: single;
  frames_per_second: double;
end;
Wie man sieht: Kein Typ vorhanden, der etwas mit Char oder String zu tun haben könnte.
Ich halte es einfach für einen Fehler, das die unbedeutende und niemals irgendwo verwendete Dummy-Variable "additional_info" nun auch ausgerichtet wird. Es handelt sich ja nicht einmal um eine richtige Variable, sondern vielmehr um einen Sprachkonstrukt.

Apollonius 14. Sep 2008 12:34

Re: Problem mit Record Feld align unter Delphi 2009
 
Warum deklarierst du das Feld denn, wenn du es nicht verwendest? Delphi erlaubt auch Folgendes:
Delphi-Quellcode:
TAc_stream_info = record                  
  stream_type: TAc_stream_type;            
  case byte of
    0: (video_info: TAc_video_stream_info);
    1: (audio_info: TAc_audio_stream_info);
end;

igel457 14. Sep 2008 12:40

Re: Problem mit Record Feld align unter Delphi 2009
 
Das hat natürlich was - so funktioniert es.
Ich wusste nicht, das ich das auch weg lassen kann.
Trotzdem hat sich das Verhalten in dieser Delphiversion eindeutig verändert und ich habe in den Releasenotes von Delphi 2009 nichts davon gelesen.

Also das Problem ist damit gelöst - schön finde ich es aber trotzdem nicht.

Danke an Alle,
Andreas

Apollonius 14. Sep 2008 12:48

Re: Problem mit Record Feld align unter Delphi 2009
 
Ich sehe das wie jbg: Der Fehler liegt bei Turbo Delphi. Denn dort widerspricht die Ausrichtung ja eindeutig der Direktive {$ALIGN 8}. Aber auch bei Turbo Delphi erhält das Feld additional_info seinen Platz.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Seite 1 von 2  1 2      

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