AGB  ·  Datenschutz  ·  Impressum  







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

Array Problem

Ein Thema von bergamo34 · begonnen am 1. Dez 2005 · letzter Beitrag vom 2. Dez 2005
Antwort Antwort
bergamo34

Registriert seit: 23. Jan 2004
19 Beiträge
 
#1

Array Problem

  Alt 1. Dez 2005, 12:03
Hallo,


Das folgende type ist ein Auszug aus dem Twain.pas (DelphiTwain-Component bei sourceforge.net)

Delphi-Quellcode:

TW_EXTIMAGEINFO = packed record
    NumInfos: TW_UINT32;
    Info: array[0..0] of TW_INFO;
  end;
mein Problem:
ich brauche aber mehr als nur ein Info (siehe unten procedure Auszug). Im TW_EXTIMGAINFO-Struct ist das Info als ein Array von der Länge 1 definiert! Wie kann ich das lösen?

Delphi-Quellcode:

procedure Tfrm_main.DelphiTwain1SourceSetupFileXfer(Sender: TObject; const Index: Integer);
var vTWExtImageInfo: TW_EXTIMAGEINFO;
    sBarcodeText: String;
begin
  with vTWExtImageInfo do
  begin
    NumInfos := 4;
    Info[0].InfoID := TWEI_BARCODETYPE;
    Info[0].ItemType := TWTY_UINT32;
    Info[0].NumItems := 0;
    Info[0].CondCode := 0;
    Info[0].Item := 0;

    Info[1].InfoID := TWEI_BARCODETYPE;
    Info[1].ItemType := TWTY_UINT32;
    Info[1].NumItems := 0;
    Info[1].CondCode := 0;
    Info[1].Item := 0;

    Info[2].InfoID := TWEI_BARCODETEXTLENGTH;
    Info[2].ItemType := TWTY_UINT32;
    Info[2].NumItems := 0;
    Info[2].CondCode := 0;
    Info[2].Item := 0;

    Info[3].InfoID := TWEI_BARCODETEXT;
    Info[3].ItemType := 0;
    Info[3].NumItems := 0;
    Info[3].CondCode := 0;
    Info[3].ItemType := 0;

    .....
gruß

bergamo34
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Array Problem

  Alt 1. Dez 2005, 12:11
*selbstzitier*
Zitat von Khabarakh:
Das wird auch oft für "hausgemachte" dynamische Arrays benutzt:
Delphi-Quellcode:
PColor32Array = ^TColor32Array;
  TColor32Array = array [0..0] of TColor32;
TBitmap32 verwaltet seinen Pixel-Speicher selbst, über obigen Typ kann man aber trotzdem wie auf ein Array zugreifen:
Delphi-Quellcode:
for i := 0 to Bit.Width * Bit.Height - 1 do
  Bit.Bits[i] := clWhite32;
Bereichsprüfung sollte natürlich deaktiviert sein .
Das Recordfeld ist also nur ein Zeiger auf das erste Item, du kannst problemlos auf Indizes bis NumInfos - 1 zugreifen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Array Problem

  Alt 1. Dez 2005, 12:18
Das ist die Uebertragung eines Sprachfeatures von C.
Das Record ist nur ein Header einer laengeren Liste.
In C kann man nun innerhalb des Records ein Array-Element deklarieren mit Arraylaenge 0.
Damit traegt das Element nicht zur Laenge (sizeof) des Records bei.
Das Element dient nur dazu das man seine Adresse bilden kann. Damit bekommt man die Adresse direkt hinter dem Record.

In Delphi kann man das nicht genau nachbilden, da ein leeres Array nicht erlaubt ist und daher in die Recordgroesse eingeht.
Da diese Headerstruktur aber sowieso nur ein Teil eines laengeren Puffers ist, ist das nicht so tragisch.
  Mit Zitat antworten Zitat
bergamo34

Registriert seit: 23. Jan 2004
19 Beiträge
 
#4

Re: Array Problem

  Alt 1. Dez 2005, 14:35
danke für die Antworten, aber mir ist immer noch nicht ganz klar!

Zitat:
Bereichsprüfung sollte natürlich deaktiviert sein
???

bei dem obigen Beispiel kommt die Fehlermeldung "Konstantenausdruck verletzt untere Grenzen".
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Array Problem

  Alt 1. Dez 2005, 15:53
Du bekommst doch bestimmt auch gesagt, in welcher Zeile der Fehler auftritt - oder?

Grüße vom marabu
  Mit Zitat antworten Zitat
bergamo34

Registriert seit: 23. Jan 2004
19 Beiträge
 
#6

Re: Array Problem

  Alt 1. Dez 2005, 19:50
ja, Fehlerzeile:

Info[1].InfoID := TWEI_BARCODETYPE;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Array Problem

  Alt 2. Dez 2005, 11:16
Die Meldung in Verbindung mit dieser Code-Zeile macht mich zwar stutzig, aber was mich viel mehr stutzen lässt ist die Tatsache, dass du eine nur zur Redefinition gedachte Speicherstruktur direkt befüllen möchtest. Du musst denn Speicher dynamisch zuordnen, wenn du mehr als einen Info-Record befüllen willst.

Grüße vom marabu
  Mit Zitat antworten Zitat
bergamo34

Registriert seit: 23. Jan 2004
19 Beiträge
 
#8

Re: Array Problem

  Alt 2. Dez 2005, 14:36
ja aber wie???
bin leider noch nicht weiter gekommen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Array Problem

  Alt 2. Dez 2005, 20:22
Hallo.

Du musst den Speicher für deine vier Image Descriptoren dynamisch anfordern:

Delphi-Quellcode:
var
  pExtImgInfo: PTW_ExtImageInfo;
  pInfo: PTW_Info;
  iCount, iSize: cardinal;
  sBarcodeText: string;
begin
  iCount := 4; // Anzahl der Infos
  iSize := SizeOf(TW_UINT32) + iCount * SizeOf(TW_INFO);
  GetMem(pExtImgInfo, iSize);

  pExtImgInfo^.NumInfos := iCount;

  pInfo := @pExtImgInfo^.Info; // auf erstes item zeigen
  with pInfo^ do
  begin
    InfoID := TWEI_BARCODETYPE;
    ItemType := TWTY_UINT32;
    NumItems := 0;
    CondCode := 0;
    Item := 0;
  end;

  Inc(pInfo); // auf nächstes Item zeigen
  with pInfo^ do
  begin
    InfoID := TWEI_BARCODETYPE;
    ItemType := TWTY_UINT32;
    NumItems := 0;
    CondCode := 0;
    Item := 0;
  end;

  // ...

  FreeMem(pExtImgInfo, iSize); // Speicher wieder freigeben
end;
Grüße vom marabu
  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 07:21 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