2017-02-23 5 views
1

J'utilise Ghostscript sous Linux et je me sens toujours comme un débutant. Je veux enregistrer la valeur au-dessus de la pile afin que je puisse rappeler la valeur plus tard sans avoir à faire des opérations de pile complexes pour le récupérer. La valeur sera une latitude lue dans un fichier de données, donc je ne peux pas l'incorporer directement dans le programme. La solution évidente me semble stocker la valeur comme une paire clé/valeur dans le userdict, quelque chose comme (pour sauver une valeur de latitude):Postscrip/Ghostscript Comment enregistrer le haut de la pile en tant qu'élément d'un dictionnaire

2 dict coords 
coords lat [some code to get the value of the latitude on the stack] put 

S'il vous plaît quelqu'un peut-il expliquer comment faire le bit et y compris le supports? Il se peut bien que je me trompe complètement, auquel cas, que dois-je faire à la place? Contexte: J'écris un programme pour dessiner les gores qui peuvent être découpées et collées sur une boule pour faire un globe terrestre, en utilisant les données de latitude et de longitude d'un fichier. Il y a un peu de maths nécessaires pour mettre à l'échelle les longitudes pour les ajuster correctement dans les gores. Les données que j'utilise sont l'ensemble des 1320 coordonnées dans world.dat inclus avec l'installation de gnuplot.

Répondre

2

Vous n'avez pas vraiment donné assez pour continuer, qu'est-ce que 'coords' et 'lat'?

Vous avez créé un dictionnaire à 2 entrées sur la pile d'opérandes, est-ce que 'coords' est une procédure exécutable qui remplit cela? Si oui, renvoie-t-il le dictionnaire sur la pile d'opérandes? En exécutant 'put' comme vous avez, vous allez définir un tableau dans le dictionnaire courant, avec une clé de 'lat', quel que soit le type d'objet. Vous devrez alors à nouveau accéder à 'lat' pour récupérer l'objet du dictionnaire (ou utiliser forall sur le dictionnaire, et il sera encore difficile de récupérer la valeur particulière).

Pour répondre à votre question, cela définira la valeur sur le dessus de la pile d'opérandes dans le dictionnaire courant:

5  %% put an object on top of the dictionary stack, stack is now: 5 
/Saved %% create a name object on the operand stack, stack is now: 5 /Saved 
exch %% exchange the objects, stack is now: /Saved 5 
def  %% define the value on the stack in the current dictionary, using the 
     %% key also on the stack 

Notez que ceci est défiait dans le dictionnaire courant , celui au-dessus de la pile du dictionnaire. Pour le définir explicitement dans userdict, faites

5   %% put an object on the operand stack, stack is now: 5 
/Saved  %% put a name object on the operand stack, stack is now: 5 /Saved 
exch  %% exchange the objects, stack is now: /Saved 5 
userdict %% put a pointer to userdict on the operand stack, stack is now /Saved 5 <<userdict>> 
3 1 roll %% roll the stack, stack is now: <<userdict>> /Saved 5 
put  %% put the value from the operand stack, using the key from the operand stack, in the dictionary also on the operand stack 
+0

Merci KenS. Une réponse parfaite simple pour ma question. Désolé pour ma gaffe sur userdict. Je l'ai fait paraître plus compliqué que nécessaire, je vais éditer la question pour expliquer ce que je fais plus complètement –