Delphi-PRAXiS

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 10: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 10:58

Re: Array zerlegen
 
Ist move wast du suchst?

blackmice 11. Feb 2008 11: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 11: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 11: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 11:16

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

blackmice 11. Feb 2008 11: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 11: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 11: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 12: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.

blackmice 11. Feb 2008 12:22

Re: Array zerlegen
 
Ok, jetzt verstehe ich nur noch Bahnhof. Also die Unterscheidung zwischen Dynamischen und Statischen Arrays krieg ich jetzt ja grad noch zusammen, und das mit SetLength für nen dynamischen Array hab ich auch verstanden, aber wie muss ich denn das ganze definieren, damit es keine statische Speicheranforderung ist?

marabu 11. Feb 2008 12:37

Re: Array zerlegen
 
So:

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

var
  FPGAData     : PCustArr;
  AnalogArr    : PChannel;
  DataArr      : PChannel;

begin
  GetMem(DataArr, FPGAMax shl 1); // FPGAMax * SizeOf(Word)
end.

blackmice 11. Feb 2008 12:53

Re: Array zerlegen
 
Könnte ich in deinem Fall auch mit @FPGAData weiterarbeiten? In meinem Aufruf der NI-Karte tue ich das nämlich.
Der sieht im übrigen so aus

Delphi-Quellcode:
DIG_Block_In(iDevice,iPort,@FPGAData[iPort,0],FPGAMax);
Klingt jetzt vielleicht ein bischen dumm, aber ich hab die Teile der Steuerung der NI-Karte aus nem anderen Sourcecode. Den hat mein Vorgänger da gelassen. Meine bisherigen Programmierkenntnisse liegen 1. in anderen Sprachen und 2. hab ich bisher immer nur Datenbankprogramme geschrieben.

marabu 11. Feb 2008 13:30

Re: Array zerlegen
 
An dem von dir gezeigten Statement musst du nichts ändern. Du solltest dir vielleicht ein kleines Testprogramm in Delphi schreiben, um mit den Schreibweisen zu spielen.

Die statische Größe von 10MB aus deinem Beispiel würdest du bei dynamischer Speicheranforderung passender wählen.

Muetze1 11. Feb 2008 15:29

Re: Array zerlegen
 
Ansonsten zur Ausgangsfrage: Delphi-Referenz durchsuchenCopy() und Delphi-Referenz durchsuchenSlice()


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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 by Thomas Breitkreuz