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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2009
    Messages : 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 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    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 averti
    Inscrit en
    Novembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2009
    Messages : 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 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    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