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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    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
    Points : 6 498
    Points
    6 498
    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 confirmé
    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
    Points : 631
    Points
    631
    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
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    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 éclairé 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
    Points : 771
    Points
    771
    Par défaut
    Pourriez-vous fournir un exemple de la sortie de votre programme?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    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 éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre éclairé 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
    Points : 771
    Points
    771
    Par défaut
    Par sortie du programme, j'entendais ce qu'il affiche (les printf("ici\n"), printf("Paramètre lu...") et autres)...

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    ah, ok
    pour répondre dans l'ordre:

    en plus je comprends pas trop la logique... Pourquoi prendre les arguments à l'envers ??
    Je suis sur que mon dernier paramètre est juste, il me suffit donc de rechercher le début de mon autre paramètre /mnt, et d'assembler ce qui a entre;

    Par sortie du programme, j'entendais ce qu'il affiche (les printf("ici\n"), printf("Paramètre lu...") et autres)...
    Pour le paramètre 4, il me sort le bon paramètre. POur le paramètre 3, il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    j=3;//Normal, puisuqe c'est décrémenté
    i=6;//Normal, puisque le paramètre 7 représente le /dev
    Mais par contre, ce qui ne va pas, c'est qu'on entre donc dans le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    else if(j==3){
    printf("ici\n);
    et qu'il n'y entre pas, puis que le print ne s'affiche pas.

  10. #10
    Membre éclairé 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
    Points : 771
    Points
    771
    Par défaut
    Excusez moi d'insister, mais serait-il possible d'avoir un copier-coller COMPLET de ce qui s'affiche sur la console quand la boucle tourne?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    Trap D 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){ 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.
    Ce changement n'a rien donné, la boucle stoppe toujours avant de commencer son travail de réunification

  12. #12
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as peut-être un débordement de capacité mémoire sur un tableau ou quelque chose de ce style.
    Corrige-le puis corrige aussi tes ralloc, celà fait 2 fois qu'on te le dit. De plus c'est tmp = realloc(... et non pas *tmp = realloc(...
    "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

  13. #13
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben tu peux pas chercher sur -t -o -f -s et \n ??


    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
    for ( i = 1 ; i < nargs ; i++ )
    {
        /* On tombe sur un argument définissant le champ */
        if ( argv[i][0] ==  '-' )
          {
             compteur = 0 ;
             /* On explore les champs suivants */
             for ( j = (i+1) ; j < nargs ; j++ )
               {
                    if ( (argv[j][0] ==  '-') || (strcmp(argv[j], "\n") == 0) )
                       break ;
                    compteur = compteur + 1 ;
               }
             /* Si on a trouvé aucun argument, erreur */
             if ( compteur == 0 )
                  fprintf ( stderr, "Mauvais nombre de paramètres");
             else
              {
                for ( j = 0 ; j < compteur ; j++ )
                   /* Ici on concatène les arguments */
     
                /* et on incrémente le compteur total d'arguments */
                i = i + compteur ;
              }
          }
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    Voici ce que me donne ma console à l'éxécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [florian@192 Prog_principal]$ ./main
    Commande invoquee: ./video 00:01:00 320 240 /mnt/My U3 Drive/230307_1642 /dev/video0 &
    i: 7
    Parametre lu: /dev/video0
    parametre defini n°4: /dev/video0
    j: 3
    i: 6
    [florian@192 Prog_principal]$

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Flophx
    Ce changement n'a rien donné, la boucle stoppe toujours avant de commencer son travail de réunification
    Oui, il arrive qu'il y ait plusieurs bugs dans un programme. On commence par corriger les plus évidents...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    souviron34 ben tu peux pas chercher sur -t -o -f -s et \n ??
    Non, la commande sur streamer est complétée dans le programme video, appelé par le programme main. Le programme main permet de générer autant d'enregistrement vidéo que de cameras connectées, on ne fait que passer des paramètres (résoltion, temps etc...)

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je reviens à la charge :

    c'est la ligne ./video ou la ligne ./streamer que tu décodes ?

    Et dans un cas comme dans l'autre, je ne vois toujours pas pourquoi les prendre à l'envers....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    c'est la ligne ./video qui est décodée

  19. #19
    Membre éclairé 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
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Flophx
    Voici ce que me donne ma console à l'éxécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [florian@192 Prog_principal]$ ./main
    Commande invoquee: ./video 00:01:00 320 240 /mnt/My U3 Drive/230307_1642 /dev/video0 &
    i: 7
    Parametre lu: /dev/video0
    parametre defini n°4: /dev/video0
    j: 3
    i: 6
    [florian@192 Prog_principal]$
    OK, merci. Je vais regarder et je vous tiens au courant.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Points : 64
    Points
    64
    Par défaut
    Bon, j'essaie de comprendre, la fonction realloc est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void *realloc(void *ptr, size_t size);
    Mes deux variables sont déclarées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *nom
    char *tmp
    donc normalement, je suis d'accord que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmp = realloc(nom, sizeof(char*));
    est l'expression logique.

    Mais alors pourquoi me renvoie t-il cette erreur lors de la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     assignment makes pointer from integer without a cast

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