home *** CD-ROM | disk | FTP | other *** search
- amk@zikzak.in-berlin.de (Andreas M. Kirchwitz) writes:
- :[line eater was here]
- :
- : void meine_kleine_prozedur(void) {
- : {
- : ULONG tags[] = {RT_WaitPointer,TRUE,TAG_END};
- : if (rtGetStringA(str,len,title,NULL,(struct TagItem *)tags))
- :
- : [...]
- : }
- :
- :
- : Der Compiler (SAS/C) findet das toll. Der Linker meint dazu jedoch:
-
- Das entsetzt mich. Nicht Dein Quellcode, sondern dass der Compiler
- nicht meckert... Damit Du weinger Probleme mit meinem Erklaeungs-
- versuch hast, erst mal ein paar Begriffsbestimmungen (ja, wie in
- der Vorlesung :-)
-
- * Speicherklasse: C laesst als "Modifizierer" fuer Datentypen Angaben
- ueber die Verwaltung von Variablen zu. Als da waeren:
-
- - extern : Speicherplatz fuer die Variable/Funktion wird nicht hier,
- sondern in einem anderen Modul zur Verfuegung gestellt.
-
- - auto : Zulaessig nur fuer Variablendeklarationen innerhalb von
- Funktionen (ist da auch Voreinstellung). Speicherplatz wird zur
- Laufzeit des Programms auf dem Prozessor-Stack reserviert.
- Dies geschieht "automatisch" beim Betreten des fraglichen Blocks.
-
- Die Lebensdauer von Variablen dieser Speicherklasse reicht nur bis
- zum Verlassen des Blocks, danach sind sie "weg".
-
- - static : Hier gibt's zwei Bedeutungen, je nachdem wo die Deklaration
- steht (seufz)
-
- = ausserhalb einer Funktion : Das deklarierte Objekt ist nur inner-
- halb des aktuellen Moduls bekannt. Das erlaubt die mehrfache Ver-
- wendung von Namen in verschiedenen Modulen.
-
- = innerhalb einer Funktion : Das deklarierte Objekt wird nicht zur
- Laufzeit, sondern bereits zur Compilationszeit "statisch" erzeugt.
- Das erlaubt dem Compiler, diese Variablen vorzubesetzen, und ver-
- laengert die Lebensdauer der Variable ueber das Verlassen der
- Funktion hinaus. Das Objekt ist aber nur innerhalb des Blocks
- bekannt, indem es deklariert wurde.
-
- - register : Das Compiler versucht das Objekt wird in Registern des
- Prozessors unterzubringen, sofern moeglich. Beachte, dass Register
- keine Addresse haben. Programmstuecke wie:
-
- :
- register int x;
- :
- scanf("%d", &x);
- :
-
- zeigen ein voellig undefiniertes Verhalten.
-
- Zurueck zu Deinem Problem - Wenn ich's recht in Erinnerung habe, geht
- es so:
-
- Initialisierung in der Deklaration von Variablen am Beginn eines
- Blocks ist moeglich fuer:
-
- - "einfache" Variablen (also int, char, float, double...)
-
- - Variablen "komplexer" Datentypen (arrays, structs, ...) NUR in
- der Speicherklasse "static".
-
- "static" muss explizit angegeben werden, default ist "auto". Schreibe also
-
- :
- static ULONG tags[]....
- :
-
- und Dein Code sollte korrekt uebersetzt und gelinkt werden. Die
- Initialisierung erfolgt zur Compilationszeit und wird bei erneutem
- Aufruf von "meine_kleine_prozedur()" nicht nochmal durchgefuehrt!
-
- Statt dessen hast du in tags[] immer noch die Werte stehen, die beim
- letzten Verlassen der Prozedur drin waren.
-
- : Warning! Absolute reference to UNKNOWN
- : module: rtsup.c file: rtsup.o
- :
-
- Klar. Der Linker suchte ein Objekt zum initialisieren, dessen Speicher-
- platz noch gar nicht bekannt sein kann. Aber warum erst der Linker das
- bemerkt? Warten wir auf SAS/C 6.0 :-(
-
- So, das war lang. Ich hoffe, ich konnte etwas Licht ins Dunkel
- bringen...
-
- Kalahari,
- Michael Boehnisch,
- billy@uni-paderborn.de
-
- --
-
- _________________________________________________________
- *** Michael Boehnisch ***
- *** billy@uni-paderborn.de I disclaim everything. ***
-
-