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

C Discussion :

Boucle for qui se bloque


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut Boucle for qui se bloque
    Bonjour, je vous laisse un topic sur un truc qui m'était encore jamais arrivé.... Ma boucle for se bloque!!

    D'abord, voici mon code:

    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
     
    int j=4;
    	char* nom=NULL;
    	char *tmp=NULL;
     
    	for(i=argc-1; i>0; i--){
     
    		printf("i: %d\n", i);
    		if(j==4){
     
    			printf("Parametre lu: %s\n", argv[i]);
     
    			if(strncmp(argv[i],"/dev/",5)==0){
     
    				test_parametres(&parametres[j],argv[i]);
    				printf("parametre defini n°%d: %s\n", j, parametres[j]);
    				j--;
    				printf("j: %d\n",j);
    			}
    			else{
    			}
     
    		}
     
    		else if(j==3){
     
    			printf("ici");
    			if(strncmp(argv[i],"/mnt/",5)==0){
     
    				*tmp = realloc(nom, sizeof(char*));
     
    				if(tmp!=NULL){
    					strcpy(tmp,nom);
    					*nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2));
     
    					if(nom!=NULL){
     
    						strcpy(nom,argv[i]);
    						sprintf(nom,"%s%s",tmp);
    						free(tmp);
    						test_parametres(&parametres[j],nom);
    						printf("parametre defini n°%d: %s\n", j, parametres[j]);
    						j--;
    						printf("j: %d\n",j);
    					}
    				}
     
    			}
     
    			else{
     
    				*tmp = realloc(nom, sizeof(char*));
     
    				if(tmp!=NULL){
    					strcpy(tmp,nom);
    					*nom=realloc(nom, (strlen(argv[i])+strlen(tmp)+2));
     
    					if(nom!=NULL){
     
    						strcpy(nom,argv[i]);
    						sprintf(nom,"%s%s",tmp);
    						printf("Construction nom: %s\n", nom);
    					}
    				}
     
     
    			}	
     
    		}
     
     
    		else{
    			free(nom);
    			test_parametres(&parametres[j],argv[i]);
    			printf("parametre defini n°%d: %s\n", j, parametres[j]);
    			j--;
    			printf("j: %d\n",j);
    		}
     
    	}
    Le principe de la boucle est assez simple: j'ai un programme qui doit utiliser un certain nombre de paramètres, qui doivent être au nombre de 5. L'un des paramètres contient un point de montage sur une clé USB, dont le nom est inconnu. Comme certainbs noms ont des espaces " ", ils sont comptés en tant que paramètre dans la commande. Afin d'éviter cela, je cherche à détecter ces erreurs, et à reconstituer le bon nom.

    Je passe donc les paramètres en sens inverse pour trouver:
    - la caméra, dont le nom commence par /dev
    - le point de montage, dont le nom commence par /mnt

    Comme les paramètres sont ordonnés, je sias que si le paramètre 3 ne commence pas par /mnt, c'est qu'il y a des paramètres passés qui n'en sont pas, et je cherche à reconstituer le nom.

    Le problème est le suivant:
    La boucle se lance, il récupère le paramètre 4, décrémente le compteur à 3 pour trouver le point de montage.... Et au lieu de rentrer dans le cas

    Pour commencer la reconstitution, la boucle s'arrete là..... Il y a un printf pour vérifier si la boucle continue, mais queneni!!
    Et comme pour le moment le main ne contient que ca, la console rend la main!!

    Des idées pour ce problème bizarre??

    Si quelqu'un a une idée

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ton problème est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tmp = realloc(nom, sizeof(char*));
     
    				if(tmp!=NULL){
    					strcpy(tmp,nom);
    Il faut simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tmp = realloc(nom, sizeof(char*));
     
    				if(tmp!=NULL){
    					nom = tmp;
    Si le realloc réussi, tout le contenu de nom est recopié à l'adresse de tmp, et l'ancienne valeur de nom devient inexpoitable, c'est pour cleà que tu perds la main.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    premierement, si tu as des espaces dans un de tes parametres, tu met la totalité du parametre entre guillemets


    ./prog "/dev/truc bonjour blabla" "/mnt/jsaispasquoi" etc


    Ensuite, quand tu fais if (test) {effet} else {}
    tu peux te passer du else

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Juste deux remarques sur ce que vous m'avez dit:

    1/ c'est un autre programme qui construit la ligne de commande, notamment avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(dossier,"%s/%02d%02d%02d_%02d%02d",repertoire, jour, mois, annee, heure, minute);
    Et je ne peux pas mettre les guillemets salvateurs!! (je dis ca parce que c'était la solution la plus mieux!)

    2/ La boucle s'interrompt à cause de la ligen de code, soit.. Mais pourquoi le printf("ici\n") ne s'affiche pas alors qu'il le devrait, vu qu'il entre dans ce cas là...
    Ca veut dire qu'il "sent" l'erreur et qu'il l'interrompt en anticipation, sans entrer dans le cas??

  5. #5
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Pourriez-vous fournir un exemple de la sortie de votre programme?

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    cela donne, avec la clé USB utilisée (et qui pose problème) une sortie du programme initial:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./video 00:01:00 340x240 /mnt/My U3 drive/230307_1610 /dev/video0
    pour une exécution dans le programme vidéo qui donnerait (normalement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    streamer -t 00:01:00 - s 20x240 - f raw - o /mnt/My U3 drive/230307_1610/video.yuv -c /dev/video0
    Mais les espaces de la clé contrarie tout ca et le transforme en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    streamer -t 00:01:00 - s 20x240 - f raw - o /mnt/My.yuv -c U3
    ce qui est pas cool

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    en plus je comprends pas trop la logique... Pourquoi prendre les arguments à l'envers ??

    Enfin bon, c'que j'en dit...

    Mais par contre c'est n'importe quoi avec les realloc et les pointeurs nom et tmp....

  8. #8
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Par sortie du programme, j'entendais ce qu'il affiche (les printf("ici\n"), printf("Paramètre lu...") et autres)...

Discussions similaires

  1. Boucle for qui ne boucle pas !
    Par polothentik dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 18/04/2008, 10h50
  2. Boucle FOR qui arrete le script
    Par yves_fuji dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 16/04/2008, 14h06
  3. Boucle for qui fait un tour en trop
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/03/2008, 11h15
  4. probleme boucle for et onrelease bloqué
    Par ritepac dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 12/02/2008, 09h48
  5. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59

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