home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / text / TagItems < prev    next >
Internet Message Format  |  2014-05-19  |  23KB

  1. From de.comp.sys.amiga.misc Tue Jun 23 17:07:08 1992
  2. Newsgroups: de.comp.sys.amiga.misc
  3. Path: cs.tu-berlin.de!math.fu-berlin.de!pbinfo2!billy
  4. From: billy@uni-paderborn.de (Michael Boehnisch)
  5. Subject: Re: TagItems und C-Compiler
  6. Message-ID: <1992Jun23.092632.8759@uni-paderborn.de>
  7. Organization: Uni-GH Paderborn
  8. References: <5pcer*Fo1@zikzak.in-berlin.de>
  9. Date: Tue, 23 Jun 1992 09:26:32 GMT
  10.  
  11. amk@zikzak.in-berlin.de (Andreas M. Kirchwitz) writes:
  12. :[line eater was here]
  13. :
  14. :     void meine_kleine_prozedur(void) {
  15. :     {
  16. :       ULONG tags[] = {RT_WaitPointer,TRUE,TAG_END};
  17. :       if (rtGetStringA(str,len,title,NULL,(struct TagItem *)tags))
  18. :       [...]
  19. :     }
  20. : Der Compiler (SAS/C) findet das toll.  Der Linker meint dazu jedoch:
  21.  
  22. Das entsetzt mich. Nicht Dein Quellcode, sondern dass der Compiler
  23. nicht meckert... Damit Du weinger Probleme mit meinem Erklaeungs-
  24. versuch hast, erst mal ein paar Begriffsbestimmungen (ja, wie in
  25. der Vorlesung :-)
  26.  
  27. * Speicherklasse: C laesst als "Modifizierer" fuer Datentypen Angaben
  28.   ueber die Verwaltung von Variablen zu. Als da waeren:
  29.  
  30.   - extern : Speicherplatz fuer die Variable/Funktion wird nicht hier,
  31.     sondern in einem anderen Modul zur Verfuegung gestellt.
  32.  
  33.   - auto : Zulaessig nur fuer Variablendeklarationen innerhalb von
  34.     Funktionen (ist da auch Voreinstellung). Speicherplatz wird zur
  35.     Laufzeit des Programms auf dem Prozessor-Stack reserviert.
  36.     Dies geschieht "automatisch" beim Betreten des fraglichen Blocks.
  37.  
  38.     Die Lebensdauer von Variablen dieser Speicherklasse reicht nur bis
  39.     zum Verlassen des Blocks, danach sind sie "weg".
  40.  
  41.   - static : Hier gibt's zwei Bedeutungen, je nachdem wo die Deklaration
  42.     steht (seufz)
  43.  
  44.     = ausserhalb einer Funktion : Das deklarierte Objekt ist nur inner-
  45.       halb des aktuellen Moduls bekannt. Das erlaubt die mehrfache Ver-
  46.       wendung von Namen in verschiedenen Modulen.
  47.  
  48.     = innerhalb einer Funktion : Das deklarierte Objekt wird nicht zur
  49.       Laufzeit, sondern bereits zur Compilationszeit "statisch" erzeugt.  
  50.       Das erlaubt dem Compiler, diese Variablen vorzubesetzen, und ver- 
  51.       laengert die Lebensdauer der Variable ueber das Verlassen der
  52.       Funktion hinaus. Das Objekt ist aber nur innerhalb des Blocks
  53.       bekannt, indem es deklariert wurde.
  54.  
  55.   - register : Das Compiler versucht das Objekt wird in Registern des
  56.     Prozessors unterzubringen, sofern moeglich. Beachte, dass Register
  57.     keine Addresse haben. Programmstuecke wie:
  58.  
  59.     :
  60.     register int x;
  61.     :
  62.     scanf("%d", &x);
  63.     :
  64.  
  65.     zeigen ein voellig undefiniertes Verhalten.
  66.  
  67. Zurueck zu Deinem Problem - Wenn ich's recht in Erinnerung habe, geht
  68. es so:
  69.  
  70. Initialisierung in der Deklaration von Variablen am Beginn eines
  71. Blocks ist moeglich fuer:
  72.  
  73.    - "einfache" Variablen (also int, char, float, double...)
  74.  
  75.    - Variablen "komplexer" Datentypen (arrays, structs, ...)  NUR in
  76.      der Speicherklasse "static".
  77.  
  78. "static" muss explizit angegeben werden, default ist "auto". Schreibe also
  79.  
  80.         :
  81.         static ULONG tags[]....
  82.         :
  83.  
  84. und Dein Code sollte korrekt uebersetzt und gelinkt werden. Die
  85. Initialisierung erfolgt zur Compilationszeit und wird bei erneutem
  86. Aufruf von "meine_kleine_prozedur()" nicht nochmal durchgefuehrt!
  87.  
  88. Statt dessen hast du in tags[] immer noch die Werte stehen, die beim
  89. letzten Verlassen der Prozedur drin waren.
  90.  
  91. :     Warning! Absolute reference to UNKNOWN
  92. :      module: rtsup.c        file: rtsup.o
  93. :
  94.  
  95. Klar. Der Linker suchte ein Objekt zum initialisieren, dessen Speicher-
  96. platz noch gar nicht bekannt sein kann. Aber warum erst der Linker das
  97. bemerkt? Warten wir auf SAS/C 6.0 :-(
  98.  
  99. So, das war lang. Ich hoffe, ich konnte etwas Licht ins Dunkel
  100. bringen...
  101.  
  102. Kalahari,
  103.    Michael Boehnisch,
  104.    billy@uni-paderborn.de
  105.  
  106. -- 
  107.  
  108. _________________________________________________________
  109. *** Michael Boehnisch                                 ***
  110. *** billy@uni-paderborn.de    I disclaim everything.  ***
  111.  
  112. From de.comp.sys.amiga.misc Wed Jul  1 14:19:28 1992
  113. Path: cs.tu-berlin.de!zrz.tu-berlin.de!news.netmbx.de!Germany.EU.net!mcsun!uunet!think.com!sdd.hp.com!nigel.msen.com!spool.mu.edu!sol.ctr.columbia.edu!ira.uka.de!chx400!bernina!wild
  114. From: wild@nessie.cs.id.ethz.ch (Markus Wild)
  115. Newsgroups: de.comp.sys.amiga.misc
  116. Subject: Re: TagItems und C-Compiler
  117. Message-ID: <1992Jun30.234220.16956@bernina.ethz.ch>
  118. Date: 30 Jun 92 23:42:20 GMT
  119. Article-I.D.: bernina.1992Jun30.234220.16956
  120. References: <2Umfr*3s1@zikzak.in-berlin.de> <olsen.9955@sourcery.mxm.sub.org> <JcBgr*rx1@zikzak.in-berlin.de>
  121. Sender: news@bernina.ethz.ch (USENET News System)
  122. Organization: Swiss Federal Institute of Technology (ETH), Zurich, CH
  123. Lines: 51
  124.  
  125. In article <JcBgr*rx1@zikzak.in-berlin.de> amk@zikzak.in-berlin.de (Andreas M. Kirchwitz) writes:
  126. >#include <stdio.h>
  127. >#include <stdlib.h>
  128. >
  129. >int main(int argc, char *argv[])
  130. >{
  131. >  char text[] = "Hello World\n";
  132. >  printf("%s",text);
  133. >  exit(10);
  134. >}
  135. >
  136. >Optionen: <keine>
  137. >Compiler: lc test.c
  138. >Linker  : blink FROM LIB:cres.o test.o TO test LIB LIB:lc.lib SD SC ND
  139. >
  140. >    "Warning! Absolute reference to UNKNOWN" ...  Andreas
  141.  
  142. Hat vermutlich damit zu tun, dass SAS String-Konstanten grundlos in den
  143. DATA Hunk wirft, und damit zu veraenderlichen Objekten erklaert. Wenn
  144. die String-Konstante "Hello World\n" (und nicht etwa text!) im CODE Hunk
  145. waere, haette BLink gar nix zu motzen, denn dann haette er keine data-text
  146. Relokation auszufuehren, die ja in einem resident-faehigen Programm nicht
  147. auftreten sollte.
  148.  
  149. >PPS: Kann man beim BLink eigentlich bestimmte Warnings (ausser mit "grep")
  150. >     unterdruecken?
  151.  
  152. Groel.. BLink als Manifestation der AmigaDOS treuen Gemeinde, die sich
  153. gern duselig quatscht auf der Kommandozeile (und daher Optionen ala -s -o
  154. und dergleichen verdammt), wird mit einem Unix Programm (grep) zu
  155. Leibe gerueckt, finde ich einfach koestlich ;-)
  156.  
  157. >PPPS: Interessante Effekte erhaelt man, wenn man 'printf("%s",text);'
  158. >      durch 'printf(text);' ersetzt.  Eindrucksvoller Memory-Dump...
  159. >      Anscheinend ist die Warning eine warnende Warning, der man doch
  160. >      besser Beachtung schenken sollte.
  161.  
  162. Absolut unklar, weshalb das zu Problemen fuehren soll?! Die interne
  163. Referent auf die String-Konstante ist doch in beiden Faellen 100%
  164. gleich?  Im beiden Faellen sollte die Konstante als Source in einem
  165. bcopy()/memmove() (oder inline kopiert) auf die Stack-Variable dienen,
  166. der einzige Unterschied ist, dass im ersten Fall nach dem Push der
  167. Stackadresse noch ein Push der Adresses des Format-Strings vorgeht, ent-
  168. scheidet dies bei SAS ueber Crash oder nicht-Crash??
  169.  
  170. -Markus
  171.  
  172. -- 
  173. Markus M. Wild    -  wild@nessie.cs.id.ethz.ch  |  wild@amiga.physik.unizh.ch 
  174. Vital papers will demonstrate their vitality by spontaneously moving
  175. from where you left them to where you can't find them.
  176.  
  177. From de.comp.sys.amiga.misc Thu Jul  2 00:52:32 1992
  178. Path: cs.tu-berlin.de!news.netmbx.de!Germany.EU.net!unido!sbsvax!coli-gate.coli.uni-sb.de!uhf!kbsaar!kbsaar!fjrei
  179. From: fjrei@kbsaar.saar.sub.org (Franz-Josef Reichert)
  180. Newsgroups: de.comp.sys.amiga.misc
  181. Subject: Re: TagItems und C-Compiler
  182. Message-ID: <TGlhr*2j3@kbsaar.saar.sub.org>
  183. Date: 1 Jul 92 11:40:39 GMT
  184. References: <2Umfr*3s1@zikzak.in-berlin.de> <olsen.9955@sourcery.mxm.sub.org>
  185.  <KlTgr*Ch3@kbsaar.saar.sub.org> <1992Jun30.235526.17184@bernina.ethz.ch>
  186. Reply-To: fjrei@kbsaar.saar.de (Franz-Josef Reichert)
  187. Organization: Private Amiga Site
  188. Lines: 127
  189. X-Newsreader: Arn V1.00 beta rel2
  190.  
  191. In article <1992Jun30.235526.17184@bernina.ethz.ch>, Markus Wild writes:
  192.  
  193. > Jein... der Effekt ist gleich, nur muss ich im einen Fall ne giganteske
  194. > Library (sprich amiga.lib) dazu linken, die ausserdem noch von Commodore
  195. > mit zweifelhaften `Perlen' ala voellig inkompatibler stdio-Funktionalitaet
  196. > bereicht wuerde, und im andern Fall halt nicht!
  197.  
  198.     Dieses Problem (sofern es eins ist) kann einfach umschifft
  199. werden, indem man sich den Varargs-Stub _selbst_ schreibt. Niemand muss
  200. mit amiga.lib linken, wenn er nicht will.
  201.     
  202. > >ARRAY's anlegen will, der soll's doch bitte _statisch_ tun! Das tut
  203. >
  204. > Noe.. laengst nicht alle Tag-Arrays sind statisch, und wenn Du beginnst,
  205. > statische Arrays dann nachtraeglich doch noch zur Laufzeit zu aendern (und
  206. > das ueblicherweise natuerlich nicht durch Semaphoren schuetzt), dann ist
  207. > die Reentrancy zum Teufel.
  208.  
  209.     Das sollte man natuerlich nicht! Deswegen ja auch der
  210. folgende Absatz! Bitte nicht mehr sinnentstellend quoten! Ich sagte
  211. keineswegs, dass statische Tag-Arrays _immer_ Sinn machen. Es kommt
  212. auf das Wort "solange" (s.u.) an. Fuer solche Faelle hatte ich ausserdem
  213. vorgeschlagen, Varargs und statische Tags zu mischen, falls moeglich.
  214.  
  215. > >einer moeglicherweise gewuenschten Reentrancy solange keinen Abbruch,
  216. > >wie sie 'const' definiert und benutzt werden, was zusaetzlich noch
  217. > >den netten Nebeneffekt hat, dem Compiler eine Optimierungschance
  218. > >mehr einzuraeumen. Und Bezeichnerkonflikten geht man aus dem Weg,
  219. >
  220. > Schon klar, dass const Objekte huebsche Hinweise fuer den Compiler beinhalten,
  221. > nur gibtst Du diesem dadurch, dass Du die Objekte in statischen Speicher
  222. > forcierst (!) keine Chance, sie gaenzlich inline zu expandieren, was ich
  223. > schade finde.
  224.  
  225.     Was ist "schade"? Beschreibe doch mal bitte, was diese
  226. "Inline expansion", was immer damit gemeint sei, in diesem Zusammenhang
  227. an Vorteilen bringt? Ich kann nicht nachvollziehen, inwieweit man die
  228. Zusammenstellung von Daten optimieren kann, die bereits in einer Form
  229. vorliegen, dass man sie 1:1 aus dem Lademodul uebernehmen kann. Unter
  230. der Voraussetzung, dass die verarbeitende Funktion einen _Pointer_ auf
  231. diese Daten erwartet, versteht sich.
  232.  
  233. > >    Ich kann also nicht nachvollziehen, welche tiefere
  234. > >Bedeutung dem Ansinnen zukommt, zur Laufzeit 'automatic' Tagarrays
  235. > >anlegen zu wollen? m.E. bringt das keine zusaetzlichen Vorteile.
  236. >
  237. > Siehe oben. Ausserdem, je mehr Daten Du dem Compiler zur Verfuegung stellst,
  238. > aus denen er versuchen kann, das Optimum rauszuholen, desto besseren Code
  239. > wird er erzeugen.
  240.  
  241.     Redundanzen koennen nie zu mehr als 100% entfernt werden.
  242. Also der gleiche Effekt, als wenn man sie erst gar nicht erzeugt
  243. (was ich versuche, zu propagieren). Darueber den _Compiler_ brueten
  244. zu lassen, erachte ich zumindest als ineffizient (da kommt halt der
  245. Oekonom durch, Informatiker moegen sich an solchen Effekten schon
  246. aus rein wissenschaftlichem Interesse ergoetzen). Es ist zwar schoen,
  247. wenn ein Compiler sowas kann, aber koennte er in dieser Zeit nichts
  248. Sinnvolleres anstellen? Die Rechnung "Mehr Code => Mehr Optimierung"
  249. scheint mir jedenfalls _etwas_ widerspruechlich! :-)
  250.  
  251. > In diesem Fall (jetzt mal von dynamischen Daten aus-
  252. > gehend) hat er entweder die Wahl, zu einem bestimmten Zeitpunkt alle
  253. > Werte zu instantiieren und per Stack an die Varargs Funktion zu uebergeben
  254. > (womit a0/a1/d0/d1 ja wegfallen als Datentraeger), oder sie womoeglich
  255. > ohne Umwege direkt nach erfolgter Berechnung in die spaeter der OS-Funktion
  256. > zu uebergebende Tag-Struktur zu schreiben. Aus diesem Blickwinkel kriegst
  257. > Du mit der Varargs-Version garantiert die schlechteste Loesung, auch wenn
  258. > nicht garantiert ist, dass die andere Variante besser ist.
  259.  
  260.     - a0/a1/d0/d1 fallen frueher oder spaeter _immer_ weg, denn
  261.     wir wollen ja eine Systemfunktion -direkt oder indirekt- aufrufen.
  262.     
  263.     - Die Werte werden auf dem Stack uebergeben, und da _bleiben_
  264.     sie dann auch, weil der Stack damit zum TagArray _wird_.
  265.     
  266.     - 'automatic'-Variablen werden gemeinhin _auch_ nirgendwo
  267.     anders als auf dem Stack instantiiert. Jede Abweichung
  268.     hiervon erzeugt _nochmals_ zusaetzlichen Code zur Speicher-
  269.     beschaffung, Verwaltung und abschliessender Freigabe.
  270.  
  271.     - Die Schlussfolgerung ist in diesem Zusammenhang falsch.
  272.  
  273. > >    Strings initialisiert man in C gemeinhin _immer_ statisch.
  274. > >Zur Laufzeit geht das nur mit strcpy() e.a..
  275. >
  276. > Ooch.. bist Du aber K&R treu.. nur weil das immer so war, muss das doch
  277. > nicht immer so bleiben?!
  278.  
  279.     Was gewinnt man durch die automatic-Deklaration von Strings?
  280. Ein _builtin_strcpy() vom (in diesem Falle dann _doch_ wieder statisch
  281. initialisierten) DATA-Segment auf den Stack? Doppelter Speicherbedarf,
  282. zusaetzlicher Code! (Womit nicht gesagt sein soll, dass es fuer diesen
  283. Mehraufwand niemals eine Rechtfertigung geben mag). Ich bin nur sehr
  284. vorsichtig mit "Segnungen" dieser Art. Wer zeitkritische Applikationen
  285. schreibt, mag hunderte von builtin-Funktionen und damit verbundene
  286. Codegenerierung erdulden [nur am Rande: strcpy() ist m.E. _selten_ der
  287. ideale Ansatzpunkt fuer Optimierungen], ansonsten erzeugen Funktionsaufrufe
  288. aber regelmaessig _kuerzeren_ Code. Keine Frage "K&R vs. ANSI" sondern ganz
  289. einfach "Effizienz vs. Komfort"!
  290.  
  291. > Es ist doch durchaus huebsch, mktemp(3) so
  292. > zu implementieren:
  293. >   char template[] = "ram:t/tmpl.XXXXXX";
  294.  
  295.     "Huebsch" ist eine subjektive Empfindung. Tatsache ist, dass
  296. im fertigen Objektmodul sowohl der initiale Stringinhalt im DATA-
  297. Segment steht, zum Funktionseintritt als erstes von dort auf den
  298. Stack _umkopiert_ wird, um dann gleich wieder in subsequenten
  299. Konstrukten _ueberschrieben_ zu werden. Da bleibt die Effizienz doch
  300. irgendwo auf der Strecke, findest Du nicht? Selbst unter der Annahme,
  301. dass der erste Schritt "wegoptimiert" wird (der Compiler finde irgendwie
  302. (?) heraus, dass der initiale Inhalt von template[] nicht benoetigt werde),
  303. gewinnt man mit dieser Moeglichkeit unterm Strich _nichts_.
  304.     
  305. > [...] Die ANSI-Variante sieht nicht
  306. > nur schoener aus, sondern ist auch einfacher zu verwenden, IMHO ;-)
  307.  
  308.     Die Frage lautet halt immer: "Wieviel Bytes ist Dir
  309. Deine Faulheit wert" :-) :-).
  310.  
  311. > Markus M. Wild    -  wild@nessie.cs.id.ethz.ch  |  wild@amiga.physik.unizh.ch
  312.  
  313. --
  314. Best regards,
  315. Franz-Josef Reichert   GERMANY - VOICE: +49 6805 7417
  316. Kuchlingerstrasse 13   UUCP: fjrei@kbsaar.{saar|adsp}.sub.org
  317. 6601 Kleinblittersdorf        fjrei@kbsaar.saar.de
  318.  
  319. From de.comp.sys.amiga.misc Thu Jul  2 00:53:09 1992
  320. Path: cs.tu-berlin.de!news.netmbx.de!Germany.EU.net!unido!sbsvax!coli-gate.coli.uni-sb.de!uhf!kbsaar!kbsaar!fjrei
  321. From: fjrei@kbsaar.saar.sub.org (Franz-Josef Reichert)
  322. Newsgroups: de.comp.sys.amiga.misc
  323. Subject: Re: TagItems und C-Compiler
  324. Message-ID: <WMnhr*3j3@kbsaar.saar.sub.org>
  325. Date: 1 Jul 92 14:03:38 GMT
  326. References: <5pcer*Fo1@zikzak.in-berlin.de> <olsen.9845@sourcery.mxm.sub.org>
  327.  <2Umfr*3s1@zikzak.in-berlin.de> <olsen.9955@sourcery.mxm.sub.org> <KlTgr*Ch3@kbsaar.saar.sub.org>
  328.  <1992Jun30.120623.8943@cs.tu-berlin.de>
  329. Reply-To: fjrei@kbsaar.saar.de (Franz-Josef Reichert)
  330. Organization: Private Amiga Site
  331. Lines: 57
  332. X-Newsreader: Arn V1.00 beta rel2
  333.  
  334. In article <1992Jun30.120623.8943@cs.tu-berlin.de>, Andreas M. Kirchwitz writes:
  335.  
  336. > In <KlTgr*Ch3@kbsaar.saar.sub.org> fjrei@kbsaar.saar.sub.org (Franz-Josef Reichert) writes:
  337. >
  338. > >    Strings initialisiert man in C gemeinhin _immer_ statisch.
  339. >
  340. > Ach ja?  Ist mir neu...
  341.  
  342.     Initialisierung = VORbelegung von Speicherzellen mit bestimmten
  343.         Inhalten.
  344.         
  345.     Statisch = i.S.v. Wertbestimmung _vor_ der Laufzeit.    
  346.  
  347.     Mit "statischer Initialisierung" bezeichne ich demnach, dass bei
  348. allen Stringinitialisierungen der resultierende String-Inhalt bereits _vor_
  349. der Laufzeit festzustehen hat, das "immer" impliziert, dass es in 'C' nicht
  350. anders moeglich ist. Was einfach daran liegt, dass C i.d.R. compiliert, nicht
  351. interpretiert wird. Was ist daran unklar? Wie kann ich etwas "VORbelegen",
  352. wenn ich zum Zeitpunkt der VORbelegung noch gar nicht weiss, welche Werte
  353. das vorzubelegende Objekt erhalten soll? Das waere doch ein ganz klarer
  354. Widerspruch!
  355.  
  356. > >Zur Laufzeit geht das nur mit strcpy() e.a..
  357. >
  358. > Mitnichten.
  359.  
  360.     Was Du meinst, ist "dynamisches Ausfuellen von Stringinhalten".
  361. In der Praxis laeuft dies aber immer auf ein (bestenfalls) inline-strcpy()
  362. hinaus, dessen Quelldaten in den meisten Faellen auch noch aus statischen
  363. Daten bedient werden. Sobald ich im C-Source irgendwas zwischen doppelte
  364. Anfuehrungszeichen setze, kann ich davon ausgehen, dass der Compiler daraus
  365. auch statische Daten erzeugt. Womit ich statische Daten gewinne, nicht
  366. aber vermeide. Der signifikante Unterschied zwischen (1)
  367.  
  368.         test1() {
  369.             unsigned char string[] = "Laberfasel";
  370.         }
  371.  
  372.     und (2)
  373.     
  374.         test2() {
  375.             static unsigned char string[] = "Laberfasel";
  376.         }
  377.  
  378.     ist nunmal, dass (2) _weniger_ Code erzeugen _muss_!
  379.  
  380. >         Mit Unverstaendnis...  Andreas
  381.  
  382.     Ueber mangelhafte Effizienz des (dynamischen) Umkopierens (aus
  383. ihrer Definition heraus bereits) statischer Dateninhalte braucht aber nicht
  384. diskutiert zu werden? Oder etwa doch? :-)
  385.  
  386. --
  387. Best regards,
  388. Franz-Josef Reichert   GERMANY - VOICE: +49 6805 7417
  389. Kuchlingerstrasse 13   UUCP: fjrei@kbsaar.{saar|adsp}.sub.org
  390. 6601 Kleinblittersdorf        fjrei@kbsaar.saar.de
  391.  
  392. From de.comp.sys.amiga.misc Fri Jul 10 21:20:13 1992
  393. Path: cs.tu-berlin.de!news.netmbx.de!Germany.EU.net!unido!horga!ruhr.de!erni.bs.open.de!germal!germal.bs.open.de!gm
  394. From: gm@germal.bs.open.de (Gerald Malitz)
  395. Newsgroups: de.comp.sys.amiga.misc
  396. Subject: Re: TagItems und C-Compiler
  397. Message-ID: <vQ+jr*yw1@germal.bs.open.de>
  398. Date: 9 Jul 92 08:07:59 GMT
  399. References: <JcBgr*rx1@zikzak.in-berlin.de> <1992Jun30.234220.16956@bernina.ethz.ch>
  400.  <Ebnir*Ps1@germal.bs.open.de> <1992Jul5.140459.184@bernina.ethz.ch>
  401. Lines: 77
  402. X-Newsreader: Arn V1.00 beta rel2
  403.  
  404. In article <1992Jul5.140459.184@bernina.ethz.ch>, Markus Wild writes:
  405.  
  406. > In article <Ebnir*Ps1@germal.bs.open.de> gm@germal.bs.open.de (Gerald Malitz) writes:
  407. > >    Strings haben im Code-Hunk nichts zu suchen, denn sie sind
  408. > >ja nun mal nicht executable.  Veraenderlich - im Sinne von nicht vor
  409. > >Schreibzugriffen geschuetzt - sind sie beim Amiga ja in jedem Fall, Exec
  410. > >bietet kein Protected-Memory.  Andererseits kann ein Programm mehrere
  411. >
  412. > Diese Unterscheidung ist ja nur wichtig, wenn Du residentfaehige Programme
  413. > schreiben willst, deshalb hab ich das ja explit erwaehnt. In diesem Falle
  414. > kannst Du Dir nicht mehrere Data-Hunks leisten, da Du ja mit A4 alle DATA
  415. > Objekte erreichen musst. Chip-Data Hunks sind unter diesen Umstaenden auch
  416. > speziell, und muessen wie CODE Hunks behandelt werden, denn wenn sie auch
  417. > veraenderlich sind, hast Du im Nu ein nicht-pures Programm.
  418.  
  419.     Natuerlich koennen residentfaehige Programme mehrere Data-Hunks
  420. haben, und sie haben sie auch.  Lediglich die globalen veraenderlichen
  421. Daten muessen relativ adressiert werden.  Die Konstanten - um genau die
  422. geht es ja - koennen ebenso wie der Code gemeinsam benutzt werden.  Sie
  423. werden in jedem Fall absolut adressiert, ob sie nun in einem Code oder
  424. einem Datensegment liegen.  Wenn Du das Beispielprogramm von Andreas mal
  425. compilierst, hast Du (zumindest mit SAS) ein Executable mit drei Hunks:
  426. dem Code-Hunk und zwei Daten-Hunks, einer enthaelt die globalen Variablen
  427. des Programms (in dem Fall hauptsaechlich aus der Linklibrary), der andere
  428. die Konstanten (in dem Fall den String "Hello World\n").  Letzterer muss
  429. eben nicht in den Code-Hunk.
  430.  
  431.     Deshalb bekommt Andreas ja auch Probleme, wenn er dem Linker
  432. die Option SMALLDATA mitgibt.  Dann werden diese beiden Data-Hunks
  433. zusammengefasst.  Wenn er Pech hat, landet am Ende alles - auch die
  434. Variablen - im Hunk fuer globale Konstanten.  Klar, dass das schief
  435. geht.
  436.  
  437. > >die erste Wahl.  (Btw. wer seine Strings nun doch unbedingt unter den
  438. > >Code gemixt haben will, soll sich aus dem Handbuch eine geeignete
  439. > >Compileroption suchen.  Die gibt es naemlich auch.  Aetsch.  Helfen
  440. > >wuerde es in diesem Fall aber auch nicht.)
  441. >
  442. > Aeh, wer sagt denn, dass Exec *nie* Protected Memory bieten wird?
  443.  
  444.     Und wovon traeumst Du Nachts ;^)
  445.  
  446. > Genauso wenig wie es Protected Memory gibt im Moment, gibt's Protected
  447. > Hunks, also steht's 1:1, aetsch zurueck;-)))
  448.  
  449.     Abseits, ganz klar! =:^>  Dir fehlt nach wie vor der Grund,
  450. Daten in den Code zu mischen - da sie ja so oder so nicht geschuetzt
  451. sind und in jedem Falle absolut% adressiert werden muessen.
  452.  
  453.     % mindestens aber pc-relativ, das ist aber auch nicht ohne,
  454. da bei SAS die Module auf 64K beschraenkt sind.
  455.  
  456. > Helfen tut es immer dann,
  457. > wenn residentfaehige Programme mit moeglichst viel Data erzeugt werden
  458. > sollen.
  459.  
  460.     Helfen kann ich nur dann, wenn Konstanten da sind, die aus
  461. dem relativ zu a4 adressierten Bereich herausgenommen werden koennen.
  462. Die muss ich aber nicht in ein Code-Segment packen, sondern kann sie -
  463. wie oben beschrieben - auch in einem eigenen Daten-Segment unterbringen.
  464.  
  465.     Nebenbei: das Erzeugen residenter Progamme mit cres.o ist IMHO
  466. sowieso nur ein Hack, fuer den man einen Preis zahlt.  Die globalen
  467. Variablen sind auf 64K beschraenkt (schoenen Gruss an die DOSe), das
  468. ganze fuehrt leicht zu Verwirrungen (Blink-Warnings) oder Abstuerzen
  469. (Option SMALLDATA) und __saveds bzw. geta4() tun auch nicht mehr wie
  470. gewuenscht.
  471.  
  472. > -Markus
  473.  
  474.     Tschuess, Gerald.
  475.  
  476. -- 
  477.   // Gerald Malitz,  Bolchentwete 4,  3300 Braunschweig,  Voice: +49 531 796832
  478. \X/ gm@germal.bs.open.de    "Allein der K|ndigungsschutz f|r Schwangere hat den
  479. ungeborenen Kindern tausendfach mehr geholfen als alle Kardindle, Staatsanwdlte
  480. und Richter zusammengenomen"                                     Heiner Gei_ler
  481.  
  482. From de.comp.sys.amiga.misc Fri Jul 24 19:21:24 1992
  483. Path: cs.tu-berlin.de!news.netmbx.de!Germany.EU.net!unido!horga!ruhr.de!erni.bs.open.de!germal!germal.bs.open.de!gm
  484. From: gm@germal.bs.open.de (Gerald Malitz)
  485. Newsgroups: de.comp.sys.amiga.misc
  486. Subject: Re: Initialisierung, C-Experte gesucht
  487. Message-ID: <5-por*qH1@germal.bs.open.de>
  488. Date: 22 Jul 92 20:18:45 GMT
  489. References: <1992Jul10.204019.337@cs.tu-berlin.de> <sticht.0786@edith.deg.sub.org>
  490.  <sgilr*PJ1@zikzak.in-berlin.de> <sticht.07b6@edith.deg.sub.org> <zYMmr*bR1@zikzak.in-berlin.de>
  491.  <3671@babylon.rmt.sub.org>
  492. Lines: 27
  493. X-Newsreader: Arn V1.00 beta rel2
  494.  
  495. In article <3671@babylon.rmt.sub.org>, Ralph Babel writes:
  496.  
  497. > > Link das Programm zusaetzlich mit SMALLDATA.  Du wirst ein
  498. > > defektes Executable erhalten :-(
  499. > Das kann ich nicht reproduzieren:
  500.  
  501.     Das tritt auch nur in einem Sonderfall auf, naemlich
  502. wenn printf ohne fmt aufgerufen wird (wir hatten als ein
  503. Beispiel ein char[] als autoinit-Variable).  Dann hat das
  504. Objectfile keinen __MERGED-Hunk, und das findet Blink wohl
  505. nicht so toll :)  Was passiert, wenn es mehrere Objectfiles
  506. gibt, von denen ein paar diesen Hunk haben, andere aber nicht,
  507. habe ich noch nicht probiert (interessiert mich auch nicht so
  508. brennend).
  509.  
  510.     Grundsaetzlich hat Andreas mit den Probelemen
  511. schon recht, sie sind da.  Aber das Drama, das er daraus
  512. macht, ist reif fuer den MB-award.
  513.  
  514. > Ralph
  515.  
  516.     Tschuess, Gerald.
  517.  
  518. -- 
  519.   // Gerald Malitz,  Bolchentwete 4,  3300 Braunschweig,  Voice: +49 531 796832
  520. \X/ gm@germal.bs.open.de                   ISO?  Nicht immer, aber immer vfter.
  521.  
  522.