Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1362 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Question sur les fonctions??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question sur les fonctions??

n°951101
Anormal13
Posté le 11-01-2005 à 20:14:15  profilanswer
 

Bonjour à tous v'la l'anormal et ses questions bidons!!
Voila la question est simple j'ai programmé un reversi pour mon école et j'ai voulu séparer de mon "main" toutes les fonctions que j'ai pu créé pour faire ce jeu!!Jusque là pas de porbleme!!
Le truc c'est que j'utilise des variables globales pour mes fonctions mais je me demandais si il ne "valait" pas mieux d'utiliser pour chaque fonction des variables locales.
Cela pose quand meme des problemes, par exemple si j'utilise un même tableau(pour mon application le plateau de jeu est représenté par un tableau en deux dimmensions) dans une fonction et une autre fonction je fais comment pour renvoyer la valeur de mon tableau comment faire?? As-t -on besoin de la retourné?  


---------------
Hihi j'suis là ou pas?
mood
Publicité
Posté le 11-01-2005 à 20:14:15  profilanswer
 

n°951112
dreameddea​th
Posté le 11-01-2005 à 20:30:23  profilanswer
 

il n'y a pas de reponse toute faite sur comment gérer les variables et leurs répartition en modules.
Il faut minimiser (et évidemment les supprimer si possible), les variables globales et bien faire attention qui modifie quoi, ou et comment pour éviter les incohérences.  
 
Le plus simple est probablement de faire un module centralisant ta variable plateau et les fonctions le modifiant (exemple initPlateau(), ajouterPiece(), deplacerPiece(), afficherPlateau(), ...). Ainsi tu ne fais appel qu'a ces fonctions et tu centralises toutes les actions de lecture/ecriture dans une même zone geographique et ainsi tu peux séparer l'algorithme(IA) de la représentation interne du plateau.
 
Le terme est laché : séparation de les données (et la manière de modifier celles-ci), de la logique de ton code. C'est le plus propre et le plus maintenable...

n°951233
pains-aux-​raisins
Fatal error
Posté le 11-01-2005 à 22:32:13  profilanswer
 

Dreameddeath, t'es pas consultant par hasard ?
Disons que je ne suis pas un newbie en prog mais j'ai du relire plusieurs fois pour saisir la substantifique moelle de ton discours :lol:

n°951242
pains-aux-​raisins
Fatal error
Posté le 11-01-2005 à 22:36:22  profilanswer
 

Anormal13 a écrit :

Bonjour à tous v'la l'anormal et ses questions bidons!!
Voila la question est simple j'ai programmé un reversi pour mon école et j'ai voulu séparer de mon "main" toutes les fonctions que j'ai pu créé pour faire ce jeu!!Jusque là pas de porbleme!!
Le truc c'est que j'utilise des variables globales pour mes fonctions mais je me demandais si il ne "valait" pas mieux d'utiliser pour chaque fonction des variables locales.
Cela pose quand meme des problemes, par exemple si j'utilise un même tableau(pour mon application le plateau de jeu est représenté par un tableau en deux dimmensions) dans une fonction et une autre fonction je fais comment pour renvoyer la valeur de mon tableau comment faire?? As-t -on besoin de la retourné?


Simplement dit, en C, si tu passes un tableau (pointeur sur le tableau en fait) en paramètre à une fonction, tu peux directement modifier les valeurs de ce tableau. Pas besoin en théorie de retourner le (pointeur sur ce) tableau.

n°951247
mehdi_tn
Posté le 11-01-2005 à 22:47:13  profilanswer
 

neamoins si tu veux retourner un tableau a partir de tes methode: tu retourne juste le nom symbolique de la variable  
par exemple  
int * maFonction()
{
int [3] res;
 
// bla bla
 
return res;
}
 
voila mais com il l'a dis tu retourne un pointure chaque modification que tu fais est globale

n°951257
blurk
Posté le 11-01-2005 à 22:52:04  profilanswer
 

Ça c'est pas bon : res est une variable locale... En static à la rigueur.
 
La bonne déclaration serait static int res[3].


Message édité par blurk le 11-01-2005 à 22:52:57
n°951266
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-01-2005 à 22:56:59  profilanswer
 

[citation=951247,0,5]

int * maFonction()
{
int [3] res;
 
// bla bla
 
return res;
}

[/citation]
BUG! (Comportement indéfini). Il est interdit de retourner l'adresse d'une variable locale.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°951272
pains-aux-​raisins
Fatal error
Posté le 11-01-2005 à 22:59:11  profilanswer
 

oui, l'erreur est même impardonnable...

n°951274
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-01-2005 à 23:00:09  profilanswer
 

blurk a écrit :

Ça c'est pas bon : res est une variable locale... En static à la rigueur.
 
La bonne déclaration serait static int res[3].


C'est la solution 'naive', mais certainement pas la meilleure. (La fonction n'est plus réentrante). Les 'bonnes' solutions sont connues :
 

  • Passer l'adresse et la taille du tableau en paramètre
  • Allouer le tableau (malloc()) et retourner son adresse. La libération étant à la charge de l'appelant.



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°951299
mehdi_tn
Posté le 11-01-2005 à 23:36:28  profilanswer
 

Pardonnez moi vous avez tout a fait raison  
c'est l'approche algorithmique qui est a l'origine de ma reponse

mood
Publicité
Posté le 11-01-2005 à 23:36:28  profilanswer
 

n°951301
pains-aux-​raisins
Fatal error
Posté le 11-01-2005 à 23:38:02  profilanswer
 

mehdi_tn a écrit :

Pardonnez moi vous avez tout a fait raison  
c'est l'approche algorithmique qui est a l'origine de ma reponse


approche koi ? hmm je préssens en toi un grand potentiel de consultant :o

n°951310
mehdi_tn
Posté le 11-01-2005 à 23:44:37  profilanswer
 

pains-aux-raisins a écrit :

approche koi ? hmm je préssens en toi un grand potentiel de consultant :o


pains-aux-raisins a écrit :

Dreameddeath, t'es pas consultant par hasard ?
Disons que je ne suis pas un newbie en prog mais j'ai du relire plusieurs fois pour saisir la substantifique moelle de ton discours :lol:


tu traite tout le monde de consultant
on est dans un forum si t'as pas de remarques sur le sujet alors abstiens toi
En fet si t'as besoin d'une consultation :na:  :na:  

n°951317
pains-aux-​raisins
Fatal error
Posté le 11-01-2005 à 23:51:15  profilanswer
 

mehdi_tn a écrit :

tu traite tout le monde de consultant
on est dans un forum si t'as pas de remarques sur le sujet alors abstiens toi
En fet si t'as besoin d'une consultation :na:  :na:


Arf, dsl. Si tu es consultant, je m'excuse platement. :jap:

n°951415
Taz
bisounours-codeur
Posté le 12-01-2005 à 08:53:10  profilanswer
 

pains-aux-raisins a écrit :

oui, l'erreur est même impardonnable...


surréaliste ce sujet.

n°951607
db__
spécialiste de l'à peu près
Posté le 12-01-2005 à 13:33:12  profilanswer
 

Certes, il faut prendre de bonnes habitudes. Mais un tableau de réversi cela doit faire dans les 64 cases donc avec les quantités de mémoires vives actuelles pourquoi ne pas mettre tous ça en global.
Le choix de l'allocation des variables est à faire en fonction du contexte d'utilisation du programme et de ces évolutions potentielles.
Que je sache, la syntaxe du C n'empèche pas le retour d'un pointeur sur une variable locale. Chacun a le droit de faire un segmentation fault quand il veut.

n°952715
Anormal13
Posté le 13-01-2005 à 22:36:37  profilanswer
 

Oki merci beaucoup pour les réponses. Le seul truc qui m'intrigue pourquoi on a pas le droit de retourner l'adresse d'une variable locale???
Quand on fait un return toto; on renvoit l'adresse de toto et non son contenu si je comprend bien???
 
Pour Dream suis pas consultants vient de commencer la prog depuis deux - trois mois alors désolé pour les explications foireuses mais on fait parfois comme on peut!!!


---------------
Hihi j'suis là ou pas?
n°952717
Taz
bisounours-codeur
Posté le 13-01-2005 à 22:39:31  profilanswer
 

non. On renvoit toujours une copie
 
si tu as  
 
 
int * maFonction()
{
int [3] res;
 
// bla bla
 
return res;
}  
 
 
res est converti implicitement en int*. Seulement quand res sort de portée, il est automatiquement désalloué. Résultat : t'as un pointeur sur une zone mémoire qui "n'existe plus"

n°952722
pains-aux-​raisins
Fatal error
Posté le 13-01-2005 à 22:45:04  profilanswer
 

Disons que c'est une histoire d'allocation automatique de la variable par le compilateur.
Quand tu déclares un variable dans le corps d'une fonction, le compilateur, bête et discipliné, va réserver l'espace mémoire correspondant au type de la variable "durant l'appel de la fonction" (pour faire simple).  Quand on quitte la fonction, le compilateur va restituer l'espace mémoire au système. Cet espace mémoire n'étant plus réservé, après l'appel de la fonction, il peut contenir tout à fait autre chose que la valeur de ta variable.
Tu comprendra ainsi que si tu retourne l'adresse d'une variable locale, cela est syntaxiquement correct, mais le contenu de l'adresse pointée a des chances pour qu'il ne corresponde plus au contenu de ta variable locale...
 
edit : j'avais pas vu le post de Taz


Message édité par pains-aux-raisins le 13-01-2005 à 22:45:44
n°953053
db__
spécialiste de l'à peu près
Posté le 14-01-2005 à 12:48:31  profilanswer
 

Au moins sur processeur intel, les variables automatiques (locales) sont allouées dans la pile juste après l'adresse de retour au programme appelant. Juste avant cette adresse, on trouve les paramètres de la fonction.
Lors du retour de la fonction, le pointeur de pile pointera donc sur les paramètres d'appel de la fonction. S'il y a un appel à une fonction ou bien un appel système voir une interruption entre le return de la fonction et l'utilisation des données pointées, elles seront alors modifiées. Si on ne fait que lire cette zone, on lira n'importe quoi mais il n'y aura pas de plantage (il peut y en avoir suite au données abérrantes lues). En revanche, si on écrit à cet endroit, on va écraser les variables locales d'un autre sous programmes ou pire écrire sur une adresse retour et là ---> segmentation fault
Il doit être possible de déclarer en local une variable static qui n'est alors plus alloué sur la pile mais à part de se faire traiter d'auteur de code boueux je n'en vois pas trop l'intéret.

n°953964
Anormal13
Posté le 16-01-2005 à 17:16:07  profilanswer
 

Oki merci a tous pour ces réponses clairs et précises et surement a une prochaine pour les questions bidon d'l'anormal!


---------------
Hihi j'suis là ou pas?

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Question sur les fonctions??

 

Sujets relatifs
Fichiers et fonctionsPetite question sur un code pour Thumbnail
fonctions systemesquestion son
Petite questionquestion sur les fonctions virtuelles
question heritage et appel de fonctions membresPointeurs sur fonctions (question pointue !)
[ALGO] question de débutant sur les fonctions...Petite question sur un éventuel fonct des fonctions en //
Plus de sujets relatifs à : Question sur les fonctions??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR