Question sur les fonctions?? - C - Programmation
Marsh Posté le 11-01-2005 à 20:30:23
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...
Marsh Posté le 11-01-2005 à 22:32:13
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
Marsh Posté le 11-01-2005 à 22:36:22
Anormal13 a écrit : Bonjour à tous v'la l'anormal et ses questions bidons!! |
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.
Marsh Posté le 11-01-2005 à 22:47:13
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
Marsh Posté le 11-01-2005 à 22:52:04
Ça c'est pas bon : res est une variable locale... En static à la rigueur.
La bonne déclaration serait static int res[3].
Marsh Posté le 11-01-2005 à 22:56:59
[citation=951247,0,5]
int * maFonction() |
[/citation]
BUG! (Comportement indéfini). Il est interdit de retourner l'adresse d'une variable locale.
Marsh Posté le 11-01-2005 à 23:00:09
blurk a écrit : Ça c'est pas bon : res est une variable locale... En static à la rigueur. |
C'est la solution 'naive', mais certainement pas la meilleure. (La fonction n'est plus réentrante). Les 'bonnes' solutions sont connues :
Marsh Posté le 11-01-2005 à 23:36:28
Pardonnez moi vous avez tout a fait raison
c'est l'approche algorithmique qui est a l'origine de ma reponse
Marsh Posté le 11-01-2005 à 23:38:02
mehdi_tn a écrit : Pardonnez moi vous avez tout a fait raison |
approche koi ? hmm je préssens en toi un grand potentiel de consultant
Marsh Posté le 11-01-2005 à 23:44:37
pains-aux-raisins a écrit : approche koi ? hmm je préssens en toi un grand potentiel de consultant |
pains-aux-raisins a écrit : Dreameddeath, t'es pas consultant par hasard ? |
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
Marsh Posté le 11-01-2005 à 23:51:15
mehdi_tn a écrit : tu traite tout le monde de consultant |
Arf, dsl. Si tu es consultant, je m'excuse platement.
Marsh Posté le 12-01-2005 à 08:53:10
ReplyMarsh Posté le 12-01-2005 à 13:33:12
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.
Marsh Posté le 13-01-2005 à 22:36:37
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!!!
Marsh Posté le 13-01-2005 à 22:39:31
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"
Marsh Posté le 13-01-2005 à 22:45:04
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
Marsh Posté le 14-01-2005 à 12:48:31
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.
Marsh Posté le 16-01-2005 à 17:16:07
Oki merci a tous pour ces réponses clairs et précises et surement a une prochaine pour les questions bidon d'l'anormal!
Marsh Posté le 11-01-2005 à 20:14:15
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?