Forum: Compiler & IDEs Compiler Warnung - warum?


von Martin K. (mkohler)


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!

von Markus V. (Gast)


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

von Robert (Gast)


Lesenswert?

Hi,

kenne den Compiler nicht, aber Google führt mich zu

http://www.keil.com/support/docs/886.htm

Scheint also in einen int passen zu müssen.

Robert

von Uhu U. (uhu)


Lesenswert?

Definiere deine Konstanten so, dann ist die Warnung weg:

#define DESCRIPTOR_START_ADDRESS      0x24050
#define DESCRIPTOR_END_ADDRESS        0x27FF0

von Martin K. (mkohler)


Lesenswert?

Danke für die Hinweise.
Ich werde morgen mal die #defines anders definieren und schauen was 
dabei herauskommt.
Gruss, Martin

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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))

von Martin K. (mkohler)


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_".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Martin Kohler wrote:

> Der cast beim "#define DESCRIPTOR_MEMORY_SIZE" wäre nicht nötig, es geht
> auch nur mit dem cast beim "_at_".

Dann ist die Adresse aber Kokolorus, da nunmehr (entweder explizit
oder eingangs implizit) ein 0x7ff0 draus gemacht wird -- mal in der
Annahme, dass `int' ein 16-bit-Typ ist bei dir.

von Martin K. (mkohler)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.