Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array zerlegen (https://www.delphipraxis.net/108305-array-zerlegen.html)

blackmice 11. Feb 2008 09:55


Array zerlegen
 
Hallo,

wahrscheinlich stell ich mich einfach mal wieder zu blöd an, aber gibt es eine bessere Methode einen Array in 2 Arrays oder einen Record zu zerlegen, als ich per For-Schleife komplett zu durchlaufen?

Mein Source sieht derzeit so aus:

Delphi-Quellcode:
iMaxAnalog := 0;
iMaxData := 0;
Repeat
  For j := 0 to iWidth do
  begin
    AnalogArr[iMaxAnalog] := FPGAData2[iPort,i];
    i := i + 1;
    iMaxAnalog := iMaxAnalog + 1;
  end;

  For j := 0 to 4 do
  begin
    DataArr[iMaxData] := FPGAData2[iPort,i];
    i := i + 1;
    iMaxData := iMaxData;
  end;
until i >= inbuf;
inbuf gibt an, wie viele Felder im Array FPGAData2 gefüllt sind. Das ganze kommt aus einer NI-Karte weshalb es variieren kann. Der Datenstrom ist aber immer so aufgebaut, dass es eine einstellbare Anzahl an Bytes gibt (iWidth), die in den Array AnalogArr sollen und 4 Bytes die in den Array DataArr sollen. iWidth ist dabei im Programm einstellbar zwischen 1 und 128.

Vielen Dank schon mal im Voraus.
Blackmice

QuickAndDirty 11. Feb 2008 09:58

Re: Array zerlegen
 
Ist move wast du suchst?

blackmice 11. Feb 2008 10:04

Re: Array zerlegen
 
Entweder habe ich move falsch angewendet, oder es liefert nicht das richtige Ergebnis. Abgesehen davon ist das auch nicht wirklich schneller als die For-Schleife. Jedenfalls nicht, wenn ich meinen Zeitmessungen trauen kann.

marabu 11. Feb 2008 10:06

Re: Array zerlegen
 
Hi,

die FOR-Schleifen laufen eins zu weit, die REPEAT-Schleife finde ich unpassend.

Freundliche Grüße

blackmice 11. Feb 2008 10:11

Re: Array zerlegen
 
Hmm, ok, ist vielleicht nicht der beste Programmierstil, aber als Anfänger hab ich sowas noch nicht so richtig drauf. Wie sollte ich es denn deiner Meinung nach besser machen?

marabu 11. Feb 2008 10:16

Re: Array zerlegen
 
Dazu müsste ich die Deklarationen von AnalogArr[], DataArr[] und FPGAData2[] kennen.

blackmice 11. Feb 2008 10:25

Re: Array zerlegen
 
Delphi-Quellcode:
const
  FPGAMax    = 5000000;
type
  custarr    = array[1..2,0..FPGAMax-1] of Word;

var
  FPGAData     : custarr;
  AnalogArr    : array[0..FPGAMax-1] of Word;
  DataArr      : array[0..FPGAMax-1] of Word;
Es sind alles Arrays of Word.

marabu 11. Feb 2008 10:54

Re: Array zerlegen
 
Du hast nicht sehr viel Hintergrundinfo geliefert, deshalb muss ich auf Annahmen bauen.

Delphi-Quellcode:
type
  TChannel   = array [0..FPGAMax-1] of Word;
  TCustArr   = array [1..2] of TChannel;

var
  FPGAData     : TCustArr;
  AnalogArr    : TChannel;
  DataArr      : TChannel;

procedure ExtractData(fpga: TCustArr; analog, data: TChannel; iPort, iWidth, n: Cardinal);
var
  i: Integer;
begin
  for i := 0 to Pred(n) do
  begin
    Move(fpga[iPort, i * (iWidth + 4)], analog[i * iWidth], iWidth shl 1);
    Move(fpga[iPort, i * (iWidth + 4) + iWidth], data[i shl 2], iWidth shl 1);
  end;
end;


// Aufruf:

var
  n: Cardinal;

begin
  n := inBuf div (iWidth + 4);
  ExtractData(FPGAData, AnalogArr, DataArr, iPort, iWidth, n);
end;
Getippt und nicht getestet.

Warum legst du den Speicher statisch an?

Freundliche Grüße

blackmice 11. Feb 2008 10:59

Re: Array zerlegen
 
Erst mal vielen Dank, ich werde die Version testen.

Ich hab nicht besonders viel Erfahrung mit der Steuerung einer NI-Karte, das ist mein Erster Versuch Daten aus einem externen Gerät auszulesen, aber in der Beschreibung der Funktionen für die NI-Karte brauchst du eine Angabe für die Maximale Buffer-Größe. Die ist FPGAMax und daher hab ich einfach die Array so statisch definiert. Abgesehen davon hab ich ebenfalls nicht besonders viel Erfahrung mit dynamischen Arrays

marabu 11. Feb 2008 11:07

Re: Array zerlegen
 
Nur um alle Klarheiten zu vermeiden: Es gibt statische und dynamische Arrays. Du benötigst höchstwahrscheinlich ein statisches Array, aber dessen Speicherplatz kann auch zur Laufzeit mittels GetMem() angefordert werden. Beim dynamischen Array kann die Dimensionierung jederzeit mittels SetLength() variiert werden, aber bei mehrdimensionalen dynamischen Arrays ist der Datenbereich nicht zusammenhängend, sondern wird von Verwaltungsinformationen durchsetzt. Mein "statisch" bezog sich auf die Speicheranforderung, nicht auf die Dimensionierung.


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