Delphi-PRAXiS

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.

Lasse2002 14. Sep 2008 16:20

Re: Problem mit Record Feld align unter Delphi 2009
 
Hast du es schon mal mit {$ALIGN 4} probiert?

igel457 14. Sep 2008 16:53

Re: Problem mit Record Feld align unter Delphi 2009
 
Nein, {$ALIGN 4} wäre hier auch fehl am Platz: Die C-Bibliothek die mit der Headerdatei angesprochen wird ist mit {$ALIGN 8} compiliert.

Hawkeye219 2. Okt 2008 08:12

Re: Problem mit Record Feld align unter Delphi 2009
 
Hallo Andreas,

das habe ich gerade gefunden: Alignment in Delphi 2009

Gruß Hawkeye

igel457 7. Okt 2008 19:44

Re: Problem mit Record Feld align unter Delphi 2009
 
Danke für den Link.

Die Lösung von oben war auch nur suboptimal. Nachdem meine Delphi 2009 Trial abgelaufen war und ich mein Turbo Delphi wieder ausgepackt habe, lief die Anwendung damit nicht mehr. Es muss also definitiv ein Kompilierschalter her.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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