Konstante für mehrere Dateien deklarieren & sofort benutzen

OP #1436787
Hallöchen!
Ich will eine Art Konstante definieren, die ich dann auch sofort zur 
Deklaration eines public-Array benötige. Dafür habe ich bisher #define 
benutzt. Da ich die Konstante aber in mehreren Dateien, die ich mit 
Header-Dateien verknüpfe, brauche, stellt sich mir die Frage, wie dies 
am einfachsten zu realisieren ist.
Muss ich in jeder Datei
1
#define konstante
einfügen, oder geht das auch noch anders? Ich habe auch schon über das 
Schlüsselwort const nachgedacht, aber da mein Code in zwei Dateien im 
Prinzip so aussieht wie folgt, habe ich das noch nicht hingekriegt...
1
const char konstante = 5;
2
char array[konstante];

Wie muss das aussehen, damit es auch im Zusammenspiel mit mehreren 
Dateien funktioniert (zB. mit extern ?)?

Viele Grüße,
Stefan
Stefan S. schrieb:

> Muss ich in jeder Datei
>
1
#define konstante
> einfügen, oder geht das auch noch anders?

Du nimmst das #define in eine eigene Datei, die du überall inkludierst.

>
1
> const char konstante = 5;
2
> char array[konstante];
3
>

Nein, das geht nicht.
In C sind das keine echten Konstanten
OP
Das heißt, es gibt keine andere Möglichkeit, als das ganze mit #define 
zu realisieren?
Und warum ist const keine echte Konstante?

@Helmi:
Das habe ich versucht, aber der Compiler meldet dann immer den Fehler
error C221: non-constant case/dim expression

Ich könnte mir vorstellen, dass dies daran liegt, dass die Konstante und 
das Array als Public deklariert werden... stimmt das?
Karl heinz Buchegger schrieb:
> Stefan S. schrieb:
>
>> Muss ich in jeder Datei
>>
1
#define konstante
>> einfügen, oder geht das auch noch anders?
>
> Du nimmst das #define in eine eigene Datei, die du überall inkludierst.
>
>>
1
>> const char konstante = 5;
2
>> char array[konstante];
3
>>
>
> Nein, das geht nicht.
> In C sind das keine echten Konstanten

kommt drauf an...

Nach Standard C89 geht es nicht, nach C99 meines Wissens doch und
der gcc kann es auf jeden Fall.
Stefan S. schrieb:
> Das heißt, es gibt keine andere Möglichkeit, als das ganze mit #define
> zu realisieren?
> Und warum ist const keine echte Konstante?

const heisst nicht, daß es eine Konstante wäre, sondern nur
daß du den Wert nicht mehr ändern willst.
Älteren C-Compilern reicht das nicht; für eine Feldlänge
ist es nicht const genug...

Z.B. sagt const volatile... explizit, daß der Programmierer
die Variable (keine Konstante!) nicht ändern will, daß aber
jemand anders zur Laufzeit evtl. den Wert manipuliert.

> ...
Eine richtige Konstante ist das nicht wie die anderen schon sagten.

>Das habe ich versucht, aber der Compiler meldet dann immer den Fehler
>error C221: non-constant case/dim expression

Welcher Compiler ist das denn ?

Kann das sien das du diese Konstante in einem switch / case konstrukt 
verwenden willst ?
Das geht so nicht.

Diese const brauch ich meistens um feste Texte u. Tabelle abzuspeichern.
OP
Also ich will eigentlich nur ein public Array der Größe x deklarieren. 
Da ich dieses Array im gesamten Programm benötige und das Programm in 
einzelne Module aufgeteilt ist, habe ich Probleme, den einzelnen Modulen 
klar zu machen, dass ein Array[x] existiert... um Änderungen einfach zu 
machen, wollte ich halt nicht
1
char array[16];

sondern
1
const char x = 16;
2
char array[x];

schreiben...
Hat jemand eine Idee, wie man das realisieren kann (ohne in jedes Modul 
ein "#define" zu beutzen oder immer ein extra-Modul einzubinden)?

Viele Grüße,
Stefan

PS: Ich nutze den Compiler von Keil (µVision3)
Wenn du deinem Compiler beibringen kannst (z.B. weil es der gcc ist?),
den Standard C99 zu verwenden (beim gcc mit der Option --stdd=c99),
dann sollte es so gehen wir du es ursprünglich vorhattest.

Wenn nicht, musst du es mit #define machen.
Evtl. ist es für dich angenehmer, das #define nicht direkt in den
Quelltext zu schreiben, sondern als Compileroption zu übergeben.
Beim gcc (und vermutlich bei anderen auch, von VC++ weiß ich es)
geht das mit der Option -D, also z.B. beim Compilieren mit angeben:
... -DANZAHL=150 ...
Das wirkt dann wie ein #define ANZAHL 150 am Anfang des Quelltextes.
achso, noch eine Möglichkeit ist natürlich, als globale Variable
nicht das Feld zu vereinbaren, sondern nur einen Zeiger darauf.
Außerdem eine weitere globale Variable für die Anzahl der
Elemente. Dann denkt man sich im Programm irgendwie zu
Programmstart die Anzahl aus und allokiert mit malloc() dann
das Feld.
Ich behaupte nicht, daß das eleganter wäre, aber zumindest eine
Möglichkeit.
Wo liegt eigentlich das Problem mit #define ?


module.h
********
1
#ifndef MODULE_H_INCLUDED
2
#define MODULE_H_INCLUDED
3

4
#define NR_ENTRIES  16
5
extern int Values[ NR_ENTRIES ];
6

7
void init( void );
8

9
#endif

module.c
********
1
#include "module.h"
2

3
int Values[NR_ENTRIES];
4

5
void init( void )
6
{
7
  unsigned char i;
8

9
  for( i = 0; i < NR_ENTRIES; ++i )
10
    Values[i] = 0;
11
}

main.c
******
1
#include "module.h"
2

3
int main()
4
{
5
  unsigned char i;
6

7
  init();
8

9
  for( i = 0; i < NR_ENTRIES; ++i )
10
    printf( "%d\n", Values[i] );
11
}


Wenn du irgendwo sonst nach NR_ENTRIES benötigst, dann inkludierst du 
dort einfach ebenfalls module.h und hast die 'Konstante' auch dort 
verfügbar.
OP
Hmm... also ich habe mal gegoogelt, aber noch nichts brauchbares dafür 
gefunden, ob man unter µVision3 auch mit c99-Standard kompilieren 
kann... weiß das jemand?

Grüße

EDIT: Okay, danke an Karl, ich probiers mal so ;-) (falls jemand zu 
obigem doch noch eine Idee hat, gerne schreiben!)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.