Fonctions de type void inactives [Résolu/Fermé]

Signaler
Messages postés
133
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
18 août 2016
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Bonjour,

Je suis en train d'apprendre à programmer en C, et avec un programme en rapport avec les tableaux, je n'arrive pas à faire fonctionner mes fonctions de type void! (même si on peut toujours tout écrire dans le main mais c'est pas très classe)

J'ai même rajouté une fonction void totalement inutile qui affiche "Hello world" mais ça ne le fait pas !


#include <stdio.h>
#include <stdlib.h>

void copie(int tableauOriginal[], int tableauCopie[], int *tailleTableau);
void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax);
void printer();

int main()
{
    int tableauOriginal[8]={3,3,2,4,1,89,5,8};
    int tableauCopie[8];
    int tailleTableau = 8;

    int i;
    for(i=0; i< tailleTableau; i++)
    {
        tableauCopie[i] = tableauOriginal[i];
        printf("%d\n", tableauCopie[i]);

    }
    printf("Donnez la valeur max\n");
    int valeurMax;
    scanf("%f", &valeurMax);


    void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax);
    int ibis;
    for(i=0; i< tailleTableau; i++)
    {
        printf("%d\n", tableauCopie[i]);
    }

    void printer();

    return 0;
}

void copie(int tableauOriginal[], int tableauCopie[], int *tailleTableau)
{
    int i;
    for(i=0; i< *tailleTableau; i++)
    {
        tableauCopie[i] = tableauOriginal[i];

    }


}

void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax)
{
    int i;
    for(i=0; i<*tailleTableau; i++)
    {
        if(tableauCopie[i]> *valeurMax)
        {
            tableauCopie[i] = 0;
        }
    }
}

void printer()
{
    printf("Hello world! ");
}

3 réponses

Messages postés
15931
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juillet 2020
2 629
Bonjour,

Lorsque tu appelles une fonction, il ne faut pas rappeler ni le type de retour, ni les paramètres, cela ne sert qu'à la déclaration de la fonction.

Par exemple, tu écris bien
printf("Hello world! ");
et non
int printf(const char* "Hello world! ", ... NULL);
(ce qui aurait assez peu de sens).
Avec tes fonctions c'est pareil, il ne faut pas écrire
void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax);
mais directement
maximumTableau(tableauCopie, tailleTableau, valeurMax);
, idem pour
printer();
!
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
Bonjour,

Plein de petites erreurs et quelques grosses erreurs.

Pour les petites (qui génère souvent des warnings) :
int main()
Le bon prototype est int main(void)

int valeurMax;
Pas de mélange déclaration / code. Il faut plutôt le mettre avec les autres déclarations.

printf("Hello world! ");

Mets un '\n' en fin de chaîne. Ou alors, n'oublie pas de mettre un fflush(stdout); juste avant le return 0; final.

Pour les grosses erreurs :
scanf("%f", &valeurMax);
valeurMax est de type int et tu utilises %f qu'on réserve aux floats...
Donc plutôt : scanf("%d", &valeurMax);

void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax);
Outch. Que souhaites-tu faire ? Déclarer ta fonction ?
Si oui : Pas de déclaration de fonction dans ta fonction main(). Ligne à enlever (tu l'as déjà fait en haut de ton fichier).*
Si, tu souhaites appeler la fonction, c'est pas du tout ça. Il suffit de mettre : maximumTableau(tableauCopie, &tailleTableau, &valeurMax);
Même remarque pour valeurMax.

Pareil void printer(); dans le main(), si tu souhaites appeler la fonction, il faut mettre : printer();


Pourquoi passer tailleTableau en pointeur ? Cela est inutile, tu ne souhaites pas modifier la taille du tableau. Donc, plutôt int tailleTableau.

Et enfin, des conseils :
int tableauOriginal[8]={3,3,2,4,1,89,5,8};
Pour info, pas besoin de préciser la taille ici. Le compilateur définira lui-même la bonne taille. C'est pratique :-).

int tailleTableau = 8;
Pas besoin non plus. Tu peux le faire calculer automatiquement avec : sizeof tableauOriginal / sizeof *tableauOriginal.
Cela simplifie l'évolution du code.


Corrige déjà tout ça, reposte ton code corrigé, et merci d'utiliser la balise "code" situé à droite du bouton "souligné". Sinon c'est illisible.
Messages postés
15931
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juillet 2020
2 629
J'ai rajouté la balise de code dans son message, on voit mieux l'indentation comme ça ;-)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
Je vois que tu as pris du galon :-).
Messages postés
133
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
18 août 2016
1
Merci beaucoup pour votre aide, en C je comprends facilement mais je manque de rigueur!

J'ai juste gardé la variable tailleTableau parce que c'est plus pratique pour l'envoyer aux fonctions et faire des boucles ;)

Voici mon code remanié (avec des commentaires comme ça on s'y retrouve plus facilement) :

#include <stdio.h>
#include <stdlib.h>

void copie(int tableauOriginal[], int tableauCopie[], int *tailleTableau);
void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax);
void printer();

int main(void)
{
    int tableauOriginal[8]={3,3,2,4,1,89,5,8};
    int tableauCopie[8];
    int tailleTableau = 8;  // création des tableaux original et copie

    int i;
    for (i=0; i<tailleTableau; i++)
    {
        printf("%d\n", tableauOriginal[i]); // affichage des valeurs du tableau original
    }

    printf("Donnez la valeur max\n");
    int valeurMax;
    scanf("%d", &valeurMax); // saisie de la valeur max autorisée

    copie(tableauOriginal, tableauCopie, &tailleTableau); // copie d'original dans copie
    maximumTableau(tableauCopie, &tailleTableau, &valeurMax); // appel de la fonction max tableau



    for(i=0; i< tailleTableau; i++)// affichage des valeurs du tableau
    {
        printf("%d\n", tableauCopie[i]);
    }

    printer(); // affichage d'un message inutile

    return 0;
}

void copie(int tableauOriginal[], int tableauCopie[], int *tailleTableau)
{
    int i;
    for(i=0; i< *tailleTableau; i++)
    {
        tableauCopie[i] = tableauOriginal[i]; //copie des tableaux
    }
}

void maximumTableau(int tableauCopie[], int *tailleTableau, int *valeurMax)
{
    int i;
    for(i=0; i<*tailleTableau; i++)
    {
        if(tableauCopie[i]> *valeurMax)
        {
            tableauCopie[i] = 0; // comparaison des valeurs
        }
    }
}

void printer()
{
    printf("Hello world! \n");
}
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
J'ai juste gardé la variable tailleTableau parce que c'est plus pratique pour l'envoyer aux fonctions et faire des boucles ;)
Je n'ai pas dit le contraire...
Je dis jusqu'à la place de faire : int tailleTableau=8, tu n'as qu'à faire : int tailleTableau=sizeof tableauOriginal / sizeof *tableauOriginal;
Cela ne changera rien au code, sauf que tu n'auras pas besoin de modifier cette variable à chaque fois que tu modifies ton tableau...
int tableauOriginal[8]={3,3,2,4,1,89,5,8};
Même remarque. Tu n'as pas besoin de préciser le 8 entre crochet. Ainsi, dès que tu rajoutes un élément à ton tableau, le compilateur calculera lui-même la bonne taille.
Et pour les autres remarques, tu n'en as pas tenu compte, dommage...
Messages postés
133
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
18 août 2016
1
Je vais remettre int valeurMax en début de code alors!
J'ai supprimé l'indication de la taille du tableau entre crochets vu que le compilateur le fait tout seul aussi! D'ailleurs une petite question : est-ce qu'on peut toujours faire ça et ne pas s'en soucier ?
J'ai aussi utilisé la fonction sizeof que je ne connaissais pas, merci!
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
est-ce qu'on peut toujours faire ça et ne pas s'en soucier ?
Oui, à condition de faire une déclaration avec initialisation. Par exemple : int tab[]={...};