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. #21
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Flophx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     assignment makes pointer from integer without a cast
    Parce que tu as oublie d'inclure <stdlib.h>. Du coup, on se retrouve au comportement par defaut, i.e. on suppose que realloc() retourne un int.

  2. #22
    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 reprends donc :

    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
     
    for ( i = 3 ; i < nargs ; i++ )
    {
        if ( (strstr(argv[i], "/mnt") != NULL) || (strchr(argv[i], "/dev") != NULL) )
          {
             compteur = 0 ;
             /* On explore les champs suivants */
             for ( j = (i+1) ; j < nargs ; j++ )
               {
                    if ( ((strstr(argv[i], "/mnt") != NULL)  &&
                          ((strchr(argv[j], "/dev") != NULL) || 
                           (strcmp(argv[j], "\n") == 0))) ||
                         ((strstr(argv[i], "/dev") != NULL)  &&
                          ((strchr(argv[j], "/mnt") != NULL) || 
                           (strcmp(argv[j], "\n") == 0))) ) 
                    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

  3. #23
    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
    Dans un premier temps, je pense qu'ajouter
    après
    devrait faire en sorte que "ici" s'affiche comme c'est attendu.

  4. #24
    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
    DaZumba
    Parce que tu as oublie d'inclure <stdlib.h>. Du coup, on se retrouve au comportement par defaut, i.e. on suppose que realloc() retourne un int.
    Oui, j'avais effectivement oublié la librairie. C'est déjà ca de réglé, en revanche, la boucle se stoppe toujours. Je vais explorer les autres solutions proposées

  5. #25
    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
    J'ai testé cette solution ne m'a pas permis d'afficher le printf("ici").

    pour la solution de souviron34 avec :

    J'ai des erreurs de cast à la compilation, pourtant j'ai bien inclus la librairie <string.h>.

  6. #26
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par Flophx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmp = realloc(nom, sizeof(char*));
    Pour info, combien de caracteres comptes tu mettre dans tmp ? A vue de nez, pas beaucoup ...

  7. #27
    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
    Je compte faire le schéma suivant:
    tmp <= nom
    nom<= argument
    concaténation(nom, tmp)

    Le nombre de caractère dépend du nom de la clé USB. Je pourrais éventuellement transformer le

    par


  8. #28
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par souviron34
    je reprends donc :

    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
     
    for ( i = 3 ; i < nargs ; i++ )
    {
        if ( (ststr(argv[i], "/mnt") != NULL) || (strchr(argv[i], "/dev") != NULL) )
          {
             compteur = 0 ;
             /* On explore les champs suivants */
             for ( j = (i+1) ; j < nargs ; j++ )
               {
                    if ( ((ststr(argv[i], "/mnt") != NULL)  &&
                          ((strchr(argv[j], "/dev") != NULL) || 
                           (strcmp(argv[j], "\n") == 0))) ||
                         ((ststr(argv[i], "/dev") != NULL)  &&
                          ((strchr(argv[j], "/mnt") != NULL) || 
                           (strcmp(argv[j], "\n") == 0))) ) 
                    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 ;
              }
          }
    }
    Attention, sed -e 's/ststr/strstr/g' je ne connais pas de fonction C ststr(), par contre strstr() oui. Sinon, je garderais une comparaison à "/mnt/" et "/dev/" en vérifiant qu'il s'agit en plus du début de la chaine, au cas où des malins saisissent des chemins du genre /opt/devil ou bien encore /home/myhome/bin/mnthelpers/mySpecialMounts.sh par exemple.

    A+

  9. #29
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par Flophx
    Je pourrais éventuellement transformer le

    par

    Tss tss tss, pas de transformations douteuses. Si on revient à ton besoin initial, le but est de ne faire qu'un argument avec ce qui suit /mnt si il y a éventuellement des espaces. Pourquoi ne pas générer par exemple la chaine spécifiant le point de montage avec les espaces "échappés" par un \ (POSIX compliant).
    Exple:
    prog je\ suis\ tout \seul
    Il n'y a qu'un argv[1] qui vaut "je suis tout seul".

    Voici un exemple de programme pour ton cas avec la ligne de commande ./video :

    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
    94
    95
    96
    97
    98
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void displayProgCall(int argc, char ** argv, int flagErrStream) {
        int i=0;
        FILE * outputStream = flagErrStream ? stderr : stdout;
        while(i<argc) {
            fprintf(outputStream, "%s'%s'", (i==0) ? "\tProgram invocation: " : " ", argv[i]); ++i;
        }
        fprintf(outputStream, "\n");
        i=0;
        while(i<argc) {
            fprintf(outputStream, "argv[%d]: %s\n", i, argv[i]); ++i;
        }
    }
     
    int main(int argc, char ** argv)
    {
     
       if (argc < 6) {
          fprintf(stderr, "Bad number of arguments (must be at least 6)!\n");
          displayProgCall(argc, argv, 1);
          return EXIT_FAILURE;
       } 
       else  {
     
          int i = 0;
     
          char * mntBeginningArg = argv[4]; /* /mnt/... */
          char * mntVerify = strstr(mntBeginningArg, "/mnt/");
          char * newMntParam = NULL;
     
          /* Predicate for the moment, might be at arg above 5*/
          int startIdxDev = 5;
          char * devBeginningArg = argv[startIdxDev];
          char * devVerify = strstr(devBeginningArg, "/dev/");
     
          if (mntVerify == NULL || (mntVerify && mntVerify != mntBeginningArg)) {
             fprintf(stderr, "Your 4 arg must specify the mount point directory! (shall contains and begin by /mnt/)\n");
             displayProgCall(argc, argv, 1);
             return EXIT_FAILURE;
          }
     
          /* OK we have found a correct mount point at parameter 4 */
          /* Let's search the peripheral ID now */
     
          while (devVerify == NULL && startIdxDev < (argc-1)) {
              ++startIdxDev;
              devBeginningArg = argv[startIdxDev];
              devVerify = strstr(devBeginningArg, "/dev/");
          }
     
          if (devVerify == NULL || ( devVerify && (startIdxDev == (argc-1)) && (devVerify != devBeginningArg) ) ) {
              fprintf(stderr, "Device directory not found!\n");
              displayProgCall(argc, argv, 1);
              return EXIT_FAILURE;
          }
     
          /* OK, it means in our case that there are startIdxDev-4-1 spaces to drop for /mnt args */
          size_t len = 0u;
          for (i=4; i<startIdxDev; ++i) {
             len += strlen(argv[i]);
             len += 2;    
          }
     
          newMntParam = malloc(len);
          if (newMntParam) {
            for (i=4; i<startIdxDev; ++i) {
              strcat(newMntParam, argv[i]);
              if (i<(startIdxDev-1)) {
                  strcat(newMntParam, "\\ ");
              }
            }
          } else {
             fprintf(stderr, "Allocation failure for newMntParam\n");
             return EXIT_FAILURE;
          }
     
          puts("THE NEW COMMAND TO BE RUN SHOULD BE:");
     
          for(i=0; i<4; ++i) {
              printf("%s ", argv[i]); fflush(stdout);
          }
          printf("%s ", newMntParam); fflush(stdout);
          for(i=startIdxDev; i<argc; ++i) {
              printf("%s ", argv[i]); fflush(stdout);
          }
          puts("");   
     
     
          free(newMntParam);
     
       }
       /* else nothing to do */ 
     
       return EXIT_SUCCESS;
    }
    Il faut penser à d'éventuels arguments comme le -c situé entre point et périphérique de montage pour le cas de la ligne de commande ./streamer. C'est laissé en exo.

    Au passage, stdlib.h est un fichier d'entête et non une "librairie" .

    A+

  10. #30
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    nb: pourquoi ne pas utiliser getopt c'est posix
    ici
    While I breath, I hope.

  11. #31
    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
    De façon simple, on pourrait pas essayer de voir pourquoi ma boucle stoppe, sans chercher une solution autre (non pas qu eje dénigre l'autre, mais afin que je comprenne ce qui cloche)?

  12. #32
    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
    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
    Tu as peut être oublié <stdlib.h> ? Montre le code réel. (Je suggère l'usage d'un snippet)

    Avec sizeof char*, tu ne vas pas aller très loin. Tu sais vraiment ce que tu fais ?

    D'autre part, realloc() fonctionne soit à partir de NULL, soit à partir de l'adresse d'un bloc déja alloué par<malloc(), calloc() realloc() ou (POSIX.1) strdup().

    Tel quel, le comportement est indéfini.
    Pas de Wi-Fi à la maison : CPL

  13. #33
    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
    D'autre part, realloc() fonctionne soit à partir de NULL, soit à partir de l'adresse d'un bloc déja alloué par<malloc(), calloc() realloc() ou (POSIX.1) strdup().
    Mes variables sont mises à NULL dès le départ, je peux donc utiliser realloc.

    Néanmoins, pourquoi la boucle s'arrete-t-elle?? S'il y a un comportement indéfini ou autre, cela génèrera pas plutot une erreur dans la console, et pas "je m'arrete et je rends la main"?
    Le code posté est complet!! Il manque une fonction, mais elle n'influence en rien le comportement du programme.

  14. #34
    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
    Le code posté est complet!!
    Alors je peux le compiler.
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:3: error: `NULL' undeclared here (not in a function)
    main.c:6: error: syntax error before "for"
    main.c:16: error: syntax error before string constant
    main.c:16: warning: type defaults to `int' in declaration of `printf'
    main.c:16: warning: function declaration isn't a prototype
    main.c:16: warning: conflicting types for built-in function 'printf'
    main.c:16: warning: data definition has no type or storage class
    main.c:17: error: syntax error before '--' token
    main.c:18: error: syntax error before string constant
    main.c:18: warning: type defaults to `int' in declaration of `printf'
    main.c:18: warning: function declaration isn't a prototype
    main.c:18: warning: data definition has no type or storage class
    main.c:34: warning: type defaults to `int' in declaration of `nom'
    main.c:34: error: conflicting types for 'nom'
    main.c:3: error: previous definition of 'nom' was here
    main.c:34: warning: implicit declaration of function `realloc'
    main.c:34: warning: implicit declaration of function `strlen'
    main.c:34: error: `argv' undeclared here (not in a function)
    main.c:34: error: `i' undeclared here (not in a function)
    main.c:34: warning: initialization makes pointer from integer without a cast
    main.c:34: error: initializer element is not constant
    main.c:34: warning: data definition has no type or storage class
    main.c:36: error: syntax error before "if"
    main.c:39: error: syntax error before string constant
    main.c:39: warning: type defaults to `int' in declaration of `sprintf'
    main.c:39: warning: function declaration isn't a prototype
    main.c:39: warning: conflicting types for built-in function 'sprintf'
    main.c:39: warning: data definition has no type or storage class
    main.c:40: warning: type defaults to `int' in declaration of `free'
    main.c:40: warning: parameter names (without types) in function declaration
    main.c:40: warning: data definition has no type or storage class
    main.c:41: error: syntax error before '&' token
    main.c:41: warning: type defaults to `int' in declaration of `test_parametres'
    main.c:41: warning: function declaration isn't a prototype
    main.c:41: warning: data definition has no type or storage class
    main.c:42: error: syntax error before string constant
    main.c:42: warning: type defaults to `int' in declaration of `printf'
    main.c:42: warning: function declaration isn't a prototype
    main.c:42: warning: data definition has no type or storage class
    main.c:43: error: syntax error before '--' token
    main.c:44: error: syntax error before string constant
    main.c:44: warning: type defaults to `int' in declaration of `printf'
    main.c:44: warning: function declaration isn't a prototype
    main.c:44: warning: data definition has no type or storage class
    main.c:56: warning: type defaults to `int' in declaration of `nom'
    main.c:56: error: redefinition of 'nom'
    main.c:34: error: previous definition of 'nom' was here
    main.c:56: error: redefinition of 'nom'
    main.c:34: error: previous definition of 'nom' was here
    main.c:56: warning: initialization makes pointer from integer without a cast
    main.c:56: error: initializer element is not constant
    main.c:56: warning: data definition has no type or storage class
    main.c:58: error: syntax error before "if"
    main.c:61: error: syntax error before string constant
    main.c:61: warning: type defaults to `int' in declaration of `sprintf'
    main.c:61: warning: function declaration isn't a prototype
    main.c:61: warning: data definition has no type or storage class
    main.c:62: error: syntax error before string constant
    main.c:62: warning: type defaults to `int' in declaration of `printf'
    main.c:62: warning: function declaration isn't a prototype
    main.c:62: warning: data definition has no type or storage class
    main.c:74: error: syntax error before '&' token
    main.c:74: warning: type defaults to `int' in declaration of `test_parametres'
    main.c:74: warning: function declaration isn't a prototype
    main.c:74: warning: data definition has no type or storage class
    main.c:75: error: syntax error before string constant
    main.c:75: warning: type defaults to `int' in declaration of `printf'
    main.c:75: warning: function declaration isn't a prototype
    main.c:75: warning: data definition has no type or storage class
    main.c:76: error: syntax error before '--' token
    main.c:77: error: syntax error before string constant
    main.c:77: warning: type defaults to `int' in declaration of `printf'
    main.c:77: warning: function declaration isn't a prototype
    main.c:77: warning: data definition has no type or storage class
    Process terminated with status 1 (0 minutes, 6 seconds)
    28 errors, 46 warnings
    Oué ! Super complet le code !

    On a pas que ça à faire d'essayer de deviner ce qui manque. Poste du code compilable, ou alors ne perd pas ton temps à demander de l'aide. On est pas tes esclaves...
    Pas de Wi-Fi à la maison : CPL

  15. #35
    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
    Citation Envoyé par Foobar1329
    Hello,



    Attention, sed -e 's/ststr/strstr/g' je ne connais pas de fonction C ststr(), par contre strstr() oui. Sinon, je garderais une comparaison à "/mnt/" et "/dev/" en vérifiant qu'il s'agit en plus du début de la chaine, au cas où des malins saisissent des chemins du genre /opt/devil ou bien encore /home/myhome/bin/mnthelpers/mySpecialMounts.sh par exemple.

    A+
    désolé mes doigts on fourché.....

    J'ai corrigé....
    "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

  16. #36
    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
    Bien, je reposte donc mon code...

    video.c:
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    #include "video.h"
     
    /**
    **Cette fontion permet de vérifier qu'il y a bien le nombre de paramètres nécessaires
    **à  l'initialisation de la vidéo
    **/
    void test_parametres(char **a, char *b){
     
    	if(b==NULL){
    		printf("Erreur de chargement sur %s\n", *a);}
    	else{
    		*a=b;
    	}
    }
     
    /**
    **Permet de composer la commande qui permet de déclencher la video.
    **/
    char *commande_acquisition(char *param[NB_PARAM]){
     
    	char *commandeLog;
     
    	sprintf(commandeLog, "streamer -t %s -s %sx%s -r 24 -o %s.yuv -c %s",param[0], param[1], param[2],param[3],param[4]);
    	printf("Commande exécutée: '%s'\n", commandeLog);
     
     
    return commandeLog;
    }
     
    /*
    Fonction main qui permet de créer un fichier vidéo
    */
    int main(int argc,char *argv[]){
     
    	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);
    		}
     
    	}
     
    	return 0;
    }
    video.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdio.h>
    #include <string.h>
    #define NB_PARAM 5
    int i;
    char *parametres[NB_PARAM]={"duree", "width", "height", "nomDossier", "device"};
    la ligne de commande à tester est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./video 00:01:00 320 240 /mnt/My U3 drive /dev/video0

  17. #37
    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
    Et autre question:
    POur compiler je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc main.c -o main
    Je n'ai pas autant de ligne dans mon compilateur... Je dois utiliser differemment le compilateur (i.e avec d'autres options?)

  18. #38
    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
    Bon ben on a une déjà belle erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *commande_acquisition(char *param[NB_PARAM]){
     
    	char *commandeLog;
     
    	sprintf(commandeLog, "streamer -t %s -s %sx%s -r 24 -o %s.yuv -c %s",param[0], param[1], param[2],param[3],param[4]);
    	printf("Commande exécutée: '%s'\n", commandeLog);
     
     
    return commandeLog;
    }
    Ton pointeur commandeLog n'est pas initialisé, tu écris dans la nature, pas étonnant que ça plante !

    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
    char *commande_acquisition(char *param[NB_PARAM]){
     
              // au hasard un peu, il faut voir grand
    	char *commandeLog = malloc(256);
              // on teste le retour
            if (commandeLog != NULL)
            {
    	sprintf(commandeLog, "streamer -t %s -s %sx%s -r 24 -o %s.yuv -c %s",param[0], param[1], param[2],param[3],param[4]);
    	printf("Commande exécutée: '%s'\n", commandeLog);
     
            }
             else
                fprintf(stderr, "Pb alloc mémoire\n");	
    return commandeLog;
    }
    Il faut que tu regardes si tu disposes d'un sprintf sécurisé qui ne dépasse pas la taille du buffer de 256 caractères.
    "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

  19. #39
    Membre actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Flophx
    Et autre question:
    POur compiler je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc main.c -o main
    Je n'ai pas autant de ligne dans mon compilateur... Je dois utiliser differemment le compilateur (i.e avec d'autres options?)
    Tiens pour bien configurer ton compilateur
    http://emmanuel-delahaye.developpez....tm#cfg_compilo

  20. #40
    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
    OUi, celle là j ela connaissais, je l'avais pas encore corrigée; Mais dans le main cette fonction n'apparait pas!!

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