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 Funktion Parameter zuweisen (Array of Byte) (https://www.delphipraxis.net/77080-funktion-parameter-zuweisen-array-byte.html)

Klaus01 14. Sep 2006 13:37


Funktion Parameter zuweisen (Array of Byte)
 
Ich habe folgende Typdeklaration:

Delphi-Quellcode:
types

  RLInformation = record
     case boolean of
       true : (rawSet : Array [0..7] of Byte);
       false: ( RNCID: Array [0..1] of Byte;
                CellID: Array [0..1] of Byte;
                BTSNumber: Array [0..1] of Byte;
                CPICHEc_N0: Byte;
                HSDPAIndicator: Byte;
              )
  end;


Damit mappe ich ein Array auf verschieden kleine Arrays.

Nun will ich mit folgender Funktion z.B die CellID bekommen.
Also übergebe ich der Funktion ein Array of Byte und will
sie Funktionsintern der Variable RLInfo.rawSet (ist auch ein Array of Byte).
Delphi-Quellcode:
function getCellID(RLData: Array of Byte):Word;
var
  RLInfo: RLInformation;
//  i:Byte;
begin
//  for i:=0 to High(RLData) do
//    RLInfo.rawSet[i]:= RLData[i];
  RLInfo.rawSet:=RLData;            //<----------incompatible types
  result:= StrToInt('$'+IntToHex(RLInfo.cellID[0],2)+IntToHex(RLInfo.cellID[1],2));
  if result = High(Word) then
    result := 0;
end;
Nur mosert Delphi da.
Wenn ich die Wert einzeln übergebe klappt das.
Ist mir aber zu Zeitintensiv.

Weiß jemand aus dem Forum Rat?

Grüße und Danke
Klaus

generic 14. Sep 2006 13:46

Re: Funktion Parameter zuweisen (Array of Byte)
 
mach hier mal einen typ draus:
Delphi-Quellcode:
//  RLData: Array of Byte
type
  meinRLData = Array of Byte;

function getCellID(RLData: meinRLData ):Word;

xaromz 14. Sep 2006 13:47

Re: Funktion Parameter zuweisen (Array of Byte)
 
Hallo,

es gibt für Dein Problem zwei Lösungen:
Die erste Lösung hast Du schon benannt. Sonderlich langsam ist das bei acht Bytes eigentlich nicht.

Die zweite Lösung wäre, einfach Delphi-Referenz durchsuchenMove zu verwenden. Damit kannst Du die Werte des Arrays einfach als Block kopieren.

@generic: array of Byte <> array [0..7] of Byte;
Das Erste ist eigentlich nur ein Pointer, das zweite sind tatsächlich 8 Byte.

Gruß
xaromz

shmia 14. Sep 2006 13:50

Re: Funktion Parameter zuweisen (Array of Byte)
 
Delphi-Quellcode:
Move(RLData[0], RLInfo.rawSet[0], sizeof(RLInfo.rawSet));

Klaus01 14. Sep 2006 13:59

Re: Funktion Parameter zuweisen (Array of Byte)
 
@xaromz und shmia
danke klappt gut damit.

@generic
Dein Vorschlag bringt auch eine TypInkompatibilität.

@xaromz
Zitat:

Die erste Lösung hast Du schon benannt. Sonderlich langsam ist das bei acht Bytes eigentlich nicht.
Nun ich habe eine Datei mit ca.100000 Datensätzen und pro Datensatz wird die Funktion
4 mal aufgerufen.

Grüße
Klaus

generic 15. Sep 2006 07:33

Re: Funktion Parameter zuweisen (Array of Byte)
 
ich muss zugeben ich habe den source nicht ganz gelesen gehabt und es auch nicht im komplierer ausprobiert.

*schäm*

die stichwörter auf meine antwort waren:
delphi meckert und ich hab den procedurekopf gesehen.

so im nachhinein - meine antwort hat mit diesem thread nichts zu tun.

typeninkopatiblität - klar!
Delphi-Quellcode:
(rawSet : Array [0..7] of Byte);
ist ungleich
Delphi-Quellcode:
  meinRLData = Array of Byte;
du kannst natürlich daraus machen:
Delphi-Quellcode:
  meinRLData = Array [0..7] of Byte;
dann funktioniert zumindest deine zuweisung hier:
Delphi-Quellcode:
  RLInfo.rawSet:=RLData;

Mavarik 15. Sep 2006 07:39

Re: Funktion Parameter zuweisen (Array of Byte)
 
Hallo!

Warum arbeitest Du mit einen Array of Byte, wenn doch eigentlich Dein RLInformation Record benutz werden soll?

Erzeuge doch direkt ein Array of RLInformation...

Grüsse Frank

Klaus01 15. Sep 2006 07:51

Re: Funktion Parameter zuweisen (Array of Byte)
 
@Mavarik

nun, ich habe eine Datensatz der besteht aus 176 Byte
Diese lese ich ein ein Array ein:
Die Datensatzstruktur ist die folgende:

Delphi-Quellcode:
 
TKDUSet = record
    case boolean of
      true: (rawSet: Array [1..176] of Byte);
      false: ( //Gap: Array [1..60] of Byte;
               //FileManagementData: Array[1..12] of Char;
               FaultType: Byte;  
               Direction: Byte;
               MessageNumber: Array [0..1] of Byte;
               TargetNode: Array [0..15] of Byte;
               Cause : Array [0..7] of Byte;
               Time : Array [0..7] of Byte;
               S_RNTI: Array [0..3] of Byte;
               RNCType: Byte;
               UEState: Byte;
               MainProcedure: Byte;
               Reserved : Byte;
               DRNCProcedure: Byte;
               DRNCState: Byte;
               MUEProcedure: Byte;
               MUEState : Byte;
               CRLProcedure: Byte;
               CRLState: Byte;
               TBProcedure: Byte;
               TBState: Byte;
               RACInstanceGroupID: Byte;
               RACInstanceProcessID: Byte;
               RACInstanceUEInstance: Array [0..1] of Byte;
               RRCEstablishmentCause: Byte;
               UEIDType: Byte;
               UEID: Array [0..7] of Byte;
               UEReleaseIndicator: Byte;
               HSDPAState: Byte;
               ServiceType: Array [0..1] of Byte;
               ULTFCSType: Byte;
               DLTFCSType: Byte;
               RLInformation: Array [0..3] of Array [0..7] of Byte;
               HWInformationDCCH: Array [0..23] of Byte;
               HWInformationServiceType: Array [0..1] of Array [0..23] of Byte;
              )
  end;
Wie man hier sieht ist RLInformation ein Array [0..7] of Byte.
RLInformation ist wieder ein eigener Datensatz:

Delphi-Quellcode:
  RLInformation = record
     case boolean of
       true : (rawSet :Array [0..7] of Byte);
       false: ( RNCID: Array [0..1] of Byte;
                CellID: Array [0..1] of Byte;
                BTSNumber: Array [0..1] of Byte;
                CPICHEc_N0: Byte;
                HSDPAIndicator: Byte;
              )
  end;
Ich arbeite hier mit Records weil ich dann einfacher auf die einzelnen Datenfelder zugreifen kann
ohne immer in dem Array hin und her zu springen.
Hierzu bieten sich, meiner Meinung nach, variante Records an.
Denn man kann hier relative einfach das Mapping von Datensatz auf Datenfelder vornehmen.

Ich bin damit auch relative unabhängig wenn sich die Datenstruktur innerhalb z.B.
RLInformation ändert. Ich brauche dann, entsprechend nur die Recordstruktur ändern.

Grüße
Klaus

Mavarik 15. Sep 2006 08:16

Re: Funktion Parameter zuweisen (Array of Byte)
 
hmm verstehe zwar die Problematik nicht so ganz, aber warum speicherst Du dann nicht den ganzen TKDUSet Record... Hast Doch sowieso eine feste Datensatzlänge...

Frank :gruebel:

Klaus01 15. Sep 2006 12:43

Re: Funktion Parameter zuweisen (Array of Byte)
 
Die Daten schreibe ich nicht, ich lese sie nur.
Sie kommen von einer anderen Anwendung aus dem UnixUmfeld.

Grüße
Klaus


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