2017-10-04 8 views
1

J'essaie d'utiliser mon module NumSuch dans un autre programme. Mon Makefile comprendAppel du module externe depuis la Chapelle

NUMSUCH_HOME=/home/buddha314/numsuch/src 
MODULES=-M$(NUMSUCH_HOME) 

yummly: yummlyAnalysis.chpl 
    $(CC) $(FLAGS) $(MODULES) -o yummlyAnalysis $< 
    #$(CC) $(MODULES) -o yummlyAnalysis $< 

Dans le code, je ne veux pas use NumSuch parce que je ne veux pas polluer l'espace de nom. Je pensais que je pouvais

var g = NumSuch.buildFromSparseMatrix(A, weighted=false, directed=false); 

Mais lors de la compilation, je reçois

yummlyAnalysis.chpl:72: error: 'NumSuch' undeclared (first use this function) 
Makefile:12: recipe for target 'yummly' failed 

Répondre

3

Le problème avec ce programme est que la chapelle ne sait pas que NumSuch est le nom d'un module par opposition à un enregistrement, classe, ou faute de frappe. Par conséquent, il ne va pas chercher dans votre chemin de recherche de module. La solution est de faire savoir à Chapel qu'il existe un module nommé NumSuch:

L'une des façons de le faire est d'utiliser une instruction use (ceci indique qu'il existe un module avec le nom donné et provoquera la recherche du compilateur pour cela s'il ne l'a pas déjà trouvé). Vous pouvez éviter la pollution de l'espace de noms que vous espériez en utilisant des filtres qui causent pas de symboles à être visible dans le cadre de la déclaration use:

use NumSuch only ;  // only make this (empty) list of symbols available 

ou:

use NumSuch except *; // make all symbols available except for `*` (all of them) 

Après une ou l'autre de ces déclarations , votre appel devrait fonctionner:

NumSuch.buildFromSparseMatrix(...); 

et un appel non qualifié ne doit pas puisque aucun symbole ont été mis à la disposition par le use:

buildFromSparseMatrix(...); 

Vous pouvez même mettre la déclaration use dans un autre champ qui provoquerait le compilateur d'aller chercher le module, trouver, sachez qu'il ya un module avec ce nom, et de limiter la pollution de l'espace de noms à cette portée (bien que je considère que ce stylistiquement pire par rapport à la précédente, plus idiomatiques, approches):

{ 
    use NumSuch; // causes the compiler to go looking for module NumSuch; limits namespace pollution to this scope... 
} 
NumSuch.buildFromSparseMatrix(...); 

Une deuxième façon de le faire est de lister le fichier source NumSuch.chpl explicitement sur la ligne de commande chpl. Par défaut, tous les fichiers source nommés sur la ligne de commande sont analysés et leurs modules sont connus du compilateur.