![]() |
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:
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.
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; Vielen Dank schon mal im Voraus. Blackmice |
Re: Array zerlegen
Ist move wast du suchst?
|
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.
|
Re: Array zerlegen
Hi,
die FOR-Schleifen laufen eins zu weit, die REPEAT-Schleife finde ich unpassend. Freundliche Grüße |
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?
|
Re: Array zerlegen
Dazu müsste ich die Deklarationen von AnalogArr[], DataArr[] und FPGAData2[] kennen.
|
Re: Array zerlegen
Delphi-Quellcode:
Es sind alles Arrays of Word.
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; |
Re: Array zerlegen
Du hast nicht sehr viel Hintergrundinfo geliefert, deshalb muss ich auf Annahmen bauen.
Delphi-Quellcode:
Getippt und nicht getestet.
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; Warum legst du den Speicher statisch an? Freundliche Grüße |
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 |
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.
|
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?
|
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. |
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:
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.
DIG_Block_In(iDevice,iPort,@FPGAData[iPort,0],FPGAMax);
|
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. |
Re: Array zerlegen
|
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