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 :

Erreur simple de pointeurs


Sujet :

C

  1. #1
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut Erreur simple de pointeurs
    Bonjour à tous.

    Je me tourne vers vous car j'ai une erreur de pointeur que je ne m'explique pas.
    J'ai un tableau d'éléments dont je voudrais passer l'adresse à une fonction pour le modifier :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    void f(int *ti[]) {
    	printf("Hello %i", *ti[0]); //par exemple
    }
     
    int main() {
    	int ti[] = {3, 14, 15};
    	f(&ti);
    	return 0;
    }

    Je pensais ce code valide, mais le compilateur me dit le contraire et à l’exécution j'ai droit à un segfault.
    La compilation avec gcc -o cast -Wall -Wextra main.c me donne comme erreur :
    main.c: In function ‘main’:
    main.c:9:2: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default]
    f(&ti);
    ^
    main.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[3]’
    void f(int *ti[]) {
    ^
    Quelque-chose m’échappe, aussi je souhaiterais être éclairé de vos lumières
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression que tu as le même problème qu'ici non ? http://www.developpez.net/forums/d12...pp/c/cast-int/

    EDIT : je pense que le code que tu souhaites faire est celui là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    void f(int (*ti)[]) {
    	printf("Hello %i", (*ti)[0]); //par exemple
    }
     
    int main() {
    	int ti[] = {3, 14, 15};
    	f(&ti);
    	return 0;
    }
    Mais je ne garantis pas grand chose ^^
    Dans ce code, le paramètre de f est du type attendu : *ti est de type int[]. Dans le printf, on déréférence le pointeur ti avec *ti pour récupérer un tableau et ensuite on récupère son premier élément.

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut
    Hum en effet ça fonctionne, c'est juste un problème de priorité d'opérateur donc.

    Je me doutait que la solution était simple, merci !
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    J'ai un tableau d'éléments dont je voudrais passer l'adresse à une fonction pour le modifier :
    A noter qu'il n'est pas nécessaire de passer l'adresse du tableau pour pouvoir modifier les éléments, l'adresse du premier élément du tableau suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    void f(int ti[]) {
    	printf("Hello %i", ti[0]); //par exemple
            ti[0]= 0; 
    }
     
    int main() {
    	int ti[] = {3, 14, 15};
    	f(ti);
            printf("\nHello %i\n", ti[0]);
    	return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut
    En effet, j'ai tellement pris l'habitude de passer des pointeurs pour modifier la valeur pointée, mais je n'ai pas réfléchi pour ce coup-là…

    M'enfin ça m'a quand appris qu'il faut faire attention à l'ordre des opérateurs et jouer avec les parenthèses.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/04/2011, 10h55
  2. Erreur simple mais incompréhensible
    Par ddestiny666 dans le forum Tkinter
    Réponses: 1
    Dernier message: 09/01/2011, 22h44
  3. [PHP 5.0] Erreur Simple Xml
    Par Shandler dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2009, 17h05
  4. Message d'erreur 'opération de pointeur incorrecte'
    Par Clotilde dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2008, 09h40
  5. une erreur avec les pointeur..
    Par lecyberax dans le forum C
    Réponses: 12
    Dernier message: 15/04/2006, 12h04

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