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 :

Castage en C


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut Castage en C
    Salut a tous,
    Question probablement facile pour certains:
    voici un prototype de fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void crypte(void* bloc,int taille)
    je voudrais dans la fonction à présent caster bloc en int* comment faire ?
    n'existe t-il pas un autre moyen que (int*) bloc ??

    A bientot
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je ne pense pas qu'il existe un autre moyen que le (int*)bloc ...
    pourquoi cette méthode te gène ?

    Nas'

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    C'est le moins qu'on puisse dire j'obtiens un SIGSEV alors ce doit etre tres subtil. Pour faire bref et simple:
    Je dispose de 2 fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func1(word32* bloc)
    {
    int i=0;
    for(i=0;i<10;i++){bloc[i]^=0x54;}
    }
    et celle dont je parlais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func2(void* bloc,int taille)
    {
    func1((word32*) bloc);
     
    }
    GCC ME FAIT SIGSEV ?§§:N?§!!
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func1(word32* bloc,int taille) 
    { 
    int i=0; 
    for(i=0;i<taille;i++){bloc[i]^=0x54;} 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void func2(void* bloc,int taille) 
    { 
    func1((word32*) bloc,taille); 
    }
    Peut-être que bloc n'est pas bien alloué ? Enfin cette méthode serait plus sécuritaire.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Peut-être que bloc n'est pas bien alloué ? Enfin cette méthode serait plus sécuritaire.
    !Je vais m'y pencher !
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Je viens de remarquer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func1(int* bloc)
    {
    int i=0;
    for(i=0;i<10;i++){bloc[i]^0x54;} // NE PLANTE PAS
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void func1(int* bloc)
    {
    int i=0;
    for(i=0;i<10;i++){bloc[i]^=0x54;} //  PLANTE: SIGSEV
    }
    Je pense effectivement que c'est un probleme d'allocation.
    Etant donné que si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* test="vioefej";
    func1((int*) test);
    Est ce possible ?
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par KORTA
    Je pense effectivement que c'est un probleme d'allocation.
    Etant donné que si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* test="vioefej";
    func1((int*) test);
    Est ce possible ?
    Quand tu fais char *test="vioefej", tu n'alloue pas un espace memoire ou tu copie "vioefej", mais tu cree un pointeur qui va pointer sur la chaine constante "vioefej", cette chaine etant normalement constante, elle est dans certain systeme stocke en zone memoire read only et donc non modifiable.

    Essaie plutot char test[]="vioefej" qui alloue l'espace memoire et l'initialise.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Je pense effectivement que c'est un probleme d'allocation.
    Etant donné que si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* test="vioefej";
    func1((int*) test);
    Est ce possible ?
    Quand tu fais char *test="vioefej", tu n'alloue pas un espace memoire ou tu copie "vioefej", mais tu cree un pointeur qui va pointer sur la chaine constante "vioefej", cette chaine etant normalement constante, elle est dans certain systeme stocke en zone memoire read only et donc non modifiable.

    Essaie plutot char test[]="vioefej" qui alloue l'espace memoire et l'initialise.
    Merci pour l'info, a premiere vue, ca résoud mon problème. Info INCISIVE.
    Merci encore.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  9. #9
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Points : 67
    Points
    67
    Par défaut
    1ere remarque à ne pas suivre (mais ça peut servir parfois) : compiler en -fwritable-strings pur pouvoir modifier les chaînes statiques

    2eme remarque :

    Ici 8 octets sont alloués.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<10;i++){bloc[i]^0x54;}
    Et ici tu en modifies 10... cherche l'erreur !

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Suite a la 2eme remarque :

    Ici 8 octets sont alloués.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<10;i++){bloc[i]^0x54;}
    Et ici tu en modifies 10... cherche l'erreur !
    Evidemment c'est un exemple et celui ci a été donné pour expliquer le probleme mais ce genre de considération est pris en compte dans le développement, effectivement dans cet exemple il y a un probleme sur la taille.!!Mais l'erreur est désormais quasiment résolu (j'attends de faire une batterie de tests) grace à l'aide préciseuse de gl.
    A bientot
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/04/2007, 16h42
  2. [JList] suppression : pb castage
    Par AnthonyL44 dans le forum Composants
    Réponses: 2
    Dernier message: 12/12/2006, 09h42
  3. castage
    Par zenetcalme dans le forum C++
    Réponses: 8
    Dernier message: 26/01/2006, 16h56
  4. pb changement etat avec castage
    Par Malone dans le forum Composants VCL
    Réponses: 15
    Dernier message: 07/09/2005, 16h11

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