2013-05-03 3 views
2

Quel est le but de Pascal pour déclarer une variable pointeur sur un pointeur? J'ai un code dans Mac Think Pascal. Voici certaines parties du code que je ne comprends pas:Pointeur vers pointeur et fonction NewHandle dans (Think) Pascal

type 
    my_array = array[1..100] of integer; 
    my_array_pointer = ^my_array; 
    my_array_handle = ^my_array_pointer; 
    ... 
var 
    xx : my_array_handle; 
    ... 
begin 
    xx:= my_array_handle(NewHandle(sizeof(my_array))); 

Comme vous le voyez, la dernière ligne est une affectation d'un type my_array_handle à la variable xx. Qu'est-ce que ça veut dire? Que fait la fonction NewHandle? (Ceci est une fonction interne de Think Pascal). En fait, je dois convertir un programme Think Pascal en Windows Pascal. Cependant, je ne trouve pas la description de la fonction NewHandle, et je ne sais pas comment implémenter cette fonction en utilisant les fonctions de pointeur standard (New(), GetMem() etc).

Répondre

3

Ceci est une fonctionnalité classique de macos, pas typiquement quelque chose de Pascal.

Je ne sais pas exactement, mais cela avait quelque chose à voir avec la relocalisation du programme chargé dans un environnement non-MP.

Notez que le pointeur indirect est alloué via une fonction OS, ce qui signifie probablement qu'il est alloué dans une table qui est gérée par le système d'exploitation. (pour que le système d'exploitation puisse déplacer/déplacer le programme?)

Dans la programmation Mac moderne (et autre), ce principe est étranger. Juste le nettoyer.

(ajouté) Si vous voulez garder ces redirections, vous pouvez tenter votre chance avec quelque chose comme:

 function newhandle(nrbytes:integer):ppointer; 
    var xx : ppointer; 
    begin 
     new(xx); 
     getmem(xx^,nrbytes); 
     newhandle:=xx; 
    end; 

Je n'ai pas ajouté cette origine, mais je vous recommande simplement nettoyer ces références indirectes anachroniques et utilisent des pointeurs basés sur my_array_pointer et getmem ou new directement.

La signification de ces références indirectes n'a aucune utilité sur les systèmes Mac OS classiques autres que m68k, même si les versions ultérieures de PPC les supportent encore un peu. (Le mode PPC est toujours protégé)

Si vous voulez vraiment les détails, vous voudrez probablement vous abonner à la liste mac-pascal.

+0

Merci pour vos commentaires. Je pense que l'instruction avec la fonction 'NewHandle()' dans le code fait une certaine initialisation de la variable pointeur. Je ne peux pas le supprimer, car il n'y a pas d'autres fonctions (comme 'New()') dans le code qui initialise le pointeur. On sait qu'il est dangereux d'utiliser une variable pointeur sans initialisation. – user2320292

+0

Voir les notes ajoutées pour répondre, et veuillez préciser le compilateur que vous utilisez maintenant. –

+0

(Désolé, je ne peux pas voter pour votre réponse, parce que je n'ai pas assez de points). Dans votre fonction, la variable 'result' n'est pas définie. Mais comme je l'ai compris, la ligne pour 'xx' devrait être changée en' New (xx); GetMem (xx ^, sizeof (mon_array)); '. S'il vous plaît dites-moi, si ce n'est pas correct. J'utilise un ancien Dev-Pas 1.9.2. Comme écrit dans un fichier doc, il est possible d'utiliser un nouveau compilateur (FreePascal) dans Dev-Pas (vous l'avez également souligné dans d'autres threads [Fonctions de bits dans Think Pascal] (http://stackoverflow.com/questions/16218767/bit-functions-in-think-pascal? rq = 1) Je vais vérifier la liste mac-pascal – user2320292

Questions connexes