[C] Anomalie de fonction static
Résolu/Fermé
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
-
21 janv. 2007 à 16:51
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 - 16 juin 2007 à 21:50
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 - 16 juin 2007 à 21:50
A voir également:
- Static fonction c
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction somme excel - Guide
- Fonction remplacer word - Guide
- Excel renvoyer la valeur d'une cellule en fonction d'une autre - Forum Logiciels
13 réponses
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
22 janv. 2007 à 19:15
22 janv. 2007 à 19:15
Je vois.
Il faut que tu considères une fonction statique comme une fonction privée. Une fonction qui n'appartient qu'à un fichier source.
Si une fonction statique est utilisée dans un fichier source, elle n'a pas lieu d'être protoypée dans un header commun à tout le monde.
Ton terrain.h est appelé juste par testterrain.c, il ne sert donc que d'interface pour utiliser les fonctions implémentées dans terrain.c. Et la fonction statique est déclarée dans terrain.h
Elle ne devrait être déclarée que dans le fichier qui implémente cette fonction statique ou encore dans un header qui n'est appelé que par le fichier qui implémente cette fonction.
Les autres fichiers sources n'ont pas lieu de connaître l'existence de cette fonction qu'ils n'utilisent pas.
Il faut que tu considères une fonction statique comme une fonction privée. Une fonction qui n'appartient qu'à un fichier source.
Si une fonction statique est utilisée dans un fichier source, elle n'a pas lieu d'être protoypée dans un header commun à tout le monde.
Ton terrain.h est appelé juste par testterrain.c, il ne sert donc que d'interface pour utiliser les fonctions implémentées dans terrain.c. Et la fonction statique est déclarée dans terrain.h
Elle ne devrait être déclarée que dans le fichier qui implémente cette fonction statique ou encore dans un header qui n'est appelé que par le fichier qui implémente cette fonction.
Les autres fichiers sources n'ont pas lieu de connaître l'existence de cette fonction qu'ils n'utilisent pas.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
22 janv. 2007 à 03:53
22 janv. 2007 à 03:53
Ben si je me gourre pas, en c, une fonction statique c'est une fonction dont la portée de dépasse pas le fichier source courant...
Donc totalement différent du c++ si je ne m'abuse.
PS : Il ne faut peut-être pas déclarer les fonctions static dans un .h ?
C'est pas logique, normalement le préprocesseur va prendre ton fichier.h pour le mettre dans le fichier.c
Pour le compilateur c'est comme si ça ne faisait qu'un seul fichier.
Je viens de faire le test:
Je compile:
gcc -c test.c
Et aucun problème....
Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...
Donc totalement différent du c++ si je ne m'abuse.
PS : Il ne faut peut-être pas déclarer les fonctions static dans un .h ?
C'est pas logique, normalement le préprocesseur va prendre ton fichier.h pour le mettre dans le fichier.c
Pour le compilateur c'est comme si ça ne faisait qu'un seul fichier.
Je viens de faire le test:
//test.h static int prout(); //test.c #include "test.h" static int prout(){return 1;}
Je compile:
gcc -c test.c
Et aucun problème....
Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
21 janv. 2007 à 17:16
21 janv. 2007 à 17:16
Bonjour,
le langage est dans le titre (C)
La déclaration :
static int fonction(int peuImporte);
Le message d'erreur est celui-là, à un mot près.
Dans le .h :
Warning in fonction fonction() : fonction type static declarated but never initializated
le langage est dans le titre (C)
La déclaration :
static int fonction(int peuImporte);
Le message d'erreur est celui-là, à un mot près.
Dans le .h :
Warning in fonction fonction() : fonction type static declarated but never initializated
Bonjour,
Il serait bon de connaître :
- le langage (static n'a pas le même sens en C et C++)
- la déclation complète de la fonction
- le message d'erreur exact.
Manu
Il serait bon de connaître :
- le langage (static n'a pas le même sens en C et C++)
- la déclation complète de la fonction
- le message d'erreur exact.
Manu
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
22 janv. 2007 à 18:28
22 janv. 2007 à 18:28
Merci de vos réponses,
Je n'ai toujours pas trouvé, je vous passe un lien vers le projet
https://www.cjoint.com/?bwsAhoTdSv
(faire : $make test)
Merci.
PS : Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...
Je crois bien que c'est ça...
Donc en général, lorque tu déclares des fonctions static, il fait créer deux .h ? Un qui contient les fonctions à porté globale et un autre qui contients que les static, de cette façon, elles ne seront pas inclus dans d'autres fichiers ?
Je n'ai toujours pas trouvé, je vous passe un lien vers le projet
https://www.cjoint.com/?bwsAhoTdSv
(faire : $make test)
Merci.
PS : Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...
Je crois bien que c'est ça...
Donc en général, lorque tu déclares des fonctions static, il fait créer deux .h ? Un qui contient les fonctions à porté globale et un autre qui contients que les static, de cette façon, elles ne seront pas inclus dans d'autres fichiers ?
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
22 janv. 2007 à 21:51
22 janv. 2007 à 21:51
bien vue Kilian!
sinon,il me semble que static a le même sens en C et en C++, mais différent dans ou en dehors d'une class.
sinon,il me semble que static a le même sens en C et en C++, mais différent dans ou en dehors d'une class.
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
23 janv. 2007 à 18:12
23 janv. 2007 à 18:12
Ok, merci Killian :)
Je pensais en fait que si on ne déclarait pas une fonctions static (par un prototype), on pourrait avoir des problèmes à la compilation du fichier selon l'ordre dans lequel on a placé les fonctions.
=> Cela ne peut-il pas arriver ?
Je pensais en fait que si on ne déclarait pas une fonctions static (par un prototype), on pourrait avoir des problèmes à la compilation du fichier selon l'ordre dans lequel on a placé les fonctions.
=> Cela ne peut-il pas arriver ?
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
24 janv. 2007 à 11:23
24 janv. 2007 à 11:23
à mon avis, il y a quelque chose qui t'échape.
un .h n'a rien de magique, c'est juste du texte copier puis coller dans un fichier source. Son intéret est de facilité l'écriture la lecture des fichiers sources, et d'éviter certaines erreur.
"static" permet de déclarer une fonction/une variable qui ne sera accesible que depuis le fichier source considérer. Il n'a pas d'autre role.
Le problème d'ordre des fonctions n'interviens que si tu défini tes fonctions en meme temps que tu les déclare ET que tu utilise une fonction pas encore déclarer. ex. :
int f1(double a){if(f2(a)<0)return 10; else return 20;}
int f2(double a){return int(2*a+3-a*a);}
il y aura une erreur dans le if, car le compilaeur n'a jamais entendu parler de f2.
En tout cas, static n'a rien à voir la dedans.
L'interet de static est que tu peux avoir une fonction f dans un fichier a.c qui calcul le carré d'une valeur et une fonction f (donc de meme nom) dans un fichier b.c qui calcul la racine caré d'un nombre, sans qu'il y ai une erreur de compilation lors de l'éedition de lien (erreur sans static : f est défini deux fois)
un .h n'a rien de magique, c'est juste du texte copier puis coller dans un fichier source. Son intéret est de facilité l'écriture la lecture des fichiers sources, et d'éviter certaines erreur.
"static" permet de déclarer une fonction/une variable qui ne sera accesible que depuis le fichier source considérer. Il n'a pas d'autre role.
Le problème d'ordre des fonctions n'interviens que si tu défini tes fonctions en meme temps que tu les déclare ET que tu utilise une fonction pas encore déclarer. ex. :
int f1(double a){if(f2(a)<0)return 10; else return 20;}
int f2(double a){return int(2*a+3-a*a);}
il y aura une erreur dans le if, car le compilaeur n'a jamais entendu parler de f2.
En tout cas, static n'a rien à voir la dedans.
L'interet de static est que tu peux avoir une fonction f dans un fichier a.c qui calcul le carré d'une valeur et une fonction f (donc de meme nom) dans un fichier b.c qui calcul la racine caré d'un nombre, sans qu'il y ai une erreur de compilation lors de l'éedition de lien (erreur sans static : f est défini deux fois)
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
24 janv. 2007 à 16:11
24 janv. 2007 à 16:11
Bonjour, et tout d'abord merci de ta réponse.
En tout cas, static n'a rien à voir la dedans.
Si justement !
Imaginons j'ai un fichier "1.h" qui est inclu dans "1.c" et "2.c"
Dans "1.c" on a defini certaines fonctions statiques (ex static void statique())
Dans "1.h" on ne met pas la déclaration des fonctions statiques pour que "2.c" ne voit pas la déclaration de ces fonctions.
Le problème est que dans "1.c" seules les fonctions non statiques ont été déclaré avant d'êtres définie. Du coup une fonction non statique peut appeler une fonction statique (déclaré en même temps que la def) et qui est situé en dessous. Du coup le compîlateur ne l'a pas vu et génère une erreur.
D'où ma question, faut-il systematiquement déclarer les prototypes des fonctions statiques dans un autre fichier .h (ou directement au debut du code) ou il faut faire autre chose ?
En tout cas, static n'a rien à voir la dedans.
Si justement !
Imaginons j'ai un fichier "1.h" qui est inclu dans "1.c" et "2.c"
Dans "1.c" on a defini certaines fonctions statiques (ex static void statique())
Dans "1.h" on ne met pas la déclaration des fonctions statiques pour que "2.c" ne voit pas la déclaration de ces fonctions.
Le problème est que dans "1.c" seules les fonctions non statiques ont été déclaré avant d'êtres définie. Du coup une fonction non statique peut appeler une fonction statique (déclaré en même temps que la def) et qui est situé en dessous. Du coup le compîlateur ne l'a pas vu et génère une erreur.
D'où ma question, faut-il systematiquement déclarer les prototypes des fonctions statiques dans un autre fichier .h (ou directement au debut du code) ou il faut faire autre chose ?
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
24 janv. 2007 à 17:04
24 janv. 2007 à 17:04
Du coup une fonction non statique peut appeler une fonction statique
Houlà !! Relie bien, c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable. Ou alors, tu veux faire des choses vraiment tordus et à mon avis pas propres.
Pour ce qui est de déclaration dans les .h de fonctions static : si tu veux. Mais vu qu'elles n'ont pas de raisons d'être appeler dans un autre .c autant les mettre directement dans le source.
De plus il me semble que tu peux déclarer une fonction static séparemment de sa definition. Contrairement à ce que tu laisse penser :
... fonction statique (déclaré en même temps que la def)
Houlà !! Relie bien, c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable. Ou alors, tu veux faire des choses vraiment tordus et à mon avis pas propres.
Pour ce qui est de déclaration dans les .h de fonctions static : si tu veux. Mais vu qu'elles n'ont pas de raisons d'être appeler dans un autre .c autant les mettre directement dans le source.
De plus il me semble que tu peux déclarer une fonction static séparemment de sa definition. Contrairement à ce que tu laisse penser :
... fonction statique (déclaré en même temps que la def)
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
24 janv. 2007 à 17:13
24 janv. 2007 à 17:13
Je vais mettre un exemple ce sera plus clair.
c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable
Je n'ai pas parlé de fonction statique appelé en dehors de son fichier mais il est vrai que je n'ai pas été clair.
-----------------1.h------------------ int fonctionnormale(void); --------------------------------------- -----------------1.c------------------ #include "1.h" int fonctionnormale() { fonctionstatique(); /* <========= Inconnue ! Déclarée plus bas*/ return 0; } static int fonctionstatique() { printf("Bonjour\n"); return 0; } ---------------------------------------- -----------2.c---------------- #include "1.h" /*Blabbalbalbalablabal*/ ----------------------------
c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable
Je n'ai pas parlé de fonction statique appelé en dehors de son fichier mais il est vrai que je n'ai pas été clair.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
25 janv. 2007 à 08:37
25 janv. 2007 à 08:37
En effet, ça fonctionne pas. Mais encore une fois que ta deuxième fonction soit static ou non ne change rien.
Tu n'a qu'a faire :
Mais je viens de m'apercevoir d'un truc que je sais pas.
si tu appel fonctionnormal ailleur que dans 1.c, cette fonction fesant référence à une fonction static, le programme tournerat-il ?
Mon problème se situe là en fait.
Tu n'a qu'a faire :
-----------------1.c------------------ #include "1.h" static int fonctionstatique(); int fonctionnormale() { fonctionstatique(); /* <========= plus Inconnue ! */ return 0; } static int fonctionstatique() { printf("Bonjour\n"); return 0; } ----------------------------------------
Mais je viens de m'apercevoir d'un truc que je sais pas.
si tu appel fonctionnormal ailleur que dans 1.c, cette fonction fesant référence à une fonction static, le programme tournerat-il ?
Mon problème se situe là en fait.
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
25 janv. 2007 à 20:07
25 janv. 2007 à 20:07
J'ai demandé à droite à gauche, il semblerait qu'on ne crée pas un header spécifique pour les fonctions statiques (ne sert a rien car n'est pas utilisé par plusieurs fichiers), mais on déclare les prototypes directement dans le code.
Ex :
Ex :
-----------------1.h------------------ int fonctionnormale(void); --------------------------------------- -----------------1.c------------------ #include "1.h" static int fonctionstatique(); /* <== Déclaration dans le code */ int fonctionnormale() { fonctionstatique(); return 0; } static int fonctionstatique() { printf("Bonjour\n"); return 0; } ---------------------------------------- -----------2.c---------------- #include "1.h" /*Blabbalbalbalablabal*/ ----------------------------
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
26 janv. 2007 à 09:37
26 janv. 2007 à 09:37
Ba oui, c'est ce que je disais au post <11>
Te prend pas la tête avec ces histoires de . h, ce ne sont que des convention, des recommandations. Elles peuvent être "transgresser" si le cas se présente comme étant plus logique.
Te prend pas la tête avec ces histoires de . h, ce ne sont que des convention, des recommandations. Elles peuvent être "transgresser" si le cas se présente comme étant plus logique.
ekra
Messages postés
1870
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
342
16 juin 2007 à 21:50
16 juin 2007 à 21:50
J'avais juste oublié de te remercier :)
mamiemando
Messages postés
33390
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 novembre 2024
7 803
22 janv. 2007 à 00:50
22 janv. 2007 à 00:50
Pour moi une fonction static en C ça n'a pas de sens. Une variable oui mais pas une fonction? D'un autre côté je fais plutôt du C++ alors je peux me tromper :p