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 :

reconnaitre une image de fomat .ppm en C


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut reconnaitre une image de fomat .ppm en C
    Bonjour,

    Mon problème est le suivant! Je viens de terminer mon projet maintenat avec toutes les fonctions! J'aimerais quand meme améliorer mon programme encore mieux! Mon programme est programmé de telle facon et c'est le but qu'il ne travaille que avec des images format .ppm! Alors pour cela j'aimerais pouvoir controler l'orsque l'utilisateur entre un nom de fichier à ouvrir que ma fonction puisse reconaitre non selement si le fichier existe mais galement si le format correspond car comme ca elle seras surtout utile à la sauvegarde l'orsque l'utilisateur donnera un nouveau nom de fichier dans lequel sous lequel il sera sauvegardé! Et si il se trompe pour écrire .ppm alors il y auaas un message d'erreur!

    Voici ce que j'ai à présent mais cela est très faible!

    if ((fp = fopen(nom_Fichier_ouverture, "r")) == NULL)
    {
    printf("Erreur a l'ouverture de l'image ...\n");
    exit(-1);
    }
    else
    printf("Image ouverte avec succes ...\n");

    Comme vous le voyez dans ce cas si le format serais faux il y aura quand meme un message d'erreur mais pour la sauvegarde ce système ne marche pas car un nouveau fichier doit etre créer et alors le format entré au clavier n'est pas controlé avec cette méthode! Sauriez vous m'aidez svp? MERCI

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    Citation Envoyé par specification
    Each PPM image consists of the following:

    1. A "magic number" for identifying the file type. A ppm image's magic number is the two characters "P6".
    tu récupere les deux premiers octets
    si il sont différents de P6 erreur

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Fao,
    Citation Envoyé par scriptoff
    tu récupere les deux premiers octets
    si il sont différents de P6 erreur
    Et s'ils sont égaux à P6, il y a une chance pour que ce soit le bon format. Une chance seulement, pas une certitude.

  4. #4
    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
    si c'est l'extension du nom que tu veux vérifier, c'est simple :


    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
     
    #include <string.h>
     
    .....
     
    char *p=NULL ;
    char *p0 =NULL ;
     
    ....
     
    /* Cherche si il y a une extension déjà dans le nom */
     
    p = strrchr ( nom_Fichier_ouverture, '.' );  
     
     
    /* Si il n'y en a pas, on doit allouer de la place pour copier le nom et ajouter l'extension */
     
    if ( p == NULL )
      { 
          p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); /* 4 pour l'extension, 1 pour le caractère de fin de chaine */
          if ( p0 != NULL )
            {
               sprintf ( p0, "%s.ppm", nom_Fichier_ouverture );
     
                /* Met le pointeur comme étant le début du nom */
                p = p0 ;
            }
      }
    /* Si l'extension existait, vérifie qu'il n'y ait pas de fautes */
    else
      {
          if ( strlen(p) >= 4 ) /* Si il y a au moins 4 caractères */
            {
                if ( strcmp ( p, ".ppm" ) != 0 )  /* Si ce n'est pas la bonne */
                    strcpy ( p, ".ppm" );
     
                /* Met le pointeur comme étant le début du nom */
                p = nom_Fichier_ouverture ;
            }
          else
            {
                /* L'extension est trop courte, il faut allouer de nouveau */
     
                p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); 
                if ( p0 != NULL )
                  {
                      sprintf ( p0, "%s.ppm", nom_Fichier_ouverture );
     
     
                     /* Met le pointeur comme étant le début du nom */
                      p = p0 ;
                  }
            }
      }
     
    /* Maintenant on est prêt, on a un nom de fichier complet, indiqué par p  */
     
    if ( p != NULL )
      {
    .............
     
         /* On libèrera la mémoire une fois qu'on a fini, si on est passé par une allocation */
     
         if ( p == p0 )
           {
              free(p0);
              p0 = NULL ;
           }
      }

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    Citation Envoyé par droggo
    Fao,

    Et s'ils sont égaux à P6, il y a une chance pour que ce soit le bon format. Une chance seulement, pas une certitude.
    Ta remarque est intèressante mais ne correspond pas à ce qu'il demande , enfin je crois .
    Ainsi il demande seulement si l'utilisateur en cas de mauvaise saisie vérifie juste si cela pourrait corresponde a un fichier .ppm .
    En aucun cas il a demandé de traiter le cas ou le fichier est abimé .

    Et si il se trompe pour écrire .ppm alors il y auaas un message d'erreur!

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    500 OOPS
    desolé , double poste

  7. #7
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut rebonjour :)
    MERCI beaucoup à tous! Alors ce que vous avez fait souviron34 est fabuleux! Il y a juste un problème encore! :S Je sais je suis un sacré cas mais nous en cours on a pas encore vu les malloc et je ne comprends pas ce système! N0existe t'il pas une autre méthode peut etre?

    Car cela: p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) );

    je ne comprends pas du tout!

    Ou si vous ne voyez pas d'autresméthodes sauriez vous me donner des explications suivantes?

    Et que veut dire strrchr?

    Est -e que signifie que l'on cherce un string?

    [-mod- merci de ne pas ecorcher les pseudos... Corrigé]

  8. #8
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut rebonjour
    MERCI également à scriptoff mais le problème est que un fichier .ppm contient également très souvent P3 et pour d'abord pouvoir controler si on a P3 dans le fichier il faudrait vérifier si l'utilisateur ne s'est pas trompé en entrant le nom de fichier!

    [-mod- merci de ne pas ecorcher les pseudos... Un peu plus d'attention STP. Corrigé]

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Luo,
    Citation Envoyé par scriptoff
    Ta remarque est intèressante mais ne correspond pas à ce qu'il demande , enfin je crois .
    Ainsi il demande seulement si l'utilisateur en cas de mauvaise saisie vérifie juste si cela pourrait corresponde a un fichier .ppm .
    En aucun cas il a demandé de traiter le cas ou le fichier est abimé .
    Je n'ai pas parlé de fichier abimé ou pas.

    Rien n'interdit qu'un fichier n'ayant rien à voir avec le format désiré commence par les 2 caractères P6, alors que ton message prenait cela comme une preuve de validité.

  10. #10
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut hehe ;)
    hehe ben alors je m'excuse Mr! Mais c'est un truc o?u j'ai un peu de mal en ce qui concerne pour reconnaitre le format! Je cherche depuis quelques temps et je n'abouit à rien! Le reste j'ai tout

  11. #11
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut bonjour souviron34
    Je viens de tout compiler et l'erreur d'avant c'était une petite betise! En tout cas maintenat si jemets un nom correct avec le bon format il me mrque format correct mais si fais exprès une erreur dans le format ou j'oublie le point mon programme débugge!

    Sauriez vous m'aidez?

    Voici le 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
    #include <string.h>
     
    main ()
    {
       char *p=NULL ;
       char *p0 =NULL ;
       char nom_Fichier_ouverture[20];
     
       printf("Entrez un nom de fichier: ");
       scanf("%s",nom_Fichier_ouverture);
       /* Cherche si il y a une extension déjà dans le nom */
       p = strrchr ( nom_Fichier_ouverture, '.' );  
     
       /* Si il n'y en a pas, on doit allouer de la place pour copier le nom et ajouter l'extension */
       if ( p == NULL )
       { 
          *p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); /* 4 pour l'extension, 1 pour le caractère de fin de chaine */
          if ( p0 != NULL )
          {
             sprintf ( p0, "%s.ppm", nom_Fichier_ouverture );
             /* Met le pointeur comme étant le début du nom */
             p = p0 ;
          }
       }
       /* Si l'extension existait, vérifie qu'il n'y ait pas de fautes */
       else
       {
          if ( strlen(p) >= 4 ) /* Si il y a au moins 4 caractères */
          {
             if ( strcmp ( p, ".ppm" ) != 0 )  /* Si ce n'est pas la bonne */
                strcpy ( p, ".ppm" );
     
             /* Met le pointeur comme étant le début du nom */
             p = nom_Fichier_ouverture ;
             printf("format correct");
          }
          else
          {
             /* L'extension est trop courte, il faut allouer de nouveau */
     
             *p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); 
             if ( p0 != NULL )
             {
                sprintf ( p0, "%s.ppm", nom_Fichier_ouverture );
                printf("format incorrect");
     
                /* Met le pointeur comme étant le début du nom */
                p = p0 ;
             }
          }
       }
     
       /* Maintenant on est prêt, on a un nom de fichier complet, indiqué par p  */
       if ( p != NULL )
       {
          /* On libèrera la mémoire une fois qu'on a fini, si on est passé par une allocation */
          if ( p == p0 )
          {
             free(p0);
             p0 = NULL ;
          }
       }
    }

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    Citation Envoyé par droggo
    Luo,

    Je n'ai pas parlé de fichier abimé ou pas.

    Rien n'interdit qu'un fichier n'ayant rien à voir avec le format désiré commence par les 2 caractères P6, alors que ton message prenait cela comme une preuve de validité.

    Comme dirais mon prof de math :
    "c'est bon , je ferme ma gueule ".

  13. #13
    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
    Oui quans tu alloues p0 tu as mis une étoile en trop dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          *p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); /* 4 pour l'extension, 1 pour le caractère de fin de chaine */
     
    ....
             *p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); 
    ...
    c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); /* 4 pour l'extension, 1 pour le caractère de fin de chaine */
     
    ....
              p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) ); 
    ...
    qu'il faut mettre....


    Ensute, quand tu dis :

    Citation Envoyé par romain1986
    Et que veut dire strrchr?
    En fait la fonction strchr va chercher la première occurence du caractère spécifié. La fonction strrchr va chercher la dernière occurence du caractère...

    Voir les man pages :

    http://www.linux-kheops.com/doc/man/...strrchr.3.html

    Ensuite, quand tu dis :

    Citation Envoyé par romain1986
    Car cela: p0 = malloc ( (strlen(nom_Fichier_ouverture)+4+1) );

    je ne comprends pas du tout!
    strlen() est une fonction qui calcule la longueur d'une chaîne de caractères
    (voir http://www.linux-kheops.com/doc/man/.../strlen.3.html).

    malloc() est une fonction qui alloue un certain nombre d'octets en mémoire (voir http://www.linux-kheops.com/doc/man/.../malloc.3.html). Tu lui passe un nombre d'octes à allouer, et elle va chercher dans la mémoire du système à quel emplacement elle peut trouver tant d'octets consécutifs. Quand elle a trouvé, elle te les réserve, et te renvoie l'adresse de début.

    Donc ce que je faisais dans cette ligne c'était demander un bloc qui fasse (la longueur du nom + 4 caractères (pour .ppm) + 1 (pour le caractère '\0' de fin de chaine). Et je stockais l'adresse de retour dans p0.


    Maintenant, si tu n'as pas encore vu ces fonctions, mais que tu as vu les pointeurs, tu peux t'en sortir comme ceci :

    • a) pour la fonction strrchr :

      tu peux remplacer par une boucle :


      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      for ( i = 0 ; i < strlen(nom_Fichier_Ouverture) ; i++ )
         if ( nom_Fichier_Ouverture[i] == '.' )
             p = &(nom_Fichier_Ouverture[i]) ;
    • b) Pour la fonction malloc :

      si tu as dimensionné ton nom à 20 comme dans ton programme, tu peux dimensionner une chaîne à 25.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
       
      char chaine[25] ;
       
      .... 
       
                 sprintf ( chaine, "%s.ppm", nom_Fichier_ouverture );
                  printf("format incorrect");
                  p0 = &chaine ;


    Mais si tu n'as pas encore vu les pointeurs, ni strlen, ni strchr, ni malloc, tu peux t'en tirer comme ceci : :

    A la place des p et p0, tu mettras un entier :

    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
     
    int depart = -1 ;
    char NouveauNom[25] ;
     
    for ( i = 0 ; i < 20 ; i++ )
       {
          if ( nom_Fichier_Ouverture[i] == '/0' ) /* Fin de chaine */
             break ;
     
          if ( nom_Fichier_Ouverture[i] == '.' )
              depart = i  ;
        }
     
    if ( depart < 0 )   /* On n'a pas trouvé d'extension */
       {
           sprintf ( NouveauNom, "%s.ppm", nom_Fichier_Ouverture );
       }
    else
      {
          /* On recopie le nom dans le nouveau nom */
     
         sprintf ( NouveauNom, nom_Fichier_Ouverture );
     
         /* Là on force à tous les coups l'extension pour être la bonne */
     
         sprintf ( &(NouveauNom[depart+1], "%s", "ppm" );
      }

    NOTE : mon pseudo est souviron34 et non souvenir34

  14. #14
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut rebonjour souviron34 :-)
    Tout d'abord mille excuses pour l'incompréhension dans votre nom Et MERCI pour tout franchement! Tout fonctionne comme je peux le constater avec le dernier système que vous m'avez proposé sans malloc et sans strlen, strchr et str!

    Et bien il y a juste une chose que j'aimerais que vous me dites alors encore! Si ce n'est pas trop demandé! Moi j'ai vu les pointeurs mais pas les mallocs et le reste que vous avez noté! Est ce qu'il vous serait possible de me donner un code entier avec les pointeurs pour vérifier le format! Je sais que l'on vient just de voir les fonctionalités strcmp et strcpy mais pas plus!

    Car cela est bien mais moi le strlen je ne connais pas Et de plus je me demandais s'il n'y avait pas plus dans le code pour vérifier le format du fichier que ces 3 lignes?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for ( i = 0 ; i < strlen(nom_Fichier_Ouverture) ; i++ )
       if ( nom_Fichier_Ouverture[i] == '.' )
           p = &(nom_Fichier_Ouverture[i]) ;

    Et ici j'aurais aussi également des questions! :S Je dois vous déranger!

    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
     
    int depart = -1 ;
    char NouveauNom[25] ;
     
    for ( i = 0 ; i < 20 ; i++ )
       {
          if ( nom_Fichier_Ouverture[i] == '/0' ) /* Fin de chaine */
             break ;
     
          if ( nom_Fichier_Ouverture[i] == '.' )
              depart = i  ;
        }
     
    if ( depart < 0 )   /* On n'a pas trouvé d'extension */
       {
           sprintf ( NouveauNom, "%s.ppm", nom_Fichier_Ouverture );
       }
    else
      {
          /* On recopie le nom dans le nouveau nom */
     
         sprintf ( NouveauNom, nom_Fichier_Ouverture );
     
         /* Là on force à tous les coups l'extension pour être la bonne */
     
         sprintf ( &(NouveauNom[depart+1], "%s", "ppm" );
      }
    Mais vous notez toujours sprintf je vois! Que signifie cela! ET je voulais également demandé s'il était possible de me dire pourquoi quand je mais au lien de sprintf le printf que j'ai de droles de symboles comme réponse dans la fenêtre DOS! Est ce que je pourais noter au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( depart < 0 )   /* On n'a pas trouvé d'extension */
       {
           sprintf ( NouveauNom, "%s.ppm", nom_Fichier_Ouverture );
       }
    comme ceci pour avoir un message à l'écran au moins que me dise si le format est correct ou pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( depart < 0 )   /* On n'a pas trouvé d'extension */
       {
           sprintf ( NouveauNom, "%s.ppm", nom_Fichier_Ouverture );
           printf("pas d'extension alors on a ajouté .ppm");
       }
    et donc ici sous le dernier sprintf je pourrais ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* Là on force à tous les coups l'extension pour être la bonne */
     
         sprintf ( &(NouveauNom[depart+1], "%s", "ppm" );
         printf("format correct");
      }
    Et encore une dernière chose si vous pourriez m'expliquez encore un peu plus en détail comment fonctionne votre programme! Il est vraiment tres bien et je comprends presque tout mais juste un peu de problème pour comprendre ces plusieures lignes là! Car je vais devoir présenter le projet devant une classe à l'unif et oui je tiens à bien comprendre ce qui se passe étape par étape! Car le truc du sprintf me travaille un peu! Car si j'enlève le s devant alors il m'affiche 2 caractères bizarres à l'écran et oui ce qui est noté derrière je ne suis pas certain d'avoir compris à 100% pour cela si vous auriez encore un tout petit peu de temps à consacrer pour moi je serais trop content

    MERCI déjà d'avance pour tout ce que vous avez fait

    [-mod- Attention à utiliser correctement les balises de code. C'était l'embrouille, j'ai tout remis droit...]

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    NOTE : mon pseudo est souviron34 et non souvenir34
    J'avais vu ça. J'ai fait les corrections.

  16. #16
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par souviron34
    tu peux remplacer par une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for ( i = 0 ; i < strlen(nom_Fichier_Ouverture) ; i++ )
       if ( nom_Fichier_Ouverture[i] == '.' )
           p = &(nom_Fichier_Ouverture[i]) ;
    Je ne sais pas à quel point l’optimiseur du compilateur est intelligent, mais je déconseille fortement de mettre l’appel d’une fonction dans la condition de sortie de la boucle for.
    Il serait plus judicieux de passer par une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int sz = strlen(nom_Fichier_Ouverture);
     
    for ( i=0; i<sz; i++ )
    {
     
    }

  17. #17
    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
    Citation Envoyé par crocodilex
    Je ne sais pas à quel point l’optimiseur du compilateur est intelligent, mais je déconseille fortement de mettre l’appel d’une fonction dans la condition de sortie de la boucle for.
    Il serait plus judicieux de passer par une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int sz = strlen(nom_Fichier_Ouverture);
     
    for ( i=0; i<sz; i++ )
    {
     
    }
    c'est vrai, mais vu le niveau, on n'en est pas à parler d'optimisation.....

    Vu que le PO n'a même pas encore vu strlen de toutes façons...



    • Citation Envoyé par romain1986
      ...
      Car cela est bien mais moi le strlen je ne connais pas Et de plus je me demandais s'il n'y avait pas plus dans le code pour vérifier le format du fichier que ces 3 lignes?

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      for ( i = 0 ; i < strlen(nom_Fichier_Ouverture) ; i++ )
         if ( nom_Fichier_Ouverture[i] == '.' )
             p = &(nom_Fichier_Ouverture[i]) ;
      Ceci ne vérfiie pas le format du fichier.. Cela fait juste stocker (si cela existe) l'adresse du caractère contenant un point (si il y en a plusieurs cela stockera le dernier).

      Le reste du code donné en premier restait inchangé, sauf à remplacer les malloc par les lignes indiquées dans le même paragraphe.

      La fonction strlen renvoie la longueur de la chaine. Si tu ne l'a pas vu, cela revient à faire ce que je faisais dans la dernière boucle :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
      int longueur=0 ;
       
      for ( i = 0 ; i < 20 ; i++ )
        if ( nom_Fichier_Ouverture[i] == '\0' )
           {
              longueur = i ;
              break ;
           }
    • la fonction sprintf est exactement la même que printf, exepté qu'elle écrit dans une chaine de caractères.... Et fprintf est exactement la même chose, excepté qu'elle écrit dans un fichier.
    • Pour vérifier tu peux effectivement mettre les printf tels que tu les as mis, mais je rajouterais à la fin de la chaine écrite un '\n' (retour à la ligne), qui force le printf à être écrit (cette instruction est bufferise et l'impression à l'écran n'est pas forcément synchrone avec le passage sur l'instruction. Donc un retour à la ligne "force" (à priori) l'écriture à l'écran. Donc quelque chose comme :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
            printf("pas d'extension alors on a ajouté .ppm\n");
    • tu as oublié des parenthèses par rapport à ce que j'avais mis :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
          sprintf ( &(NouveauNom[depart+1]), "%s", "ppm" );
    • Le principe général est le même dans les 3 cas exposés :

      • On cherche si il y a un point dans la chaine , et si oui on cherche le dernier
      • 2 cas peuvent se présenter :
        • Il n'y a pas de point : l'utilisateur n'a pas rentré d'extension
        • Il y a une extension.
      • Si il n'y a pas d'extension :
        • Si on est avec des pointeurs, on alloue assez de place en mémoire pour stocker le nom ET l'extension. Si l'allocation a réussi on stocke le nom donné par l'utilisateur et on y ajoute l'extension.
        • Si on n'est pas avec des pointeurs, on recopie le nom entré dans une chaine plus grande, et on lui ajoute l'extension.
      • Si l'extension existe, il faut vérifier si c'est la bonne, ou s'il y a une faute :
        • Si on est avec des pointeurs, on vérifie d'abord si c'est la bonne. Si il y aune faute, on vérifie si elle est assez longue pour qu'on puisse corriger sans dépasser la longueur. Si oui, simplement on remplace par la bonne extension. Sinon il faut demander plus de mémoire, copier le nom, et remplacer l'extenson.
        • Si on est pas avec des pointeurs, simplement on recopie le nom dans une chaine plus grande et on force l'extension à ce qu'on veut.
      • Ensuite on se sert du nom ainsi généré.
      • Si on est avec des pointeurs ET qu'on a alloué de la place mémoire, on libère cette place quand on ne se sert plus de la chaine.

Discussions similaires

  1. Reconnaitre une image dans une photo
    Par Mastard69 dans le forum OpenCV
    Réponses: 1
    Dernier message: 30/12/2013, 18h05
  2. Reconnaitre une image
    Par punisher999 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 14/05/2008, 10h45
  3. reconnaitre une forme dans une image
    Par ralf91 dans le forum C#
    Réponses: 7
    Dernier message: 03/04/2008, 20h31
  4. suppression de commentaire d'une image ppm
    Par Rniamo dans le forum C
    Réponses: 11
    Dernier message: 09/06/2007, 18h50
  5. Lecture d'une image ppm
    Par maestro128 dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 26/02/2007, 22h50

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