PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] in foo.c definierte Variablen in *.c nutzen



Freekazonid
24-08-2004, 16:12
moin

ich habe eine datei, def.c, wo einige definitionen drinnen sind, zb arrays & structs. diese sollen in einigen anderen dateien verfuegbar seien, und die gespeicherten werte sollen fuer alle funktionen gleich sein
(sagen wir in def.c ist int zahl=0 defeniert, und funktion peter in der datei kuchen. sagt zahl = 1. nun macht funktion gabi in der datei torte.c printf("%d\n", zahl); sollte 1, nicht 0 kommen)
geht das ueberhaupt so? denke ja, soll ja mit extern ermoeglichtwerden?!

wenn ja, wie wende ich das korrekt an? habe zb ne struktur in def.c




/*
Structure for the default arguments
*/
struct __default {
char def_gip[MAX_ARG_LEN];
char def_log[MAX_ARG_LEN];
char def_exe[MAX_ARG_LEN];
char def_get[MAX_ARG_LEN];
char def_ssh[MAX_ARG_LEN];

char def_SER[MAX_ARG_LEN];
} _default;



in einer anderen bla.c steht in einer funktion


if ( (r = strcmp( CMD[0], tmp ) ) == 0 )
strcpy(_default.def_gip, arg);


nun meckert der dadrueber

*/home/freeka/stuff/progging/my0wn/rim/rimc/src/read_config.c:86: warning: passing arg 1 of `strcmp' from incompatible pointer type
*/home/freeka/stuff/progging/my0wn/rim/rimc/src/read_config.c:87: error: request for member `def_gip' in something not a structure or union



habe zuvor in der datei



extern *CMD[];
extern _default;



nun, wie geht das nun korrekt?

danke

wraith
24-08-2004, 17:59
habe zuvor in der datei


extern *CMD[];
extern _default;


Das Problem hier ist, daß du keinen Typ angegeben hast, und der Compiler dann standardmäßig int annimmt.
Damit werden auch die beiden Compilermeldungen verständlich, denn weder ist ein int* (von extern int *CMD[]; ) ein korrektes Argument für strcpy.
Noch ist ein int (von extern int _default; ) eine Struktur.

Du mußt also jeweils den Typ angeben,dh. zb. für _default


extern struct __default _default;


Dazu muß natürlich struct __default bekannt sein.
Dazu teilst du dein Progamm so auf
sdefault.h


#ifndef SDEFAULT
#define SDEFAULT
struct __default {
...
};

extern struct __default _default;
#endif

sdefault.c


#include "sdefault.h"
struct __default _default;

Überall, wo du jetzt _default benutzen willst, bindest du den Header sdefault.h ein.

Achja, fange keine Variablen/Typen mit Unterstrichen an, es sieht nicht nur dumm aus, es ist auch nicht erlaubt.

Freekazonid
24-08-2004, 18:12
danke fuer die antwort :) funktioniert bestens, auch wenn die aufteilung meinerseits so nicht gedacht war, aber das ist nicht weiter schlimm



Achja, fange keine Variablen/Typen mit Unterstrichen an, es sieht nicht nur dumm aus, es ist auch nicht erlaubt.


warum?
bei allen variablen/funktionen/whatever, die keywords seien koennten bzw welche sinds, setze ich __ oder einfach _ davor, um halt zu zeigen das die variable/funktione/whatever eigen ist

und wieso soll das nicht erlaubt seien, hab in anderen sourcen auch schoen oefter variablen/funktionen/whatever gesehen die mit _ oder __ anfingen

wraith
24-08-2004, 18:20
warum?
bei allen variablen/funktionen/whatever, die keywords seien koennten bzw welche sinds, setze ich __ oder einfach _ davor, um halt zu zeigen das die variable/funktione/whatever eigen ist

und wieso soll das nicht erlaubt seien, hab in anderen sourcen auch schoen oefter variablen/funktionen/whatever gesehen die mit _ oder __ anfingen
Im Standard steht


7.1.3 Reserved identifiers
1 Each header declares or defines all identifiers listed in its associated
optionally declares or defines identifiers listed in its associated
subclause and identifiers which are always reserved either for
scope identifiers.
— All identifiers that begin with an underscore and either an uppercase
underscore are always reserved for any use.
— All identifiers that begin with an underscore are always reserved
with file scope in both the ordinary and tag name spaces.

Die vereinfachte Merkregel davon ist, "Fange nie einen Typ/Variable mit einem Unterstrich an".

Freekazonid
24-08-2004, 18:23
mh najja ok, koennen sie wenigstens mit nem unterstrich enden? habe mal bei einem source gesehen, da wurde bei jeder eingenen funktion XXX als prefix genommen, was ich sehr haesslich fand

wraith
24-08-2004, 18:32
mh najja ok, koennen sie wenigstens mit nem unterstrich enden?
Ja, das können sie ;).

Unter C++ Programmierern ist es auch ganz besonders 'in' seine Klassenmember mit einem Unterstrich enden zulassen.
IMO ist das auch total häßlich.


habe mal bei einem source gesehen, da wurde bei jeder eingenen funktion XXX als prefix genommen, was ich sehr haesslich fand

Sieht stark nach Zerbst aus ;).

Wie wäre es mit _t, als Suffix (für Typen).
Andere beginnen structs mit s_.

Freekazonid
24-08-2004, 18:36
Ja, das können sie ;).

Unter C++ Programmierern ist es auch ganz besonders 'in' seine Klassenmember mit einem Unterstrich enden zulassen.
IMO ist das auch total häßlich.


c++'ler machen das? na dann mach ich das nicht ;)



Sieht stark nach Zerbst aus ;).

Wie wäre es mit _t, als Suffix (für Typen).
Andere beginnen structs mit s_.



:eek: ya es war tatsaechlich der zerbst, zu zeiten wo ich noch windows genutzt hatte und dachte spiele programmieren sei nicht schwer ;)

naja wenn dann ein einheitlich prefix oder suffix, aber mischen ist auch net soo nett. ich werd mir was einfallen lassen was ich nehm ;)