![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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