Type Missmatch! record expected Warum?

  • 1
  • 2
  • Page 1 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Type Missmatch! record expected Warum?

 · 
Posted: 13.07.2014 - 09:26  ·  #1
Hallo,

entweder ich habe einen Denkfehler oder es geht nicht ;)

Ich habe in Delphi einen Type in Form eines Records angelegt, in Summe 32 Words, wegen der Lesbarkeit der Werte habe ich hier kein ARRAY, sondern ein Record gewählt.

In AVRco wurde genau das gleiche Type angelegt. Nun werden über USB Datenempfangen:

Code

type
  tBuf64                 = Array[0..63] of byte;

//Status Struktur ONLINE!
TPVSStatus = record
    Kennung                       : WORD;   (* 0 Kennung für USB Transfer *)
    CMD                           : WORD;   (* 2 Cmd Befehl *)
    WM0002_WORK_Ges_Zeit          : WORD;   (* 4 Gesamte Überbrückungszeit*)
    WM0004_Timer_Bruecke_Wert     : WORD;   (* 6 laufende Überbrückungszeit*)
    WM0006_Ber_Zeit      : WORD;   (* 8 Berechtigte Zeit*)
    WM0018_AufZeit                : WORD;    (* 10 Öffnungszeit *)
    WM005A_ZeitWertHupe           : WORD;    (* 12 Timer Hupe*)
    WM005B_TempAufZeit            : WORD;    (* 14 Öffnungszeit als TEMP Zeit *)
    WM005C_Hupe_Zeit              : WORD;    (* 16 Geladene Zeit Hupe *)
    WX0000_Input                  : WORD;    (* 18 Input *)
    WY0010_Output                 : WORD;    (* 20 Output *)
    WRF03E_PotLinks               : WORD;    (* 22 PotiLinks *)
    WRF03F_PotRechts              : WORD;    (* 24 PotiRechts *)
    WM001b_HupeZeit               : WORD;    (* 26 ZeitWertHupe *)
    R7E2_RUN                      : WORD;    (* 28 1= RUN 0= STOP*)
    WM005D_RadarTriggerZeit       : WORD;    (* 30 laufende Zeit Trigger *)
    WM0031_RadarTriggerTime_MW049 : WORD;    (* 32 Radar Trigger Time *)
    WM005E_RadarDeadZeit          : WORD;    (* 34 laufende Zeit DeadTime *)
    WM0030_RadarDeadTime_MW048    : WORD;   (* 36 Radar DeadTime *)
    WM_Status0                    : WORD;   (* 38  Status0.0 Freigabe Aktiv / .1 NOTAUF / .2 ALARM / .3 Freigabe Aktiv *)
    WM_Reserve_040                : WORD;   (* 40 *)
    WM_Reserve_042                : WORD;   (* 42 *)
    WM_Reserve_044                : WORD;   (* 44 *)
    WM_Reserve_046                : WORD;   (* 46 *)
    WM_Reserve_048                : WORD;   (* 48 *)
    WM_Reserve_050                : WORD;   (* 50 *)
    WM_Reserve_052                : WORD;   (* 52 *)
    WM_Reserve_054                : WORD;   (* 54 *)
    WM_Reserve_056                : WORD;   (* 56 *)
    WM_Reserve_058                : WORD;   (* 58 *)
    WM_Reserve_060                : WORD;   (* 60 *)
    WM_Reserve_062                : WORD;   (* 62 *)
    end;

.......
{ Var Declarations }
{$IDATA}
VAR
  RxBuf                 : tBuf64, align2;  // USB incomming Buffer
  TxBuf                 : tBuf64, align2;  // USB outgoing Buffer
  ONL                    : TPVSStatus; // Online Statusblock

....


Wenn jetzt die Daten über USB empfangen werden, dann soll er den RxBuf in die Valiable ONL ablegen, unter Delphi mache ich das andauernd ohne Probleme, aber im AVRco führt die Funktion

Code
      ONL:= TPVSStatus(RxBuf); //sichere die übertragenen Daten


Zu der Compilerfehlermeldung "Type Missmatch! record expected", ist diese Art der Typenwandlung zu Complex für AVRco? Oder muss ich AVRco austricksen, indem ich über Pointer gehe?

Gruss
Thorsten
Harald_K
 
Avatar
 
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 13.07.2014 - 11:07  ·  #2
wie wärs denn einfach mit copyblock(rxbuf, onl, sizeof(rxbuf));



ggf könnte man auch einfach onl mit @RxBuf deklarieren um Speicherplatz zu sparen ... kommt drauf an wann der Rxbuf überschrieben wird.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 13.07.2014 - 12:02  ·  #3
Quote by Harald_K

wie wärs denn einfach mit copyblock(rxbuf, onl, sizeof(rxbuf));



ggf könnte man auch einfach onl mit @RxBuf deklarieren um Speicherplatz zu sparen ... kommt drauf an wann der Rxbuf überschrieben wird.


Hallo Harald_K,

ok an copyblock habe ich nicht gedacht, da ich normalerweise immer mit dem direkten Typcast arbeite. Ich habe vorhin das ganze auf Pointer umgestellt, damit geht es auch. Der AVRco mault dann nicht mehr, da er nicht prüfen kann welche Struktur dahinter steckt ;)

Aber mit der Funktion
Code
copyblock(@rxbuf, @onl, sizeof(rxbuf));

geht es zwar, aber währe die Funktion
Code
ONL:= TPVSStatus(RxBuf);

nicht schneller und kürzer?

Quote by Harald_K

ggf könnte man auch einfach onl mit @RxBuf deklarieren um Speicherplatz zu sparen ... kommt drauf an wann der Rxbuf überschrieben wird.

Nein, das geht nicht, da der USB-Empfangsbuffer für viele verschiedene Telegramme genutzt wird.
Anhand Stellen CMD und Kennung weiß der XMEGA dann was er mit dem Paket machen soll ;)

Die Frage die sich mir hier stellt ist einfach, warum geht es nicht? Ich benutze diese Art des Typecasts schon seit Delphi V1.x ? Evtl. muss man es ja in AVRco nur anders schreiben?

Aber trotzdem Danke für den Tipp mit Copyblock

Gruß
PVS-Deck
Harald_K
 
Avatar
 
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 13.07.2014 - 23:31  ·  #4
wenn du wissen willst was schneller ist -

schreib beides in den Code rein und schau dir an was der Compiler draus macht.

letztlich ist es immer eine Schleife mit Byte laden, Byte speichern, Adresse inkrementieren, Zähler dekrementieren und auf 0 testen und zurück springen.

beim Zuweisen per Pascal kommt evtl. noch was an Code für Bereichsprüfungen dazu, das gibts bei so low-level-Zeugs wie copyblock nicht, da muß der Anwender selber drauf achten.
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 15.07.2014 - 23:17  ·  #5
How about using an overlay, so that ONL occupies the same memory as RxBuf?
Code
var
  RxBuf       : tBuf64, align2;  // USB incomming Buffer
  TxBuf       : tBuf64, align2;  // USB outgoing Buffer
  ONL[@RxBuf] : TPVSStatus;      // Online Statusblock; <<< use overlay 
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 16.07.2014 - 08:48  ·  #6
Hallo Zusammen,

meine Meinung ist, dass das so funktionieren muss, wie Thorsten es im Eröffnungspost geschrieben hat.

@Rolf: Bitte hilf uns. :-)

Gruß
Thomas aus Aachen
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 16.07.2014 - 12:17  ·  #7
Overlays, as described by Avra, will be faster because no copying is involved. The typecasting method involves an implicit copy, even if it worked.

I am not convinced that typecasting an array to a record is a sensible thing to do, even if Delphi does allow it. It seems to me to be equivalent to typecasting an integer to a string, but maybe that is just me. I know why you want to do it, but to me the overlay method is more explicit and easier to read.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Type Missmatch! record expected Warum?

 · 
Posted: 16.07.2014 - 13:03  ·  #8
@all,
typecasting of records to arrays and vice versa is not supported.
But with most cases a CopyBlock does the same.
We use a similar technique with an overlay, as Avra suggested, in our
programmers with the USB rx and tx buffers.

rolf
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   134   148 · Page-Gen-Time: 0.027224s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI