[C]Effet de bords

Hello,

Petite question théorique, logique et pandémique concernant le C.

Je fais une action fréquemment dans une fonction(1), et j’ai donc pensé déclarer une fonction(2) à l’intérieur de (1) car à chaque fois, il s’agit du meme code à effectuer.

La question : Les modifications se font sur plusieurs variables, structures, tableaux locaux à la fonction(1), si je définis la fonction(2) à l’intérieur de la fonction(1), j’agis sur les données à modifier par effet de bord, et cela, je pense est mal. Faut-il mieux que je déclare la fonction(2) en dehors de la fonction(1) en passant les données à modifier par paramètres (sachant qu’il y en a beaucoup, et que cela doit être fait par pointeur). Facilité vs Rigueur ?

Que choisir ?

[code]void fonction1(){
int bla;
maStructure bli;

void fonction2(){
	// modification par effet de bord

}

fonction2();

}[/code]

Merci tu viens de m’apprendre un truc, la déclaration de fonction dans une fonction. :stuck_out_tongue:

Si tu comptes un jour passer ton code C++ je te conseille plutôt de déclarer la fonction2 en defors de ta fonction 1, car le C++ supporte pas les nested functions. (après un pti test) En plus c’est plus lisible, enfin à mon goût.

Moi je trouve ça sal et moche, a mon avis, il faut repensser ton truc.

En C Standard les fonctions imbriquées n’existent pas.

Les "nested functions"sont une extension de gcc, donc si tu veux changer de compilo …
Tu peux avoir un gain de performance en les utilisant car une variable passée par pointeur ne peut pas etre stockée dans un registre, mais il faut vraiment avoir une bonne raison de le faire.

Bref, c’est un outils mis a ta disposition, à toi de juger si c’est vraiment necessaire, personnellement je ne le ferrais pas, le C a été conçu dans une vieille optique linéaire autant respecter ses paradigmes.

donc exemple :

[code]void fonction1(){
int i;

fonction2(&i);
}

void fonction2(int* bla){
*bla = 4;
}[/code]

Voilà ce que j’aimerais faire, mais le truc c’est que j’ai beaucoup de variables, des tableaux etc… donc beaucoup de paramètres, donc compliqué car beaucoup de pointeurs pour fonction2…
J’ai besoin d’une fonction2 car j’utilise ces mise à jour à différents endroits dans fonction1 (boucles). Voilà, quelle solution pourrait être faisable ?

pourquoi ne pas regrouper les variables dans une structure et passer le pointeur de celle ci?

Moi je dis simplicité. Il fut une époque où j’aurais fait une macro, ne connaissant pas les fonctions imbriquées.
Si ton code est bien commenté, je ne vois pas la raison qui t’empecherais d’utiliser des fonctions imbriquées, surtout si tu n’a pas besoin d’appeller cette fonction imbriquée (ou une similaire) ailleurs.

Pour factoriser le code, je ferrais aussi une Macro (si j’ai a peu pres visualisé ton cas)… Enfin, ca depend vraiment des cas.

Le mieux est quand meme de recreer une nouvelle fonction, mais si jamais c’est une fonctions avec 50 arguments, avec passage de plein d’indices de boucles, c’est plutot sale.

:stuck_out_tongue:
Une pandémie est la contagion d’une maladie qui s’étend à la quasi-totalité d’une population d’un continent ou de plusieurs continents, voire dans certains cas de la planète.

Étymologie :Le terme pandémie vient du grec pan (qui signifie tous) et demos (qui signifie le peuple).

http://fr.wikipedia.org/wiki/Pand%C3%A9mique

Une pandémie est la contagion d’une maladie qui s’étend à la quasi-totalité d’une population d’un continent ou de plusieurs continents, voire dans certains cas de la planète.

Étymologie :Le terme pandémie vient du grec pan (qui signifie tous) et demos (qui signifie le peuple).

http://fr.wikipedia.org/wiki/Pand%C3%A9mique[/quote]

Merci pour cette intéressante précision, qui, répond parfaitement la question posée. Ou alors on s’en branle que pandémique s’applique pas ici et on prend ca comme du second degré, histoire de faire la rime, parce que le truc vraiment intéressant, c’est la question de Maverick ? Moi je vote que oui.

Les fonctions imbriquées ne sont pas standarts (et je ne savais pas que cela existait) donc ce n’est pas terrible de les utiliser.

Je te conseille aussi d’écrire ta fonction 2 à l’extérieur, comme n’importe quelle fonction, et si tu veux vraiment réduire ton nombre de paramètres, tu peux créer une structure, l’un des avantages non négigeable étant que tu peux faire évoluer ta structure sans modifier la signature de la fonction.

Tu peux aussi déclarer un nombre variable de paramètres à ta fonction en utilisant ‘…’. Ensuite charge à toi de connaitre le nombre et l’ordre de tes paramètres.

Je suis ravi que tu trouves ma precision interessante. Ca me rassure, j’avais peur que tout le monde s’en foute ici.
Je trouve que ca te stresse le C, tu devrais faire des pauses des fois… :stuck_out_tongue:

Ok merci à tous (et à twen surtout). Je vais rester avec une fonction imbriquée… Je ne l’utilise que là…

Alors on va faire simple, on va faire pédagogique, on va faire explicite, utiliser des fonctions imbriquées est une manifestation latente de déviances sexuelles graves. Ce n’est pas standard, c’est source de bug est c’est un non sequitur vis à vis du paradigme de la programmation impérative.

Il ne faut pas le faire, jamais, il n’y a aucune raison de le faire. Le but de la fonction est de regrouper au sein d’une unité logique une séquence d’opérations. La fonction imbriquée f2() est donc déclarée dans la fonction f1(), ce qui veut dire que seule f1() peut l’utiliser. C’est donc une architecture qui va te pousser à dupliquer du code au pire et au mieux créer un couplage entre f1() et f2().

Plus ton code est découplé, moins il a de chances d’être buggé. Pourquoi ? Un code couplé est un code plus complexe où les interactions entre deux fonctions augmentent le nombre de chemins logiques.

D’après ce que tu dis, ta fonction f1() est très mal pensée. C’est un indice que tu as essayé de regrouper dans une fonction (en l’occurence f1()), du code qui devrait être dans plusieurs fonctions différentes. Ca résoudrait sans doute ton nombre de paramètres (et qu’est-ce qui t’empêche de regrouper tous ces paramètres dans une structure ?)