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

Linux Discussion :

Causez-moi des pointeurs char* toto ou char *toto


Sujet :

Linux

  1. #1
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut Causez-moi des pointeurs char* toto ou char *toto
    Bonjour,
    je suis assez débutant en C, et j'en chie comme un malade pour piger ces histoires de pointeurs; y a-t'il une différence entre char* toto et char *toto ?
    J'essaie d'utiliser un tout petit bout de code qui convertit un entier long en adresse internet pointée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char* long2ip(unsigned int v) { 
        struct in_addr x;
        x.s_addr = htonl(v); // passe dans l' ordre reseau
        return inet_ntoa(x); // et convertit
    }
    Je voudrais la mettre dans un printf et je n'y arrive pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("long2ip=%s\n",long2ip((unsigned int)hostinfo->h_addr));
    Ça plante soit à la compilation soit à l'exécution en segmentation fault, selon les différents essais que je fais, comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scan.c: Dans la fonction «long2ip» :
    scan.c:49: attention : return makes pointer from integer without a cast
    .
    David

  2. #2
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Ca doit etre un problème de référence qui est perdue à la sortie de la fonction (le man des fonctions reseau dit que la chaine est renvoyée dans un buffer alloué statiquement).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char* long2ip(unsigned int v) { 
        struct in_addr x;
        char *ipstring = malloc(16*sizeof(char));
        x.s_addr = htonl(v); // passe dans l' ordre reseau
     
        strcpy(ipstring,inet_ntoa(x)); 
        return ipstring;
    }
    Je suis pas du tout une star en C alors à vérifier et corriger éventuellement.
    Sinon pour ta question, declarer char *toto ou char* toto c'est pareil.

  3. #3
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut bon ben au moins j'aurai appris pour char* toto et char *toto...
    ...mais pour ce qui est du code, ça ne marche pas encore.

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 303
    Points : 4 967
    Points
    4 967
    Billets dans le blog
    5
    Par défaut
    Juste avant le return de la fct long2ip() que donne un printf("%s\n",inet_ntoa(x)); ?

    Je soupçonne que la valeur renvoyée ==NULL.

  5. #5
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut salut Dijon (j'ai été étudiant à Besac)
    le printf me donne bien la chaine ascii remplie correctement; grâce à l'idée que m'a donnée KindPlayer, de passer par une variable caractére intermédiaire ipstring, ça marche; mais j'ai des avertissements à la compil', que je ne pige pas ni ne parviens à éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    scan.c: Dans la fonction «long2ip» :
    scan.c:62: attention : passing argument 2 of «strcpy» makes pointer from integer without a cast
    scan.c:64: attention : assignment from incompatible pointer type
    alors que mon code est le suivant (j'ai mis des printf partout pour tout suivre pas à pas :
    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
    extern char *long2ip(unsigned int v) { /////////////////////////////////////////
        struct in_addr x;
        extern char ipstring[16];
        extern char* pipstr;
        unsigned int uint;
        int* pint;
        printf("\nlong2ip: reçu              v=%u\n",v);
        x.s_addr = htonl(v); // passe dans l' ordre reseau
        printf("long2ip: x.s_add (réordonné)=%u\n",x.s_addr);
        uint=(unsigned int)x.s_addr;
        printf("long2ip:                uint=%u\n",uint);
        pint=&uint;
        printf("long2ip:     inet_ntoa(uint)=%s\n",inet_ntoa(uint));
        strcpy(ipstring,inet_ntoa(*pint)); // ligne 62 ici, conversion.
        printf("long2ip:            ipstring=%s\n",ipstring);
        pipstr=&ipstring;                  // ligne 64 ici
        printf("long2ip: renvoyé      pipstr=%d\n\n",pipstr);
        return pipstr; // return inet_ntoa(x);
    }

  6. #6
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    il faut que tu mettes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
        strcpy(ipstring,inet_ntoa(x)); // ligne 62 ici, conversion.
        return ipstring // return inet_nt
    inet_ntoa prend une struct in_addr en parametre, ce qui correspond à ta variable x. Et je comprends pas trop le mic mac que tu fais avec tous tes pointeurs. Ca te fait ecrire des conneries. Par exemple tu ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern char* pipstr;
    pipstr=&ipstring;//faux, a la rigueur pipstr=ipstring mais c'est completement inutile
    pipstr et ipstring etant tous les deux pointeurs sur char. Ca aurait été correcte en ecrivant extern char** pipstr mais c'est pareil jvois pas l'interet. Même chose avec uint et pint, c'est inutile. Ou alors quelque chose m'a échappé. Apparement tu veux utiliser des variables globales, mais tu peux les affecter directement dans ta fonction. Je connais pas le reste de ton code, mais c'est bizarre de déclarer une variable extern dans une fonction non? Déclare la dans un fichier h et tu l'utilises simplement dans ta fonction ca me parait plus simple.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 303
    Points : 4 967
    Points
    4 967
    Billets dans le blog
    5
    Par défaut
    En ligne 62 strcpy(); attend en 2eme argument un const char* et non un char.

    Sans préjuger de ce code qui fonctionne tout de même apparemment je me suis amusé de mon codé à essayé d'écrire un bout de code exemple en partant du tient. Ca fonctionne sans conversion quelconque. Le seul problème que je vois de ton côté est ce que peut renvoyer (unsigned int)hostinfo->h_addr.
    Je place ici mon code exemple. Je crée un nombre en fonction d'une ip puis j'envoie ce nombre dans ta fonction pour voir:
    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
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
     
    char* long2ip(unsigned long int v) { 
        struct in_addr x;
        x.s_addr = htonl(v); // passe dans l' ordre reseau
        return inet_ntoa(x); // et convertit
    }
     
     
    int main(int argc, char **argv)
     
    {
    	// Création d'un nombre en fonction d'une adresse ip
    	printf("nombre obtenu après conversion ip :%d\n", inet_addr("192.168.1.1"));
     
    	// Envoie de ce nombre à la fonction long2ip pour conversion et impression
    	printf("long2ip=%s\n",long2ip(inet_addr("192.168.1.1")));
     
    //	printf("long2ip=%s\n",long2ip((unsigned int)hostinfo->h_addr));
     
     
    	return 0; 
     
    }

  8. #8
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut merci les gars...
    ...je n'ai pas encore eu le temps de tout éplucher vos commentaires, mais je suis bien content qu'on se penche sur ce qui me fait souci; et merci aussi de m'avoir donné quelques éclaircissements sur "Ca te fait ecrire des conneries"...
    David
    P.S. pour KindPlayer, j'ai commencé à lire tes commentaires, et ça m'a fait entrevoir la nature de ce que peut être un **toto; par ailleurs, les variables globales, c'est parce que je ne sais pas faire autrement quand ça déconne au point que je n'y comprenne plus rien, donc là au moins j'ai des variables presque gravées dans du marbre et je m'en sors.
    Je suis un transfuge du fortran que j'utilise presque tous les jours au boulot, mais juste dans des moulinettes séquentielles avec un ou deux fichier(s) d'entrée et un de sortie; par contre j'ai installé linux récemment pour piger ce qui se passe avec le net donc je bouffe du C.
    D.

  9. #9
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 303
    Points : 4 967
    Points
    4 967
    Billets dans le blog
    5
    Par défaut
    Il n'y a qu'une chose à dire alors : bienvenu dans le monde merveilleux du C . (langage qui me semble être un peu oublié, à mon grand regret d'ailleurs )

    Bienvenu aussi dans le monde du libre avec linux.

  10. #10
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    ...je n'ai pas encore eu le temps de tout éplucher vos commentaires, mais je suis bien content qu'on se penche sur ce qui me fait souci; et merci aussi de m'avoir donné quelques éclaircissements sur "Ca te fait ecrire des conneries"...
    David
    P.S. pour KindPlayer, j'ai commencé à lire tes commentaires, et ça m'a fait entrevoir la nature de ce que peut être un **toto; par ailleurs, les variables globales, c'est parce que je ne sais pas faire autrement quand ça déconne au point que je n'y comprenne plus rien, donc là au moins j'ai des variables presque gravées dans du marbre et je m'en sors.
    Je suis un transfuge du fortran que j'utilise presque tous les jours au boulot, mais juste dans des moulinettes séquentielles avec un ou deux fichier(s) d'entrée et un de sortie; par contre j'ai installé linux récemment pour piger ce qui se passe avec le net donc je bouffe du C.
    D.
    Bon courage a toi alors, le C est un langage puissant mais difficile a maitriser. Si tu as d'autres questions je te suggère de les poster plutot dans le forum C qui est régulierement visitée par quelques vrais spécialistes (Emmanuel Delahaye par exemple). Moi je n'en suis pas un jrisque de dire des conneries :p
    [Edit] bien sur il y a des spécialistes ici aussi

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    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 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    P.S. pour KindPlayer, j'ai commencé à lire tes commentaires, et ça m'a fait entrevoir la nature de ce que peut être un **toto
    Cours pour apprendre C

  12. #12
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut merci pour le petit lien bien cool.
    David (chef des pointeurs)

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/03/2015, 13h55
  2. Probléme de pointeur avec des pointeurs de char *
    Par marime dans le forum Débuter
    Réponses: 4
    Dernier message: 30/09/2013, 14h14
  3. Soucis avec des pointeurs, des tableaux, des char*
    Par isabell3 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/12/2009, 13h00
  4. Forcer le troncage des champs depassant les 255 chars.
    Par petozak dans le forum Hibernate
    Réponses: 4
    Dernier message: 07/06/2007, 19h00
  5. problème char-actéristique avec des pointeurs
    Par Antigonos Ier Gonatas dans le forum C
    Réponses: 11
    Dernier message: 16/04/2007, 22h22

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