www.mikrocontroller.net

Forum: Compiler & IDEs Compiler Warnung - warum?


Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define DESCRIPTOR_START_ADDRESS      0x24050L
#define DESCRIPTOR_END_ADDRESS        0x27FF0L
#define DESCRIPTOR_MEMORY_SIZE        DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS

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!

Autor: Markus V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Definiere deine Konstanten so, dann ist die Warnung weg:

#define DESCRIPTOR_START_ADDRESS      0x24050
#define DESCRIPTOR_END_ADDRESS        0x27FF0

Autor: Martin Kohler (mkohler)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define DESCRIPTOR_MEMORY_SIZE        ((int)(DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS))

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define DESCRIPTOR_START_ADDRESS      0x24050L
#define DESCRIPTOR_END_ADDRESS        0x27FF0L
#define DESCRIPTOR_MEMORY_SIZE        ((int)DESCRIPTOR_END_ADDRESS - DESCRIPTOR_START_ADDRESS)

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.