Type Missmatch! record expected Warum?

  • 1
  • 2
  • Seite 1 von 2
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1344
Dabei seit: 02 / 2009
Betreff:

Type Missmatch! record expected Warum?

 · 
Gepostet: 13.07.2014 - 09:26 Uhr  ·  #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
 
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 13.07.2014 - 11:07 Uhr  ·  #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
Geschlecht:
Alter: 54
Beiträge: 1344
Dabei seit: 02 / 2009
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 13.07.2014 - 12:02 Uhr  ·  #3
Zitat geschrieben von 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?

Zitat geschrieben von 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
 
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 13.07.2014 - 23:31 Uhr  ·  #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
Geschlecht:
Herkunft: Belgrade, Serbia
Alter: 54
Homepage: rs.linkedin.com/in…
Beiträge: 653
Dabei seit: 07 / 2002
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 15.07.2014 - 23:17 Uhr  ·  #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
Geschlecht: keine Angabe
Alter: 44
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 16.07.2014 - 08:48 Uhr  ·  #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
Geschlecht:
Alter: 25
Beiträge: 1474
Dabei seit: 03 / 2005
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 16.07.2014 - 12:17 Uhr  ·  #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
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Type Missmatch! record expected Warum?

 · 
Gepostet: 16.07.2014 - 13:03 Uhr  ·  #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
  • Seite 1 von 2
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   134   148 · Page-Gen-Time: 0.035407s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI