IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Probleme dans une boucle for, faisant appel a une fonction


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2009
    Messages : 19
    Points : 19
    Points
    19
    Par défaut Probleme dans une boucle for, faisant appel a une fonction
    J ai encore une petit soucis, cette fois-ci dans une boucle for.

    Donnees:
    - le fichier texte 'allstat_overlap.txt'allstat_overlap.txt
    - le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #!/bin/bash
    # Specify pat and seg
     
    # test
    #
    # Return the atlas number for which the highest overlap is computed
    #
     
     
    # Inputs
    fimgs="`seq 0 7`"
    strs="Ao"
     
     
    # Functions
    function getAtlasNb()
    {	
    	argexitcode=65
    	pat="undefined"
    	seg="undefined"
    	while getopts "p:s:" argje
    	do
    	  case $argje in
    		p) pat="$OPTARG";;
    		s) seg="$OPTARG";;
    		*) echo "ERROR: Wrong arguments!"; exit $argexiterror;;
    	  esac
    	done
     
    	if [ "$pat" = "undefined" ]
    	then
    	  echo "ERROR_pat: Not enough arguments!"; exit $argexitcode  
    	fi
    	if [ "$seg" = "undefined" ]
    	then
    	  echo "ERROR_seg: Not enough arguments!"; exit $argexitcode  
    	fi
     
    	file='allstat_overlap.txt'
     
    	cpt=1;
    	# cpt=1 : transform
    	# cpt=2 : overlap
    	# cpt=2p+1: pxxxpyyy
    	# cpt=2p: 0.abcdef
    	header=2;
     
    	start=$(($header+$pat*7*2))
    	overlap=0;
     
    	# Read each expression in each line
    	for line in $(cat $file); 
    		do 
    		# Only look at the part we are interested in
    		if [ $cpt -gt $start ] && [ $cpt -lt $(($start+2*8-1)) ]
    			then
    			if [ $(expr $cpt % 2) -eq 1 ]
    				then
    				temp=$line;
    				comb=${temp:$((${#temp}-1)):1};
    			fi
     
    			if [ $(expr $cpt % 2) -eq 0 ]
    				then
    				#echo 
    				ov=$line
    				# Test to find the atlas which gives the highest overlap
    				if [ $(expr $ov \> $overlap) -eq 1 ]
    					then
    					overlap=$ov;
    					atlas=$comb;
    				fi
    			fi
    		fi
    		cpt=$(($cpt + 1))
    	done
    	return $atlas
    	exit 0;
    }
     
     
    # Processing
    for fimg in $fimgs
    	do
    	echo fimg $fimg
    	for str in $strs
    		do
    		echo -e "\tseg: "$str
    		getAtlasNb -p $fimg -s $str
    		echo -e "\tatlas selection:" $? "\n"		# $? : value returned by getAtlasMb fonction
    	done
    done
    Mon probleme se situe dans la boucle for de la partie #Processing.
    A la premiere iteration, pas de probleme, la fonction getAtlasNb lit bien les parametres d entree, et me renvoie une valeur correcte. Mais des la seconde iteration, j ai l erreur suivante:
    ERROR_pat: Not enough arguments!
    ce qui signifie que l argument d entree de la fonction getAtlasNb n est pas pris en compte.
    Et je ne comprends malheureusement pas pourquoi...

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Bien sûr, tu as ce message parce que tu redéfinis les variables pat et seg au début de la fonction getAtlasNb !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2009
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Oui, effectivement.
    Je definie les variables pat et seg (qui sont propres a la fonction) au debut de celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pat="undefined"
    seg="undefined"
    mais c est purement et simplement pour les initialiser. Dans tous les cas, leur valeur sera mise a jour par la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	while getopts "p:s:" argje
    	do
    	  case $argje in
    		p) pat="$OPTARG";;
    		s) seg="$OPTARG";;
    		*) echo "ERROR: Wrong arguments!"; exit $argexiterror;;
    	  esac
    	done
    qui assigne alors a ces variables pat et seg, les valeurs $fimg et $str (getAtlasNb -p $fimg -s $str).

    Seulement si il n y a pas d'argument, pat et seg resteront a la valeur "undefined", et le programme s arrete (boucle if).

    Ce qu il se passe, c est que lors de la seconde iteration, meme si j ai bien la ligne de commande avec les 2 arguments d entrees, il ne passe pas par la boucle while.
    C est ca le probleme. Ca ne vient pas du fait que je redefinis les variables locales au debut de ma fonction.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Pourtant le message d'erreur exprime bien qu'à un moment pat ou seg vaut undefined...

    Je les ai commentées, ce qui laisse faire la boucle while; mais on peut obtenir le même résultat en les définissant à l'aide de la commande interne locale

    à bientôt.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/09/2011, 21h31
  2. Probleme de syntaxe dans une boucle for
    Par spoker04 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/09/2008, 10h12
  3. Appeler une série de variable dans une boucle for
    Par jujuf1 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/02/2008, 16h06
  4. Affectation de variable boucle FOR à l'intérieur d'une boucle WHILE
    Par Droïde Système7 dans le forum Débuter
    Réponses: 10
    Dernier message: 05/11/2007, 19h11
  5. probleme dans un boucle for
    Par accoustic dans le forum Delphi
    Réponses: 2
    Dernier message: 26/08/2006, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo