Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

Calcul de pi

Algo surpuissant

Pour accéder à cette section
Connectez-vous !
connexion_rpx

Résolu Le problème de ce sujet a été résolu

Page 1  2  Suivante
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1  2  Suivante
Hors ligne Anonyme # Posté le 27/04/2009 à 19:25:20

Bonjour !

J'ai trouvé sur le net cet algo de calcul de 2400 décimale de pi si je me souviens bien.

Edit: la source: http://www.mines.inpl-nancy.fr/~tisser [...] /pi_plus.html

Après avoir légèrement modifié le code pour le rendre plus lisible, je ne comprend toujours pas certaines choses:

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>

int a=10000, b, c=8400, d, e, f[8401], g; 
main ()
{ 
while (b - c)
	f[b++] = a/5;
for (;d = 0 , g = c * 2;c -= 14 , printf("%.4d", e + d / a), e = d % a)
	for (b = c ; d += f[b] * a, f[b] = d%--g, d /= g--, --b ; d *= b);
}


Que viennent faire les virgules dans les fonctions for ? Que veut donc dire --b, et comment lire d%--g ??
Ce qui est étrange aussi c'est qu'il fait b - c avant même d'avoir initialisé b o_O !
Merci d'avance.
Publicité # Posté le 27/04/2009 à 19:25:20

Hors ligne Hauru # Posté le 27/04/2009 à 19:27:52
Avatar

Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
alors --g c'est comme g--, mis a part je crois que la decremenation est faite avant tout : exemple d % --g est le reste de la division euclidienne de d par (g-1), alors que d % g-- est le reste de la division euclidienne de d par g, et ensuite g est décrémenté.

Pour les virgules, je suppose que c'est une manière de faire plusieurs actions consécutives.
Édité le 27/04/2009 à 19:29:10 par Hauru

La bonne santé est la plus lente façon de mourir.
 
Hors ligne anonyme # Posté le 27/04/2009 à 19:32:41

J'en prend bonne note du --g et g-- :)

Maintenant reste les virgules, je suppose que ça veut dire qu'on execute encore des choses dans la même ligne ? C'est comme si on avait fait:

instruction;
instruction0;

alors que là on fait instruction, instruction0;

C'est bien ça ?


Grilled, j'avais pas vu :p

Et sinon quelqu'un saurait expliquer le b - c avant même que b ai une valeur ?
Hors ligne Hauru # Posté le 27/04/2009 à 20:43:39
Avatar

while (b-c) signifie en fait tant que b - c est différent de 0, autrement dit, tant que b n'est pas égal à b, b valant 0 au départ (bien que non initialisé :S), on l'incrémente a chaque tour jusqu'a ce qu'il soit égal à c. La boucle s'arrete donc au bout de 8401 tours, car c vaut 8400.

La bonne santé est la plus lente façon de mourir.
 
Hors ligne zx-spectrum # Posté le 27/04/2009 à 21:10:05
http://www.worldofspectrum.org
Avatar

bonjour,

juste trois remarques :
1 : int main (void), et return 0; mon compilo préfère.!
2 : ensuite le code proposé est fait pour les gourrous ! Je suis étonné qu'il n'y ait pas "un effet de bord" du fait qu'il y ait un printf à l'intérieur du for (.....).
3: c'est illisible, au fait les tests de continuité ils sont où ?
@+
Hors ligne Holomark # Posté le 27/04/2009 à 22:06:15
Avatar

Citation : Schtroumpfette
JEt sinon quelqu'un saurait expliquer le b - c avant même que b ai une valeur ?


Ici, b est une variable externe. En C, les variables externes et statiques sont initialisées à zéro (en l'abscence de précision, bien sur) avant meme l'exécution de main().

Cela reste une pratique peu recommandée (et que vive l'euphémisme).
Édité le 27/04/2009 à 22:09:06 par Holomark
Hors ligne Varmin # Posté le 27/04/2009 à 22:39:06

Citation : zx-spectrum
1 : int main (void), et return 0; mon compilo préfère.!


La norme du langage C, n'oblige pas à mettre void dans les parenthèses du main.

:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne anonyme # Posté le 27/04/2009 à 22:49:20

Citation : zx-spectrum
bonjour,

juste trois remarques :
1 : int main (void), et return 0; mon compilo préfère.!
2 : ensuite le code proposé est fait pour les gourrous ! Je suis étonné qu'il n'y ait pas "un effet de bord" du fait qu'il y ait un printf à l'intérieur du for (.....).
3: c'est illisible, au fait les tests de continuité ils sont où ?
@+


2: effet de bord ?

3: si c'est illisible c'est parce que le gar qui a fait ce code a sans doute voulu faire un trucdelamortquitue :-°
Hors ligne zx-spectrum # Posté le 27/04/2009 à 23:02:05
http://www.worldofspectrum.org
Avatar

Citation : stroumphette
3: si c'est illisible c'est parce que le gar qui a fait ce code a sans doute voulu faire un trucdelamortquitue

100% d'accord, :lol:

ensuite effet de bord : definition
Code : C
1
for (;d = 0 , g = c * 2;c -= 14 , printf("%.4d", e + d / a), e = d % a)
ici c'est le printf inclus dans le for (.....) qui me fait dire qu'il y aurais pu avoir un comportement indéterminé ! N'étant pas un expert je demande confirmation !!


--> Ensuite jaloyan, pour ton info et par respect des personnes qui m'ont aidé
ici se trouve mon argumentation sur int main(void)!
@+
Édité le 27/04/2009 à 23:07:48 par zx-spectrum
Hors ligne Goost # Posté le 28/04/2009 à 00:05:50

Études : INSA Lyon

Salut
Citation : Schtroumpfette
Que viennent faire les virgules dans les fonctions for ?

Les virgules permettent de faire plusieurs initialisations/conditions/incrémentations.

Citation : Schtroumpfette
Que veut donc dire --b, et comment lire d%--g ??

Pour --b, ça revient à faire b--, et je dis bien revient car la différence est de l'ordre des priorités des opérations, --b sera effectué avant b--. Je te conseille de chercher les priorités des opérations, tu seras surement étonné :)
Pour "d%--g", cela veut dire qu'on cherche le reste de la division euclidienne de d par --g, càd g-1 (ici par exemple, sans parenthèse, d%--g ne donne pas le même résultat que d%g--).

Citation
ici c'est le printf inclus dans le for (.....) qui me fait dire qu'il y aurais pu avoir un comportement indéterminé ! N'étant pas un expert je demande confirmation !!

On peut tout mettre dans les parenthèses d'un for et rien dans les accolades, de la même façon en C on peut tout mettre sur une seule ligne sans espace, la différence est la même : lisibilité.
Édité le 28/04/2009 à 00:08:19 par Goost

On peut tromper une fois mille personnes mais on ne peut pas tromper mille fois une personne :D
Secret (cliquez pour afficher)
Et voilà, un de plus... Petit curieux ! Ne lis-tu pas les mises en garde?
 
Connecté Floooder # Posté le 28/04/2009 à 00:15:16

zx-spectrum, la question des effets de bords en C ne se pose même pas...

Le C est un langage impératif, il est donc basé sur les effets de bord.

D'autre part, un effet de bord n'est pas un comportement indéterminé.

Exemple :Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void f( int * a )
{
   (*a)++;
}

int main (void)
{
   int a = 0;
   
   printf("%d\n", a);

   f(&a);
   printf("%d\n", a);

   f(&a);
   printf("%d\n", a);

   return 0;
}


On remarque que la même ligne de code produit des résultats différents ;)
Hors ligne Eusebus # Posté le 28/04/2009 à 13:46:50
FGRAJ, autorisé atterrissage
Avatar

Citation : Jaloyan1
Citation : zx-spectrum
1 : int main (void), et return 0; mon compilo préfère.!


La norme du langage C, n'oblige pas à mettre void dans les parenthèses du main.


Si si, si main() ne prend pas d'argument, d'après la norme on doit mettre le void, ce qui n'est en revanche pas le cas pour le C++. Une petite confusion, je pense. :)

¹ : du riz en barre.
 
Hors ligne intMain # Posté le 28/04/2009 à 13:56:44
Avatar

Bref, le code est tout pourri ...
Avec tout le respect que je dois au programmeur, encore un idiot qui a cru bon d'essayer d'optimiser au maximum son code source alors que le compilateur le fait très bien tout seul !

Pure perte de temps et de lisibilité !!

Ps: je parle de la programmation séquentielle :)
Édité le 28/04/2009 à 13:57:13 par intMain

Image utilisateur
Image utilisateur
 
Hors ligne Eusebus # Posté le 28/04/2009 à 14:32:25
FGRAJ, autorisé atterrissage
Avatar

Pour le code de départ, ça n'est pas étonnant, si je cite un extrait du lien du PO, il est écrit au sujet de ce code :

Citation : lien du PO
Enfin, à titre de contre exemple un site intitulé "De la programmation imbitable" (qui était à l'adresse www-inf.enst.fr/~cottin/bizarre/bizarre.html),
proposait, entre autres horreurs, ce programme C de calcul des 2400 premières décimales de pi :


On "comprend" mieux le pourquoi du comment... :p
Édité le 28/04/2009 à 14:32:50 par Eusebus

¹ : du riz en barre.
 
Hors ligne IATGOF # Posté le 28/04/2009 à 14:33:10
Avatar

Études : Epitech Bordeaux

Citation : intMain
Bref, le code est tout pourri ...
Avec tout le respect que je dois au programmeur, encore un idiot qui a cru bon d'essayer d'optimiser au maximum son code source alors que le compilateur le fait très bien tout seul !

Comme déjà dit, ça fait "très classe" d'avoir un code totalement illisible et que personne ne comprend...
Citation : http://www.mines.inpl-nancy.fr/%7Etisseran/cours/pi/pi_plus.html
Enfin, à titre de contre exemple un site intitulé "De la programmation imbitable" (qui était à l'adresse www-inf.enst.fr/~cottin/bizarre/bizarre.html), proposait, entre autres horreurs, ce programme C de calcul des 2400 premières décimales de pi :


Petite précision, for n'est pas une fonction mais un mot-clé du langage C.

edit: grilled tray fort
Édité le 28/04/2009 à 14:33:34 par IATGOF
Hors ligne Goost # Posté le 28/04/2009 à 14:34:02

Études : INSA Lyon

Citation : intMain
Bref, le code est tout pourri ...
Avec tout le respect que je dois au programmeur, encore un idiot qui a cru bon d'essayer d'optimiser au maximum son code source alors que le compilateur le fait très bien tout seul !

Pure perte de temps et de lisibilité !!

Ps: je parle de la programmation séquentielle :)

On peut faire bien pire tu sais ^^

On peut tromper une fois mille personnes mais on ne peut pas tromper mille fois une personne :D
Secret (cliquez pour afficher)
Et voilà, un de plus... Petit curieux ! Ne lis-tu pas les mises en garde?
 
Hors ligne Holomark # Posté le 28/04/2009 à 14:36:41
Avatar

Citation : Eusebus
Citation : Jaloyan1
Citation : zx-spectrum
1 : int main (void), et return 0; mon compilo préfère.!


La norme du langage C, n'oblige pas à mettre void dans les parenthèses du main.


Si si, si main() ne prend pas d'argument, d'après la norme on doit mettre le void, ce qui n'est en revanche pas le cas pour le C++. Une petite confusion, je pense. :)


Eh non, il a raison, la précision void n'est pas nécéssaire dans la définition d'une fonction, d'ailleurs on retrouve plusieurs exemples de ce type dans le K&R :
Code : C
1
2
3
4
main ()
{
    /* ... */
}

... quoique cela reste, pour moi, une faute de goût. Je ne m'en suis rendu compte moi-même que récément alors que j'avais déjà soutenu le contraire.

En revanche, void reste obligatoire dans le cadre d'une déclaration de fonction (prototype) en C89 (en C99, Candide avait fait remarquer qu'il s'agissait d'une obsolescence).

PS : Je n'ai pas la norme sous la main, mais je doute qu'elle contredise le K&R.
Édité le 28/04/2009 à 15:17:43 par Holomark
Hors ligne Eusebus # Posté le 28/04/2009 à 14:50:57
FGRAJ, autorisé atterrissage
Avatar

Et pourtant, si. ^^ J'ai la norme sous les yeux, et il y est stipulé, je cite :

Citation : Norme ISO/IEC 9898:201x - Draft du 1/03/2009 - 5.1.2.2.1 Program startup
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.


Edit : je viens de vérifier également dans la norme C89 et elle stipule la même chose.
Édité le 28/04/2009 à 15:06:36 par Eusebus

¹ : du riz en barre.
 
Hors ligne Holomark # Posté le 28/04/2009 à 15:11:12
Avatar

Citation : Eusebus
Et pourtant, si. J'ai la norme sous les yeux, et il y est stipulé, je cite :

Citation : Norme ISO/IEC 9898:201x - Draft du 1/03/2009 - 5.1.2.2.1 Program startup
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.

Je ne cherche pas à avoir absolument raison, mais le passage que tu cites indique simplement que main() a deux formes ; l'une sans argument, l'autre en prenant deux et chacune renvoyant un entier, ce que ne contredit pas la forme que j'ai cité :
Code : C
1
main () { /* .. */ } /* Rappel (au cas où) : 'int' est implicite quand le type de retour n'est pas précisé */


Je ne vois pas mention d'une obligation à préciser void (mais je suis tout à fait preneur si tu en trouve une ailleurs).
Édité le 28/04/2009 à 15:13:27 par Holomark
Hors ligne Tados # Posté le 28/04/2009 à 15:29:19
YOU … are The Chosen One …
Avatar

Citation : Holomark
la précision void n'est pas nécéssaire dans la définition d'une fonction
Je crois bien que c'est faux.
Il est nécessaire dans la définition, pas dans la déclaration :

Citation : ISO/IEC 9899:1999 (6.7.5.3 - 3)
An identifier list in a fonction declarator that in not part of a definition of that fonction shall be empty
L'exemple est donc bien faux.

C'est un peu plus compliqué en fait :
Citation : ISO/IEC 9899:1999 (6.7.5.3 - 10)
The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameter
Citation : ISO/IEC 9899:1999 (6.7.5.3 - 14)
An identifier list declares only the identifiers of the parameters of the fonction. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.
The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.




Pour ce qui est du int, je ne crois pas que l'on puisse s'en passer, mais je n'ai pas sous les yeux le passage de la norme qui nous en parle.
Édité le 28/04/2009 à 15:51:00 par Tados

Image utilisateur[Tutoriel]
Débuguer facilement
avec valgrind

" … the one who will deliver The Message … "





Image utilisateur[En rédaction]
Accélérer l'allocation
dynamique en C







Image utilisateur





Image utilisateur
"C is a sharp tool"
 
Hors ligne Eusebus # Posté le 28/04/2009 à 15:47:17
FGRAJ, autorisé atterrissage
Avatar

Citation : Holomark
Je ne vois pas mention d'une obligation à préciser void (mais je suis tout à fait preneur si tu en trouve une ailleurs).


Je ne sais pas ce qu'il faut te montrer de plus, les deux seuls prototypes acceptés par la norme sont ceux que j'ai cités, les autres ne sont pas conformes.

Cf la FAQ de fr.comp.lang.c ici : http://www.usenet-fr.news.eu.org/fur/c [...] /faq-c-2.html à la section 9.4

En espérant avoir répondu à tes interrogations. :)
Édité le 28/04/2009 à 15:48:37 par Eusebus

¹ : du riz en barre.
 
Hors ligne Tados # Posté le 28/04/2009 à 16:24:22
YOU … are The Chosen One …
Avatar

Citation : ISO/IEC 9899:1999 (6.2.1 - 3)
A function prototype is a declaration of a function that declares the types of its parameters.


Citation : Eusebus
Citation : Holomark
Je ne vois pas mention d'une obligation à préciser void (mais je suis tout à fait preneur si tu en trouve une ailleurs).


Je ne sais pas ce qu'il faut te montrer de plus, les deux seuls prototypes acceptés par la norme sont ceux que j'ai cités, les autres ne sont pas conformes.

Citation : Norme ISO/IEC 9898:201x - Draft du 1/03/2009 - 5.1.2.2.1 Program startup
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.



Code : C
1
2
int main(void)
int main()
Ces deux prototypes semblent bel et bien spécifier exactement la même chose. (cf mon post ci-dessus)
Pourquoi ne seraient-ils pas équivalents ? (EDIT : (petit oubli) lorsqu'ils font partie d'une définition de la fonction main)
Édité le 28/04/2009 à 17:14:12 par Tados

Image utilisateur[Tutoriel]
Débuguer facilement
avec valgrind

" … the one who will deliver The Message … "





Image utilisateur[En rédaction]
Accélérer l'allocation
dynamique en C







Image utilisateur





Image utilisateur
"C is a sharp tool"
 
Hors ligne Holomark # Posté le 28/04/2009 à 17:01:09
Avatar

Citation : Tados
Citation : Holomark
la précision void n'est pas nécéssaire dans la définition d'une fonction
Je crois bien que c'est faux.
Il est nécessaire dans la définition, pas dans la déclaration :

Citation : ISO/IEC 9899:1999 (6.7.5.3 - 3)
An identifier list in a fonction declarator that in not part of a definition of that fonction shall be empty
L'exemple est donc bien faux.

C'est un peu plus compliqué en fait :
Citation : ISO/IEC 9899:1999 (6.7.5.3 - 10)
The special case of an unnamed parameter of type void as teh only item in the list specifie that the function has no parameter
Citation : ISO/IEC 9899:1999 (6.7.5.3 - 14)
An identifier list declares only the identifiers of the parameters of the fonction. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.
The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.

Ce qui reprend un point que j'avais efleuré ici et éxplicité il y a longtemps dans ce forum ; dans la déclaration d'une fonction la précision void est obligatoire pour signifier que la fonction n'attends pas d'argument, mais une liste d'arguments vide indique au compilateur de "ne pas faire de supposition quant aux arguments attendus pas la fonction" ainsi les deux prototypes suivants :
Code : C
1
int foo(void);

Code : C
1
int foo();

... sont valides, mais pas équivalents. Dans le K&R il est mentionné que cette subtilité doit permettre la compatibilité avec les déclarations faites dans l'ancien style (pré-ANSI).

Je rappel tout de même que le sujet de mon intervention n'était pas dans le cadre de la déclaration d'une fonction (prototype) mais dans celui d'une définition.

Citation : Tados
Pour ce qui est du int, je ne crois pas que l'on puisse s'en passer, mais je n'ai pas sous les yeux le passage de la norme qui nous en parle.


Citation : K&R §A7.3.2
Un appel de fonction se compose d'une expression postfixée, appelée le désignateur de fonction, suivie de parenthèses contenant une liste, éventuellement vide, d'expressions d'affectation séparées par des virgules. (§A7.17), qui constituent les arguments de la fonction. Si cette expression postfixée est un identificateur dont il n'existe pas de déclaration dans la portée courante, cet identificateur est déclaré implicitement, comme comme si l'on avait fait figurer la déclaration
Code : C
1
extern int identificateur ();

dans le bloc où se trouve l'appel de fonction.

Ce passage explique que, vulgairement, le type par défaut d'une fonction est int.

On trouve une autre mention rapide :
Citation : K&R §1.9 (à propos d'un code donné plus haut dans le texte)
Cette ligne déclare aussi que lireligne retourne une valeur de type int ; néanmoins, comme le type par défaut de la valeur de retour est int, il n'était pas obligatoire de le préciser ici.


Note : Je ne dispose pas de la version originale (en anglais) du K&R, mais si quelqu'un y relève une subtilité suplémentaire ou une contradiction avec ma version française je l'invite à ne surtout pas se retenir. Evidement, un élément de la norme qui contredirait ceci est également bienvenu.

Citation : Eusebus
Citation : Holomark
Je ne vois pas mention d'une obligation à préciser void (mais je suis tout à fait preneur si tu en trouve une ailleurs).
Je ne sais pas ce qu'il faut te montrer de plus, les deux seuls prototypes acceptés par la norme sont ceux que j'ai cités, les autres ne sont pas conformes.

Je ne peux que me répéter, je lis seulement que main() a deux formes valides :
- l'une renvoie un entier et ne prend pas d'argument
- l'autre renvoie un entier mais prend deux arguments ; un entier et un tableau de pointeurs sur un type char.

Prendre le paragraphe que tu proposes et en sortir que "on doit préciser void dans la liste des arguments de main() quand il ne prend pas d'argument" ou que, formulé différemment, "les formes Code : C
1
main() { /* ... */ }
et Code : C
1
int main (void) { /* ... */ }
... ne sont pas équivalentes" relève, à mon avis, de la sur-interprétation.

Dans le même genre d'idée, l'écriture suivante :
Code : C
1
int main (int ac, char ** av) { /* ... */ }

... que j'ai souvent vu, notement dans des codes produits à l'EPITECH, ne serait-elle pas conforme ?

Citation : Eusebus

Cf la FAQ de fr.comp.lang.c ici : http://www.usenet-fr.news.eu.org/fur/c [...] /faq-c-2.html à la section 9.4

Merci, c'est le premier texte à ma disposition qui (dans sa dernière partie)rend void obligatoire. Mais peut-on prendre cette FAQ pour une norme ? (pourquoi pas, mais considérer le K&R comme telle n'est pas une évidence non plus).
Édité le 28/04/2009 à 17:04:07 par Holomark
Hors ligne Nab # Posté le 28/04/2009 à 17:14:04
KISS
Avatar
Flux RSS

Citation : Tados
C'est un peu plus compliqué en fait :Citation : ISO/IEC 9899:1999 (6.7.5.3 - 14)
An identifier list declares only the identifiers of the parameters of the fonction. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.
The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
En effet, ça devient surtout confus quand on lis ça :
Citation : ISO/IEC 9899:TC3 (6.7.5.3 §4)
An identifier list in a function declarator that is not part of a definition of that function shall be empty.
(souligné par mes soins).

Si je comprend bien, si la déclaration fait partie de la définition, la liste d'identificateurs ne peut pas être vide, mais si elle l'est ça veut dire que cette fonction n'a pas de paramètres…
Qui pour éclairer ma lanterne ?

Image utilisateur
Projets & contributions : CTPL | SCE | libbnss
Langages : Norme C99 (TC3, PDF 3.61MB) | Vala | Python
Bibliothèques : GTK+, doc GTK+ | doc GLib | doc GObject | doc GDK | doc GDK-Pixbuf | doc GIO
FAQs : FAQ C | FAQ OpenGL / SDL / GTK+
Programmes : GCC | Geany | GNOME | Valgrind | GDB ; mais aussi : Blender | Gimp | Inkscape
OS : Debian GNU/Linux
 
Hors ligne anonyme # Posté le 28/04/2009 à 17:53:22

Je vous remercie tous pour avoir répondu à mes questions ^^

Concernant cette histoire de int main (void) ou pas, je n'en sais trop rien, mais le choix de mettre un void ou pas se fait à mon avis quand on cherche quelquechose de bien précis à faire. Du moins, je n'ai pas bien compris les articles (j'ai survolé) que vous avez postés, mais il semblerait qu'on mette un void ou non dans certains cas précis et pas dans d'autres :)

PS: après avoir vu tous les posts je pensais que le topic était parti en vrille mais je vois que personne n'a sorti les crocs ;)
Hors ligne Eusebus # Posté le 28/04/2009 à 18:02:25
FGRAJ, autorisé atterrissage
Avatar

Je n'ai pas cité tout le passage de la norme ce qui a déclenché une petite confusion pour Tados. Le "or equivalent" que tu as souligné se rapporte au type de retour de main ainsi qu'au type de ses arguments. La note 9) est suffisamment explicite à ce sujet :

Citation
Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as char ** argv, and so on.


Sinon concernant la forme utilisée par l'EPITECH, elle est tout à fait valide, la norme n'impose pas de nom spécifique aux arguments de main, juste leur type.

Ca n'est pas de la surinterprêtation je pense, simplement je ne m'appuie que sur la norme (et non pas le K&R qui ne peut en aucun cas être assimilé à une quelconque norme) qui spécifie, je le répète encore une fois, les deux seuls prototypes valides. Et non, rien ne garantit que
Code : C
1
2
3
int main(void) { /* ... */}
/* et */
main() { /* ... */}

sont équivalents, vu qu'en l'absence du void, le compilateur ne fait aucune supposition sur le nombre d'arguments; le void garantit en revanche qu'elle n'en prend pas.
Aussi, je ne vais pas m'amuser à citer toute la norme, mais néanmoins elle impose que le type de retour soit spécifié (paragraphe 6.7). En ayant épluché les syntaxes licites indiquées dans cette partie, il apparait que tous les déclarateurs indiquent le type de retour. Je n'ai pas vu dans la norme un quelconque passage qui dit que le type de retour par défaut en l'absence de spécification explicite soit un int; peut-être est-ce simplement au bon vouloir du compilateur (je penche d'ailleurs pour cette hypothèse, à vérifier).

@Schtroumpfette :

Le problème c'est que c'est un débat technico-technique qui tourne autour d'une zone plus ou moins trouble. Les textes eux-mêmes ne sont pas forcément très limpides... Et on essaie d'exposer des arguments de manière suffisamment claire (ce qui n'est pas forcément facile, là je viens de me payer presque une heure de lecture de la norme, je vois des mots-clés de syntaxe partout :pirate: ). Mais tant que ça reste convivial, le débat reste intéressant je pense (même si on tourne un peu en rond, il est vrai ^^ ).
Édité le 28/04/2009 à 18:36:05 par Eusebus

¹ : du riz en barre.
 
Hors ligne ok # Posté le 28/04/2009 à 18:05:56
#!/bin/sh
Avatar

Études : CNAM

@ Schtroumpfette : Bah tout simplement, quand tu n'utilises pas les paramètres de la fonction main (ce qui semble être le cas), tu met void (int main (void) ).

OS utilisés couramment : CentOS, Fedora, Suse, Kubuntu, Windows
Langages utilisés : C, Java, PHP, JS, xHTML/CSS, Bash, SQL, PL/PgSQL, Perl
SGBD utilisés : PostgreSQL, MySQL
Méthodes d'analyse et langages de conception connus : Merise, UML
=> Liens : InfosLinux (mon site) | Exercices Bash (dvp.com)
 
Hors ligne Akiel # Posté le 28/04/2009 à 18:10:51
Avatar

Études : Université de Poitiers

Bonsoir,

Débat très intéressant.

Citation : Eusebus
Ca n'est pas de la surinterprétation je pense, simplement je ne m'appuie que sur la norme (et non pas le K&R qui ne peut en aucun cas être assimilé à une quelconque norme) qui spécifie, je le répète encore une fois, les deux seuls prototypes valides. Et non, rien ne garantit que
Code : C
1
2
3
int main(void) { /* ... */}
/* et */
main() { /* ... */}

sont équivalents, vu qu'en l'absence du void, le compilateur ne fait aucune supposition sur le nombre d'arguments; le void garantit en revanche qu'elle n'en prend pas.


Je penche pour la même interprétation que toi. A l'époque j'avais aussi lu en long la norme (C99 pas C89 certes) et les seuls passages véritablement explicites sur la fonction main ont déjà été cités.


La violence est le dernier refuge de l'incompétence.
Isaac Asimov
 
Hors ligne Varmin # Posté le 28/04/2009 à 18:20:47

C'est ça qui est bien avec les normes, on ne sait jamais clairement si c'est juste ou faux.

En tout cas, dans les prototypes, lorsque tu ne précise pas void, le compilateur se dira qu'il ne sait pas le nombre d'arguments, et si tu mets void, il saura qu'il y a aucun argument(et donc il te corrigera en cas d'erreur).

Après au niveau de la déclaration d'une fonction, je ne sais pas si ce principe s'applique aussi, donc faudrait voir, mais je pensais qu'avec le main, il y a une exception(avec tout le code qu'on voit sans le void dans le main ...), après peut-être que je me suis trompé ...

Mais personnellement, même moi je mets le void dans le main par réflexe, mais il serait intéressant de savoir si la norme prévoit le cas où on met rien dans le main().
Le compilateur ne disant rien chez moi et par défaut ...

:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne Eusebus # Posté le 28/04/2009 à 18:37:16
FGRAJ, autorisé atterrissage
Avatar

Compilé avec gcc et -Wstrict-prototypes, ça envoie un warning.

¹ : du riz en barre.
 

Retour au forum "Langage C" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx