home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / text / TagItems / text0000.txt < prev    next >
Encoding:
Text File  |  2014-05-19  |  3.5 KB  |  105 lines

  1. amk@zikzak.in-berlin.de (Andreas M. Kirchwitz) writes:
  2. :[line eater was here]
  3. :
  4. :     void meine_kleine_prozedur(void) {
  5. :     {
  6. :       ULONG tags[] = {RT_WaitPointer,TRUE,TAG_END};
  7. :       if (rtGetStringA(str,len,title,NULL,(struct TagItem *)tags))
  8. :       [...]
  9. :     }
  10. : Der Compiler (SAS/C) findet das toll.  Der Linker meint dazu jedoch:
  11.  
  12. Das entsetzt mich. Nicht Dein Quellcode, sondern dass der Compiler
  13. nicht meckert... Damit Du weinger Probleme mit meinem Erklaeungs-
  14. versuch hast, erst mal ein paar Begriffsbestimmungen (ja, wie in
  15. der Vorlesung :-)
  16.  
  17. * Speicherklasse: C laesst als "Modifizierer" fuer Datentypen Angaben
  18.   ueber die Verwaltung von Variablen zu. Als da waeren:
  19.  
  20.   - extern : Speicherplatz fuer die Variable/Funktion wird nicht hier,
  21.     sondern in einem anderen Modul zur Verfuegung gestellt.
  22.  
  23.   - auto : Zulaessig nur fuer Variablendeklarationen innerhalb von
  24.     Funktionen (ist da auch Voreinstellung). Speicherplatz wird zur
  25.     Laufzeit des Programms auf dem Prozessor-Stack reserviert.
  26.     Dies geschieht "automatisch" beim Betreten des fraglichen Blocks.
  27.  
  28.     Die Lebensdauer von Variablen dieser Speicherklasse reicht nur bis
  29.     zum Verlassen des Blocks, danach sind sie "weg".
  30.  
  31.   - static : Hier gibt's zwei Bedeutungen, je nachdem wo die Deklaration
  32.     steht (seufz)
  33.  
  34.     = ausserhalb einer Funktion : Das deklarierte Objekt ist nur inner-
  35.       halb des aktuellen Moduls bekannt. Das erlaubt die mehrfache Ver-
  36.       wendung von Namen in verschiedenen Modulen.
  37.  
  38.     = innerhalb einer Funktion : Das deklarierte Objekt wird nicht zur
  39.       Laufzeit, sondern bereits zur Compilationszeit "statisch" erzeugt.  
  40.       Das erlaubt dem Compiler, diese Variablen vorzubesetzen, und ver- 
  41.       laengert die Lebensdauer der Variable ueber das Verlassen der
  42.       Funktion hinaus. Das Objekt ist aber nur innerhalb des Blocks
  43.       bekannt, indem es deklariert wurde.
  44.  
  45.   - register : Das Compiler versucht das Objekt wird in Registern des
  46.     Prozessors unterzubringen, sofern moeglich. Beachte, dass Register
  47.     keine Addresse haben. Programmstuecke wie:
  48.  
  49.     :
  50.     register int x;
  51.     :
  52.     scanf("%d", &x);
  53.     :
  54.  
  55.     zeigen ein voellig undefiniertes Verhalten.
  56.  
  57. Zurueck zu Deinem Problem - Wenn ich's recht in Erinnerung habe, geht
  58. es so:
  59.  
  60. Initialisierung in der Deklaration von Variablen am Beginn eines
  61. Blocks ist moeglich fuer:
  62.  
  63.    - "einfache" Variablen (also int, char, float, double...)
  64.  
  65.    - Variablen "komplexer" Datentypen (arrays, structs, ...)  NUR in
  66.      der Speicherklasse "static".
  67.  
  68. "static" muss explizit angegeben werden, default ist "auto". Schreibe also
  69.  
  70.         :
  71.         static ULONG tags[]....
  72.         :
  73.  
  74. und Dein Code sollte korrekt uebersetzt und gelinkt werden. Die
  75. Initialisierung erfolgt zur Compilationszeit und wird bei erneutem
  76. Aufruf von "meine_kleine_prozedur()" nicht nochmal durchgefuehrt!
  77.  
  78. Statt dessen hast du in tags[] immer noch die Werte stehen, die beim
  79. letzten Verlassen der Prozedur drin waren.
  80.  
  81. :     Warning! Absolute reference to UNKNOWN
  82. :      module: rtsup.c        file: rtsup.o
  83. :
  84.  
  85. Klar. Der Linker suchte ein Objekt zum initialisieren, dessen Speicher-
  86. platz noch gar nicht bekannt sein kann. Aber warum erst der Linker das
  87. bemerkt? Warten wir auf SAS/C 6.0 :-(
  88.  
  89. So, das war lang. Ich hoffe, ich konnte etwas Licht ins Dunkel
  90. bringen...
  91.  
  92. Kalahari,
  93.    Michael Boehnisch,
  94.    billy@uni-paderborn.de
  95.  
  96. -- 
  97.  
  98. _________________________________________________________
  99. *** Michael Boehnisch                                 ***
  100. *** billy@uni-paderborn.de    I disclaim everything.  ***
  101.  
  102.