Fonctions de type void inactives

Résolu/Fermé
Onyx67 Messages postés 133 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 août 2016 - Modifié par KX le 29/06/2014 à 17:17
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 juil. 2014 à 22:42
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

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 juin 2014 à 17:10
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();
!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
29 juin 2014 à 17:15
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 juin 2014 à 17:17
J'ai rajouté la balise de code dans son message, on voit mieux l'indentation comme ça ;-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
29 juin 2014 à 17:35
Je vois que tu as pris du galon :-).
0
Onyx67 Messages postés 133 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 août 2016 1
Modifié par Onyx67 le 30/06/2014 à 15:20
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");
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
30 juin 2014 à 22:10
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...
0
Onyx67 Messages postés 133 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 août 2016 1
Modifié par Onyx67 le 3/07/2014 à 16:15
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!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 juil. 2014 à 22:42
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[]={...};
0