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 :

Je ne comprend pas mon erreur


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2022
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Je ne comprend pas mon erreur
    bonjour ;
    j'arrive pas à comprendre l'erreur :
    tab.c: In function ‘intialiserLeTableau’:
    tab.c:10:12: warning: returning ‘int **’ from a function with incompatible return type ‘int *’ [-Wincompatible-pointer-types]
    10 | return(*Tab);
    | ~^~~~~

    tab.c:27:37: warning: comparison of distinct pointer types lacks a cast
    27 | for(compteur = (Tab) ; compteur < (Tab +(*max)) ; compteur++ )
    | ^
    tab.c:29:45: error: invalid operands to binary - (have ‘int *’ and ‘int ***’)
    29 | printf("Tab[%d] : %d \t", compteur - Tab , (*compteur));
    | ^
    compilation terminated due to -Wfatal-errors.
    La question :
    Ecrire une fonction qui demande la taille d’un tableau d’entiers puis qui alloue ce tableau ;
    Remplir ce tableau d’entiers aléatoires entre 0 et 100 ;
    Afficher le tableau ;
    J'ai fait cela
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int * intialiserLeTableau(int **Tab[], int *max )
    {
        printf("veuillez introduire  la taille du tableau : ");
        scanf("%d",max);
        *Tab = calloc((*max) , sizeof(int));
        return(*Tab);
    }
     
    int * remplirAlea(int **Tab[] , int *max )
    {
        int *compteur; 
        for(compteur = *Tab ; compteur < (Tab +(*max)) ; compteur++ )
        {
            *compteur = rand()%101;
        }
        return (Tab);
    }
     
     
    void * afficheTableau(int **Tab[],int *max )
    {
        int *compteur;
        for(compteur = (Tab) ; compteur < (Tab +(*max)) ; compteur++ )
        {   
            printf("Tab[%d]  : %d \t", compteur - Tab , (*compteur));
        }
        printf("\n\n");   
    }
     
     
    int main()
    {
        int *P, *max ;
        P = intialiserLeTableau(P , &max ) ;
        afficheTableau(P,&max);
     
        P = remplirAlea(&P, &max);
        afficheTableau(&P,&max);
        return EXIT_SUCCESS ;
    }

  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 717
    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 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Bonjour

    L'erreur est indiquée: une fonction prévue pour retourner un "int étoile" ne peut pas retourner un "int étoile étoile", ce n'est pas du tout la même chose. Si j'étais toi, je me concentrerais sur ce que peut bien être ce int **Tab[] mis en tant que paramètre de ta fonction "initialiserLeTableau"
    Accessoirement il semble aussi que tu n'aies pas bien pigé le but des parenthèses, qui sont de prioriser des opérations. Si je veux que 2+3*4 donne 20, je suis obligé d'écrire (2+3)*4 (cf cours de mathématiques du primaire). Donc quand tu écris for(compteur = (Tab) je ne vois pas quelle opération tu peux bien avoir envie de prioriser
    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]

  3. #3
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    @nj18042001:

    Il n'y a pas une erreur, mais de très nombreuses erreurs et tu te compliques considérablement la vie.

    Pour créer une fonction qui alloue un tableau à une dimension de int en demandant à l'utilisateur sa dimension, le plus simple est un prototype comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int * initialiserLeTableau(int * max);
    et de faire ceci pour l'appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int max;
    int * tableau = initialiserLeTableau(&max);
    Note que ce que j'ai écris ci-dessus corrige plusieurs problèmes dans ton code :

    • dans ton code tu ne déclarais pas int max; dans main() (qui permet de stocker un int), mais int * max; c'est à dire une variable pointeur sur int (qui permet de stocker une adresse mémoire sensée pouvoir pointer vers en endroit où est stocké un int, mais tu n'avais aucun stockage pour un int). Déclare donc un int max; et passe son adresse pour permettre à initialiserLeTableau() d'en modifier son contenu (le int) indirectement dans la fonction via l'adresse passée
    • tu n'as pas à passer un pointeur non initialisé à ta fonction, cela ne sert à rien. La raison d'être de initialiserLeTableau() est d'allouer de la mémoire non déjà allouée. Tu as donc juste besoin de retourner l'adresse mémoire de la zone nouvellement allouée avec calloc()
    • l'orthographe initialiserLeTableau() est sans doutes mieux que intialiserLeTableau() .... :-P


    Il y a plein d'autres problèmes, mais corrige déjà cela et essaye d'avoir une fonction d'initialisation fonctionnelle.

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/02/2021, 18h26
  2. Je ne comprends pas mon erreur
    Par rania73 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/11/2019, 17h32
  3. Je débute en JAVA et je bloque je ne comprend pas mon erreur :(
    Par kelerbee dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 05/01/2019, 02h45
  4. $_POST, je ne comprends pas mon erreur
    Par JB122 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2014, 14h32
  5. Je ne comprends pas mon erreur !
    Par oulahoup dans le forum ASP
    Réponses: 4
    Dernier message: 25/08/2005, 14h24

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