[script sh] boucle for

Fermé
pom - 23 août 2006 à 13:27
 regim-fatma-damak - 15 avril 2009 à 13:59
Bonjour, je ne comprends pas pourquoi le script suivant ne marche pas (sachant qu'il marche très bien si remplace la ligne

for N in $(seq 1020 20 1300)

par la ligne


for N in $(seq 900 20 1000)

#!/bin/sh

for N in $(seq 1020 20 1300)
do
  ret=1
  while [ $ret != 0 ]
  do
    rm -f out
    make
    echo "N = $N"
    echo
    echo "Elapsed time :"
    time -p ./out input.txt $N
    echo
    ret=$?
    if [ $ret != 0 ]
    then
      echo
      echo "ERROR : exit program and new run"
      echo
    fi
  done

  if [ ! -d ../Outputs ] # si le repertoire ../Outputs n'existe pas on le cree
  then
    mkdir ../Outputs
  fi
  
  if [ $N -le 9 ]
  then
    newdir=Part000$N
  elif [ $N -le 99 ]
  then newdir=Part00$N
  elif [ $N -le 999 ]
  then newdir=Part0$N
  else newdir=Part$N
  fi
  
  mkdir $newdir
  mv Mean.txt $newdir
  mv RandomInitialConditions.txt $newdir
  cp input.txt $newdir
  cp system.txt $newdir
  cp therm.txt $newdir
  rm -f Particle*
  rm -f Volumes.txt

  tar -cvzf $newdir.tar.gz $newdir
  mv $newdir.tar.gz ../Outputs
  rm -rf $newdir
done
A voir également:

4 réponses

J'ai oublié, le message d'erreur est :

/home/pomme/bin/runprgmdloop1020_20_1300.sh: line 3: 24765 Erreur de segmentation ./out input.txt $N
0
Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006 6
23 août 2006 à 13:34
Tu es certain que ton make c'est déroulé correctement ?
0
Ben oui... il marche très bien si je fais ma boucle pour N allant de 900 jusqu'à 1000. Pourquoi ne marcherait-il pas pour 1020 jusqu'à 1300 ?
Comment puis-je savoir si mon make s'est correctement effectué ?
Pour le cas ou, voici mon Makefile

# compilateur utilise
CC=gcc #CPP pour le C++ et CC pour le C

CFLAGS=-Wall -W -O2

LDFLAGS=-Wall -O2 -lm -static
#LDFLAGS=-O3 -axW -ipo -mp1 -lm -static

# on inclut tous les headers
INCLUDE_DIR1=../include/includeCVode
INCLUDE_DIR2=../include/myinclude

# EXEC contient le nom des executables a generer.
EXEC=out

# Fichiers sources
SRC= $(wildcard ../source/sourceCVode/*.c) $(wildcard ../source/mysource/*.c) main.c

# Fichiers objets le .c est remplace par un .o
OBJ=$(SRC:.c=.o)

# Regles de compilation:
all: $(EXEC)

$(EXEC): $(OBJ)
	@$(CC) -o $@ $^ $(LDFLAGS)

# Creation des .o a  partir des .c qui se verront appeles par defaut.
%.o: %.c
	@$(CC) -o $@ -c $< -I$(INCLUDE_DIR1) -I$(INCLUDE_DIR2) $(CFLAGS)

clean:
	@rm -rfv $(EXEC) $(OBJ) *~

0
Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006 6
23 août 2006 à 14:03
Je pense que ca plante lors de l'execution de la ligne :

    time -p ./out input.txt $N


Ton script ni ton makefile ne sont en cause à priori. Je pencherais plutot pour ton executable généré par la commande make.

En fait je pense que le nombre que tu transmet à ton executable est trop gros. Regarde dans les sources de ton programme !
0
OK, j'ai trouvé le bug. Je fais N+3 fopen(). Et si N est trop grand, il n'aime pas ça. Comment contrer ce problème ?
0
Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006 6
23 août 2006 à 14:54
Je fais N+3 fopen()


Tu peux être plus précis ?
0
pom > Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006
23 août 2006 à 15:20
Salut, j'ai N domaines et je résoud une équation sur chaque domaine. Je stocke la solution dans un fichier texte. J'ai donc N fichiers de sorties (donc j'ai fait N fopen()). Mais je fais aussi trois autres fopen() où je stocke d'autre choses. Donc je fait N+3 fopen au total. Alors si N est petit ça va, mais si N est grand... mon prgm plante ! Y a-t-il une solution pour éviter ce plantage (en évitant de tout stocker dans un énorme fichier) ?
Merci en tout cas de ta patience.
0
Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006 6 > pom
23 août 2006 à 16:12
Il n'est pas raisonnable d'ouvrir autant de fichiers en même temps.
En générale dans la programmation on essaie de ne pas ouvrir trop de fichiers en même temps.
Donc je conseillerais de revoir la structure de ton programme pour ouvrir tes fichiers l'un après l'autre. Personnellement, j'évite d'ouvrir en même temps plus de 4-5 fichiers simultanément.

Dans ton cas je ne pense pas que tu fasses tes N traitements sur tes domaines en même temps. Donc ouvre tes fichiers un par un (sans oublier des les fermer !). Ton programme n'en sera que plus clair et plus performant.

De plus les OS limites en général le nombre de fichiers pouvants être ouverts simultanément.

Voila.
0
pom > Radek Messages postés 22 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 7 septembre 2006
23 août 2006 à 16:44
Oui, tu as sûrement raison. Je vais changer mes qq lignes de codes alors.
Merci de ta patience
0
regim-fatma-damak
15 avril 2009 à 13:59
télécharger le logiciel de script pour les fichier d'extension SH
0