AW: [Allegro] Nochmals: ik,x etc.

Fischer, Thomas fischer at sub.uni-goettingen.de
Di Apr 19 12:25:19 CEST 2011


Hallo Herr Eversberg,

> > 2. Die Variable #cc speichert den *Namen* der zuletzt aufgerufenen 
> > Kategorie.
> Nicht den Namen, sondern wie unter 1. den vollständigen 
> Feldinhalt, wie er im Aufnahmespeicher steht.
> Außerdem speichert #cc nichts, d.h. es ist keine Kopie von 
> etwas, sondern #cc ist nur ein Zeiger auf das erste Zeichen 
> des Feldinhalts, d.h. auf dessen #. Wenn es dann heißt  
> #i4..., dann wird auf diesen Zeiger 4 addiert und das Byte an 
> der sich so ergebenden Stelle wird genommen.
> 
> > Dieser bleibt innerhalb eines Unterprogramms konstant, der
> > *Inhalt* der Variablen kann aber verändert werden. Die 
> > Indikatoraktionen #ik,x und #Ik,x vergleichen mit dem 
> *Inhalt* dieser 
> > Variablen bzw. ihrem Namen, wenn die Ziffer k kleiner als tN+2 ist.
> > 
> Das hört sich etwas verworren an. Das zuletzt vor dem Aufruf 
> eines UP benutzte Feld (letzte Zeile mit #nnn ...) ist die 
> Adresse, auf die #cc zeigt, und diese bleibt konstant. Wird 
> im UP ein Feld in den Arb.Speicher VOR das betr. Feld 
> eingefügt, stimmt die Adresse nicht mehr! Sicherer ist dann, 
> am Beginn des UP so etwas wie #cc =xy e0 zu machen, dabei 
> wird das Feld, auf das #cc zeigt, in #uxy kopiert.

Jetzt ist schon fast alles klar. Aber wenn in #cc tatsächlich nur der Zeiger auf eine Adresse des Arbeitspeichers steht, dann kann der ja bei allen möglichen Aktionen fehlgeleitet werden, denn ob ein Eintrag "VOR das betr. Feld" im Arbeitsspeicher eingefügt wird, kann der Nutzer doch nicht entscheiden? Oder muss ich mir das ganze wie einen großen zusammenhängenden Speicherbereich vorstellen, der von Kategorie 0 bis zum (offenen) Ende geordnet vorliegt? 
In meiner Mac-C-Programmierung gab es die Unterscheidung zwischen "Pointer" (Zeiger auf einen Speicherbereich) und "Handle" (Zeiger auf einen Pointer). Während ersterer auf eine feste Adresse verweist, die nach Speicherverlagerung falsch werden kann, wird der Handle bei Speicheraktionen mitgeführt und weist immer auf einen Pointer mit der korrekten Adresse der Variablen. Ich hatte erwartet, dass in #cc das Analogon eines Handles, nicht eines Pointers steht.

Wie ist das jetzt korrekt *und* verständlich auszudrücken?
In #cc steht die Speicheradresse der zuletzt aufgerufenen Variablen, an dieser Stelle findet sich der "Namen" und Inhalt der Variablen.
Mit
#cc =xy e0
(warum e0?) kann der *Inhalt* der entsprechenden Variablen in #uxy überführt werden.
Nach Ihrer Erklärung muss ich den Namen etwa per
#t{s0}
#cc =xy
#t{s4}
in #uxy speichern, wenn ich zu einem späteren Zeitpunkt nach der Bearbeitung von Kategorien verlässlich darauf zugreifen will, dann geht aber nicht mehr #i2,2, sondern nur
#uxy i5,2 ...
Ist das korrekt?

Mit freundlichen Grüßen
Thomas Fischer 


Mehr Informationen über die Mailingliste Allegro