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 :

Problème "makes pointer from integer without a cast"


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 1
    Par défaut Problème "makes pointer from integer without a cast"
    Bonsoir,
    Je ne comprends pas pourquoi quand j’exécute mon code, il ne fonctionne pas et je reçois l'erreur suivante :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     point.c: In function ‘main’:
    point.c:13:28: warning: passing argument 1 of ‘demanderLigneEtColonne’ makes pointer from integer without a cast [-Wint-conversion]
         demanderLigneEtColonne(*ligne, *colonne);
                                ^~~~~~
    point.c:6:34: note: expected ‘int *’ but argument is of type ‘int’
     void demanderLigneEtColonne(int* ligne, int* colonne);



    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
    #include<stdio.h>
    #include<stdlib.h>
     
    #define TAILLE_GRILLE 20
     
    void demanderLigneEtColonne(int* ligne, int* colonne);
     
    int main(){
     
        int* ligne;
        int* colonne;
     
        demanderLigneEtColonne(*ligne, *colonne);
     
        return 0;
    }
    void demanderLigneEtColonne(int* ligne, int* colonne){
     
        printf("\n");
        printf("Entrez la prochaine ligne a jouer ? ");
        scanf("%d", &ligne);
        printf("\n");
     
        if(ligne <= 0 & ligne > TAILLE_GRILLE){
            printf("Ce nombre n'est pas entre 1 et 20\n");
        }
     
        printf("Entrez la prochaine colonne a jouer ? ");
        scanf("%d", &colonne);
        printf("\n");
     
        if(colonne <= 0 & colonne > TAILLE_GRILLE){
            printf("Ce nombre n'est pas entre 1 et 20\n");
        }
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Tu ne sembles pas avoir compris ce qu'est un pointeur. Toutes tes lignes concernant ligne ou colonne sont erronées, sauf les lignes 7 et 18. Mais dans ces lignes tu pourrais les nommer plutôt adresse_de_ligne et adresse_de_colonne pour mieux voir le rôle des pointeurs.

    Ligne 14, ta fonction attend 2 pointeurs sur des int, donc 2 adresses d'int. Il faut lui passer les adresses des 2 entiers que tu souhaites modifier. Tu n'a jamais déclaré d'entier! Et ce que tu passes à ta fonction ce sont des déreférencements de pointeurs, c'est à dire ce qui est pointé, et ce qui est pointé se sont des int. Tu passes donc des valeurs entières à ta fonction. Ça provoque un plantage immédiat à la première utilisation car pour elle se sont des adresses.
    En résumé, il faut définir deux int et passer leur adresse à la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int  ligne;
        int  colonne;
        demanderLigneEtColonne( &ligne, &colonne );
    Dans la fonction, tu reçoit 2 pointeurs et tu les utilises comme si c'était des int. Là aussi ça ne peut pas marcher.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    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 817
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Orawhite Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(){
     
        int* ligne;
        int* colonne;
     
        demanderLigneEtColonne(*ligne, *colonne);
     
        return 0;
    }
    void demanderLigneEtColonne(int* ligne, int* colonne){
        ...
    }
    Tu as commis l'erreur classique du débutant qui utilise les pointeurs pour la première fois : tu n'as pas saisi que l'étoile a un sens différent dans la déclaration et dans l'utilisation
    Dans la déclaration (ie void demanderLigneEtColonne(int* ligne, int* colonne)), la variable "ligne" représente un pointeur, donc une adresse (adresse d'un int). Mais dans l'utilisation (ie demanderLigneEtColonne(*ligne, *colonne), le terme "étoile ligne" représente "ce qui est déréférencé par l'adresse ligne" autrement dit, un int. Donc ta fonction attend une adresse (un int étoile) et tu lui passes un int => ça ne pourra jamais réussir.

    Petit exemple où je passe une adresse à travers une fonction intermédiaire pour atteindre la fonction finale
    Code c : 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
    #include <stdio.h>  
     
    // Fonction recevant l'adresse d'un int 
    void set(int *v, int n) {
    	(*v)=n;
    }
     
    // Fonction recevant l'adresse d'un int
    void init(int *v) {
    	set(v, 0);			// v étant une adresse, et "set" attendant une adresse, je lui passe "v" tout simplement
    }
     
    int main() {
    	int toto=123;
    	printf("toto=%d\n", toto);
    	init(&toto);		// toto étant un int, &toto est l'adresse de cet int
    	printf("toto=%d\n", toto);
    }

    Bon ce n'est pas la seule erreur de ton code mais c'est la plus flagrante. T'as aussi scanf("%d", &ligne) qui ne peut pas réussir (si tu as bien suivi mon exemple tu auras compris que c'est scanf("%d", ligne) qu'il faut écrire). Et l'autre grosse erreur ce sont ces int* ligne; int* colonne des lignes 10 et 11 qui sont des pointeurs non initialisés, pointeurs contenant donc une adresse aléatoire mais à laquelle tu vas ensuite remplir allègrement avec des valeurs saisies au clavier => as-tu le droit de mettre des valeurs à ces adresses ? L'une de ces adresses n'est-elle pas celle de la FAT (ou du super bloc si t'es sous Linux) de ton disque dur que tu vas donc corrompre si tu y mets n'importe quoi ?
    Tu as parfaitement le droit d'utiliser des pointeurs si telle est ton envie, mais tu ne peux absolument pas, si tu déclares truc *pt, aller remplir "*pt" si tu n'as pas écrit auparavant pt=adresse_valide (charge à toi de savoir quoi mettre comme adresse valide ce qui est le cas quand on sait ce que l'on fait et pourquoi on utilise un pointeur). Ou alors tu re-regardes de nouveau mon exemple pour voir comment moi je m'y suis mis pour 1) avoir un vrai int (et non un pointeur sur un int n'existant pas encore) et 2) stocker "0" dans cet int.

    Accessoirement tu testes si les valeurs entrées sont dans les bornes mais si ce n'est pas le cas ben tu fais rien de plus (moi j'aurais fait resaisir) mais ça, c'est un souci de comportement de ton programme et non un souci de prog.

    PS: ton compilateur a dû t'assassiner de warnings dans tous les sens. Hé ben contrairement à une idée reçue, un warning ce n'est pas un truc inutile qui ne sert à rien. C'est un message de ton compilateur disant "ici je pense qu'il y a une erreur mais comme l'instruction est syntaxiquement correcte je vais quand-même la compiler et démerde toi si ça foire". Et donc bien évidemment, dans 98% des cas, un warning c'est bien une erreur et ça foire à l'exécution (dont acte). Et pour les 2% restants, ce n'est pas une erreur mais il faut quand-même réécrire l'instruction de façon plus explicite (généralement via un cast) pour que le compilateur soit rassuré. Bref pour résumer, un code qui a des warnings n'est pas un code correct même s'il compile.
    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. assignment makes pointer from integer without a cast
    Par morpheusmg dans le forum Débuter
    Réponses: 4
    Dernier message: 27/11/2011, 17h31
  2. Réponses: 5
    Dernier message: 17/02/2011, 20h19
  3. Réponses: 2
    Dernier message: 12/11/2010, 12h11
  4. Réponses: 3
    Dernier message: 08/09/2009, 09h40
  5. Réponses: 6
    Dernier message: 11/05/2006, 22h08

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