Rechercher : dans
Par :

[script sh] boucle for

Dernière réponse le 15 avr 2009 à 13:59:33 pom, le 23 aoû 2006 à 13:27:22 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [script sh] boucle for » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...
Bash - Les paramètres VoirIntroduction Les paramètres positionnels Exemple 1 Les paramètres spéciaux Exemple 2 Initialiser des paramètres - La commande "set" - Exemples - La commande "shift" - Exemple 3 Introduction Il est possible de fournir à un script,...

1

pom, le 23 aoû 2006 à 13:28:45

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

Répondre à pom

2

Radek, le 23 aoû 2006 à 13:34:58

Tu es certain que ton make c'est déroulé correctement ?

Répondre à Radek

3

pom, le 23 aoû 2006 à 13:45:07

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) *~

Répondre à pom

4

Radek, le 23 aoû 2006 à 14:03:01

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 !

Répondre à Radek

5

pom, le 23 aoû 2006 à 14:34:31

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 ?

Répondre à pom

6

Radek, le 23 aoû 2006 à 14:54:25

Je fais N+3 fopen()


Tu peux être plus précis ?

Répondre à Radek

7

pom, le 23 aoû 2006 à 15:20:45

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.

Répondre à pom

8

Radek, le 23 aoû 2006 à 16:12:21

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.

Répondre à Radek

9

pom, le 23 aoû 2006 à 16:44:07

Oui, tu as sûrement raison. Je vais changer mes qq lignes de codes alors.
Merci de ta patience

Répondre à pom

10

 regim-fatma-damak, le 15 avr 2009 à 13:59:33

Télécharger le logiciel de script pour les fichier d'extension SH

Répondre à regim-fatma-damak
Collection CommentÇaMarche.net