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 :

Execution sous mac différente de celle sous Linux


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Execution sous mac différente de celle sous Linux
    Bonjour
    j'ai le code suivant qui compile bien sous Linux et mac,
    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
    #include <stdio.h>
    #include <string.h>
    #include  <stdlib.h>
     
    #define TAILLE_CHAINE 27
    #define TAILLE_SOUS_CHAINE 26
     
    void decalage(const char chaine[TAILLE_CHAINE], int iteration, char chaineDeRetour[TAILLE_CHAINE])
    {
        char a[TAILLE_SOUS_CHAINE];
        char chaineCpy[TAILLE_CHAINE];
        if(iteration > 0)
        {
     
            strncpy(a,chaine,TAILLE_SOUS_CHAINE-1);
            sprintf(chaineCpy,"%c%s",chaine[TAILLE_SOUS_CHAINE-1],a);
            decalage(chaineCpy, iteration-1,chaineDeRetour);
        }
        else
        {
            strncpy(chaineDeRetour, chaine, TAILLE_CHAINE-1);
        }
    }
     
    int main(void) 
    {
        printf("start");
        char chaine[TAILLE_CHAINE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\0";
        char chaineN[TAILLE_CHAINE] = "";
     
        printf("chaine = %s\n", chaine);
        decalage(chaine,1,chaineN);
        printf("1 chaineN = %s\n", chaineN);
     
        decalage(chaine,2,chaineN);
        printf("2 chaineN = %s\n", chaineN);
     
        decalage(chaine,10,chaineN);
        printf("10 chaineN = %s\n", chaineN);
     
        decalage(chaine,26,chaineN);
        printf("26 chaineN = %s\n", chaineN);
     
        return 0;
    }
    or lors de l'execution sous mac j'ai l'erreur :
    startchaine = ABCDEFGHIJKLMNOPQRSTUVWXYZ
    1 chaineN = ZABCDEFGHIJKLMNOPQRSTUVWXY
    Abort trap: 6


    mais si le code est:
    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
    #include <stdio.h>
    #include <string.h>
    #include  <stdlib.h>
     
    #define TAILLE_CHAINE 27
    #define TAILLE_SOUS_CHAINE 26
     
    void decalage(const char chaine[TAILLE_CHAINE], int iteration, char chaineDeRetour[TAILLE_CHAINE])
    {
        char a[TAILLE_SOUS_CHAINE];
        char chaineCpy[TAILLE_CHAINE];
        if(iteration > 0)
        {
     
            strncpy(a,chaine,TAILLE_SOUS_CHAINE-1);
            sprintf(chaineCpy,"%c%s",chaine[TAILLE_SOUS_CHAINE-1],a);
     
            decalage(chaineCpy, iteration-1,chaineDeRetour);
        }
        else
        {
            printf(".");
            strncpy(chaineDeRetour, chaine, TAILLE_CHAINE-1);
        }
    }
     
    int main(void) 
    {
        printf("start");
        char chaine[TAILLE_CHAINE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\0";
        char chaineN[TAILLE_CHAINE] = "";
     
        printf("chaine = %s\n", chaine);
        decalage(chaine,1,chaineN);
        printf("1 chaineN = %s\n", chaineN);
     
        decalage(chaine,2,chaineN);
        printf("2 chaineN = %s\n", chaineN);
     
        decalage(chaine,10,chaineN);
        printf("10 chaineN = %s\n", chaineN);
     
        decalage(chaine,26,chaineN);
        printf("26 chaineN = %s\n", chaineN);
     
        return 0;
    }
    le retour est correct:
    startchaine = ABCDEFGHIJKLMNOPQRSTUVWXYZ
    .1 chaineN = ZABCDEFGHIJKLMNOPQRSTUVWXY
    ..2 chaineN = YZABCDEFGHIJKLMNOPQRSTUVWX
    ..........10 chaineN = QRSTUVWXYZABCDEFGHIJKLMNOP
    ..........................26 chaineN = ABCDEFGHIJKLMNOPQRSTUVWXYZ

    pourquoi?

    merci bien

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par KR_Prog Voir le message
    pourquoi?
    Bonjour

    C'est typique d'un comportement indéterminé. Tu fais un truc d'illégal mais ça fonctionne malgré tout correctement (ton code n° 2). Puis tu fais une modif mineure (rajouter/enlever un printf) et là ça ne fonctionne plus (code n° 1).
    C'est un comportement indéterminé (imprévisible) donc dont on ne peut prévoir le résultat (il peut fonctionner, planter, fonctionner les jours pairs et planter les jours impairs, reformater ton disque dur, etc).

    Ton problème vient de strncpy(). Cette fonction ne rajoute pas le '\0' quand les "n" caractères ont été copiés. Tu te retrouves donc avec des chaines qui n'ont plus de '\0' et donc dès que tu les traites via des fonctions de manipulation de chaines qui se calent sur ce '\0' et qui vont jusqu'à dépasser l'espace de la chaine pour le trouver => comportement indéterminé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [DEV] Execution d'application externe sous mac os X
    Par beber69 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 24/04/2009, 11h12
  2. [C++] Programmation C++ sous Mac
    Par reggae dans le forum Développement OS X
    Réponses: 2
    Dernier message: 09/10/2005, 12h10
  3. lbrairie glui sous mac
    Par milliet dans le forum OpenGL
    Réponses: 6
    Dernier message: 05/05/2005, 14h58
  4. [TP]Exécution sous XP
    Par Jeff on the web dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 28/04/2004, 10h32

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