Compiler Warnung - warum?

OP #636703
Lesenswert?
• ▲
▼
Ich habe den Auftrag gefasst, eine ältere auf KEIL 4 compilierte 
Software auf die aktuell eingesetzte KEIL Version zu portieren.
KEIL ist zwar nicht gcc, aber für diesen gibts hier ja kein eigenes 
Forum.
Es geht daher bei der Fragestellung um den Compiler KEIL C51 Version 
8.09a.
Bitte motzen, wenn der Beitrag daher in eine andere Rubrik gehören würde 
;-)

Folgendes Code-Segment ergibt bei mir eine Warnung.
1
#define DESCRIPTOR_START_ADDRESS      0x24050L
2
#define DESCRIPTOR_END_ADDRESS        0x27FF0L
3
#define DESCRIPTOR_MEMORY_SIZE        DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS
4

5
static byte      DescBlockMemory[DESCRIPTOR_MEMORY_SIZE] _at_ DESCRIPTOR_START_ADDRESS;

Nun spuckt mir der KEIL diese Warnung aus:
*** WARNING C219 IN LINE 109 OF SOURCE\DESCMGT.C: long constant 
truncated

Der Compiler wurde ganz normal ohne viele Options aufgerufen:
C51 source\DESCMGT.C large

Wie kann ich die verhindern?

Danke für die Antworten!
Gast #636739
Lesenswert?
• ▲
▼
Hi Martin,

ohne wirklich genau zu wissen, was dem Compiler nicht passt: Es scheint, 
er hat ein Problem mit dem long-Wert der Array-Definition (evtl. nur int 
erlaubt, ich kenne mich mit C nicht perfekt aus, in Java wäre das das 
Problem). Vielleicht würde ein Blick in die Doku zum Thema "Warning 
C219" helfen?

Was mir auch sofort ins Auge gestochen ist: Wenn die #defines 
..._START_ADDRESS und ..._END_ADDRESS das sind, was ihr Name vorgibt, 
dann ist die Berechnung für ..._MEMORY_SIZE falsch. Es fehlt "+1".

Grüße
Markus
Moderator Persönliche Seite #637049
Lesenswert?
• ▲
▼
Array indices sind in C per definitionem vom Typ signed int.  Falls int
bei dir ein 16-bit-Typ ist, wirst du die long-Konstanten wohl trotzdem
brauchen (bzw. sie werden implizit vom Typ long int), wenn der gesamte
Speicher mehr als 16 bits an Adressen hat.  Aber: DESCRIPTOR_MEMORY_SIZE
ist natürlich weniger als 16 bits, lässt sich also problemlos als int
darstellen:
1
#define DESCRIPTOR_MEMORY_SIZE        ((int)(DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS))
OP #637152
Lesenswert?
• ▲
▼
Danke für die Antworten.
Nicht DESCRIPTOR_MEMORY_SIZE ist das Problem, sondern das "_at_ 
DESCRIPTOR_START_ADDRESS".

So funktionierts, allerdings bleibt noch zu testen, ob auch das richtige 
dabei herauskommt.
1
#define DESCRIPTOR_START_ADDRESS      0x24050L
2
#define DESCRIPTOR_END_ADDRESS        0x27FF0L
3
#define DESCRIPTOR_MEMORY_SIZE        ((int)DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS)
4

5
static byte      DescBlockMemory[DESCRIPTOR_MEMORY_SIZE] _at_ (int)DESCRIPTOR_START_ADDRESS;

Der cast beim "#define DESCRIPTOR_MEMORY_SIZE" wäre nicht nötig, es geht 
auch nur mit dem cast beim "_at_".
OP #637268
Lesenswert?
• ▲
▼
Ich habe das fragliche File jetzt mal mit
"C51 source\descmgt.c large PP SRC" kompiliert.

Im .src File steht nun folgendes:
  XSEG  AT  04050H
DescBlockMemory:   DS   16288

Es scheint tatsächlich so, dass die DESCRIPTOR_START_ADDRESS auf 32Bit 
beschnitten wird.
Ich schaue jetzt noch was passiert, wenn ich die casts wieder rausnehme

...

Resultat: Mit der Warnung wir auch hier der long auf 32Bit beschränkt.

Fazit: Muss das mal anschauen, obs schon immer so war (Programmierfehler 
von Anfang an) oder ob der neue KEIL hier ein Problem baut.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.