AGB  ·  Datenschutz  ·  Impressum  







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

Array zerlegen

Ein Thema von blackmice · begonnen am 11. Feb 2008 · letzter Beitrag vom 11. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#1

Array zerlegen

  Alt 11. Feb 2008, 10:55
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
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.926 Beiträge
 
Delphi 12 Athens
 
#2

Re: Array zerlegen

  Alt 11. Feb 2008, 10:58
Ist move wast du suchst?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#3

Re: Array zerlegen

  Alt 11. Feb 2008, 11:04
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.
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

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

Re: Array zerlegen

  Alt 11. Feb 2008, 11:06
Hi,

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

Freundliche Grüße
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#5

Re: Array zerlegen

  Alt 11. Feb 2008, 11:11
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?
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

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

Re: Array zerlegen

  Alt 11. Feb 2008, 11:16
Dazu müsste ich die Deklarationen von AnalogArr[], DataArr[] und FPGAData2[] kennen.
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#7

Re: Array zerlegen

  Alt 11. Feb 2008, 11:25
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.
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

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

Re: Array zerlegen

  Alt 11. Feb 2008, 11:54
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
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#9

Re: Array zerlegen

  Alt 11. Feb 2008, 11:59
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
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

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

Re: Array zerlegen

  Alt 11. Feb 2008, 12:07
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:45 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