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 :

les paramètres de fonction


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Par défaut les paramètres de fonction
    Bonjour,

    Je débute en C et j'ai un petit souci sur les paramètres des fonctions.
    j'ai un code qui ressemble à celui ci dessous et j'ai 4 erreurs à la compilation.
    error C2087: '<Unknown>' : missing subscript (à la ligne byte** fonction_test...)
    error C2143: syntax error : missing ';' before 'type' ( à la ligne main())

    Je pense c'est que je ne sais pas bien réaliser des fonctions en C. D'autant qu'il fonctionnait avant que je décide de créer la fonction (tout était dans le main avant). Vous pouvez m'indiquer comment en faire qui fonctionne en C pour résoudre mon problème. Merci d'avance !


    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
     
    #include ***
     
    int tableau1[2][2] = {{221, 331},{31, 43}};
     
    byte** fonction_test(byte** donnees, int tableau[][]){
     
    ...
    return donnees;
    }
     
    void main()
    {
     
    byte ** donnees;
    byte ** tmp_donnees;
    donnees = ... ;
    tmp_donnees = fonction_test(donnees,tableau1);
    }

  2. #2
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Bonjour,

    La réponse se trouve dans la FAQ :
    http://c.developpez.com/faq/c/?page=...tre_ndimension

    Il faut fournir les dimensions du tableau.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Attention quand même aux bases : void main() n'a jamais existé, c'est au "minimum"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
        // le code
        ...................
       // on termine par un return
      return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Attention quand même aux bases : void main() n'a jamais existé
    Je suis d'accord avec vous sur la nécessité d'éviter void main(), cependant je ne pense pas que bugmenot ait inventé cela. Je vous renvoie à void main() is not legal in C++ but is legal in C

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2087: '<Unknown>' : missing subscript (à la ligne byte** fonction_test...)
    Le type byte n'existe pas.

    Bon Dimanche

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Le type byte n'existe pas
    Sauf s'il a été défini dans l'un des includes qui ne sont pas précisés.

    Dans le cas contraire, le type qui s'en approche le plus en C est : unsigned char.

    Vous pouvez poser :
    typedef unsigned char byte;

    au début de votre code, de façon à modifier le moins de lignes possible.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Citation Envoyé par Corentor
    Sauf s'il a été défini dans l'un des includes qui ne sont pas précisés.

    Dans le cas contraire, le type qui s'en approche le plus en C est : unsigned char.

    Vous pouvez poser :
    typedef unsigned char byte;

    au début de votre code, de façon à modifier le moins de lignes possible.
    En fait, je pense que l'erreur vient plutôt de l'argument tableau dans
    byte** fonction_test(byte** donnees, int tableau[][])
    Quand on passe un tableau multidimensionnel en paramètre, la première dimension (celle la plus à gauche) peut être omise, mais pas les autres, contrairement à java dont j'imagine que vous êtes issu, car le style de votre code (void main, byte, tableau[][]) est symptomatique de la culture java.

    Vous devrez écrire : tableau[2][2] ou tableau[][2]

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    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
    #include ***
     
    int tableau1[2][2] = {{221, 331},{31, 43}};
     
    byte** fonction_test(byte** donnees, int tableau[][]){
     
    ...
    return donnees;
    }
     
    void main()
    {
     
    byte ** donnees;
    byte ** tmp_donnees;
    donnees = ... ;
    tmp_donnees = fonction_test(donnees,tableau1);
    }
    • Le type byte n'existe pas en C. Revoir tes cours de C d'urgence !
    • Jamais vu ca: #include *** ! C'est quoi ? Mieux vaut faire des inclusion explicit de stdio.h, stdlib.h, etc...
    • main retourne toujours un entier (soit 0, soit EXIT_SUCCESS avec stdlib.h)
    • C'est quoi ca: donnees=...; ? Jamais vu !
    • J'arrête là!
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Corentor
    Je suis d'accord avec vous sur la nécessité d'éviter void main(), cependant je ne pense pas que bugmenot ait inventé cela. Je vous renvoie à void main() is not legal in C++ but is legal in C
    Voilà ce qui est dit dans la norme :
    Citation Envoyé par ISO/IEC 9899:TC2 Committee Draft — May 6, 2005
    5.1.2.2.1 Program startup
    1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
    int main(void) { /* ... */ }
    or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
    int main(int argc, char *argv[]) { /* ... */ }
    or equivalent;9) or in some other implementation-defined manner.
    A voir donc car le passage n'est pas très clair, pour moi tout au moins je ne maîtrise pas très très bien l'anglais, mais tout de même, "It shall be defined with a return type of int"...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Par défaut
    Citation Envoyé par Corentor
    Je suis d'accord avec vous sur la nécessité d'éviter void main(), cependant je ne pense pas que bugmenot ait inventé cela. Je vous renvoie à void main() is not legal in C++ but is legal in C
    http://emmanuel-delahaye.developpez....s.htm#typemain

    Citation Envoyé par n1124
    5.1.2.2.1 Program startup
    1 The function called at program startup is named main. The implementation declares no
    prototype for this function. It shall be defined with a return type of int and with no
    parameters:
    int main(void) { /* ... */ }
    or with two parameters (referred to here as argc and argv, though any names may be
    used, as they are local to the function in which they are declared):
    int main(int argc, char *argv[]) { /* ... */ }
    or equivalent;9) or in some other implementation-defined manner.
    [e:] Même reflexe... [/e]

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Le fait que main retourne un int n'est pas dû au hasard. La valeur renvoyée par le processus (l'application) permet au système d'exploitation, ou du moins son ordonnanceur, de choisir l'action à réaliser (passage en mode zombie, destruction du processus, etc...)
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Les textes sont clairs:
    - C90/C99: deux formes définies: int main(void), int main(int, char**), provision explicite pour d'autres formes définies par l'implémentation
    - C++98: deux formes définies: int main(), int main(int, char**), provision explicite pour d'autres formes définies par l'implémentation mais devant toutes retourner un int.

    Donc en C, void main(), c'est un comportement défini par l'implémentation, en C++ un comportement indéfini. La page citée ne dit rien d'autre.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Donc en C, void main(), c'est un comportement défini par l'implémentation, en C++ un comportement indéfini. La page citée ne dit rien d'autres.
    Que dire de plus ? Et je remarquais simplement que bugmenot n'avait pas inventé void main(), qui n'est simplement pas portable d'après la norme, donc à éviter.

    D'ailleurs, puisque le document ISO/IEC 9899:TC2 Committee Draft a été cité, il suffit de lire ce qui est marqué un peu plus loin dans ce même texte :

    5.1.2.2.3 Program termination
    1 If the return type of the main function is a type compatible with int, a return from the
    initial call to the main function is equivalent to calling the exit function with the value
    returned by the main function as its argument;10) reaching the } that terminates the
    main function returns a value of 0. If the return type is not compatible with int, the
    termination status returned to the host environment is unspecified
    .

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Personnellement, ce qui me chiffonnes (hormis l'inexistance potentielle du type byte), c'est la conjonction de trois points qui, pris séparéments, peuvent se justifier:

    -La déclaration d'une variable sous la forme d'un pointeur de pointeur
    -le passage de cette variable comme argument à une fonction
    -la récupération du pointeur de pointeur comme valeur de retour de la fonction.

    Typiquement, on a très largement de quoi s'en sortir avec des pointeurs comme variables, en passant l'adresse du pointeur (un pointeur de pointeur) dans une fonction si l'idée est de modifier le pointeur, mais sans forcément avoir besoin de récupérer quoi que ce soit apres...

    Es tu réellement sur (car, au vu des parties de code montrées, je suis pris d'un doute) d'avoir bel et bien besoin de pointeur de pointeur pour tes variables nommées donnees et tmp_donnees ?

    N'aurais tu pas éventuellement intéret à reconsidérer les déclarations de ces variables?

    T'attends tu à ce que ta fonction_test modifie durablement la variable donnee que tu lui fournis en argument, ou, est-ce juste pour "fournir une copie de donnee" qui n'est pas destinée à etre modifier durablement?

    Pourrais tu nous indiquer la déclaration du type byte que tu utilises?

    Pourrait-on avoir éventuellement les valeurs réelles d'initialisation de donnees?
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. passer les paramètres à une fonction javascript
    Par phenix1988 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/01/2012, 23h19
  2. Réponses: 3
    Dernier message: 09/05/2011, 14h09
  3. [VB6] Dependency Walker - Voir les paramètres des fonctions
    Par snoopy69 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/02/2009, 13h34
  4. [PHP 4.4.2] Récupérer les paramètres d'une fonction
    Par stailer dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 21h41
  5. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42

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