Langage C

Discutez d'informatique ici !
Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 29 Sep 2013, 16:31

et allez continuons à débiter des énormités.
Je pense qu'il vaut mieux éviter ce genre de commentaire.


ben non on se passe pas de ce genre de commentaires. Tu débites des énormités encore une fois. S'il y a un genre de commentaire dont il faut se passer ce sont typiquement tes affirmations.

le 0 erreurs, c'est une connerie monumentale.
T'as un cdc tu le respectes (du moins c'est le but). Le reste, advienne que pourra.
Même si ici c'est trivial,
- si l'utilisateur il écrit ses nombres en toute lettres, c'est son problème.
- si l'utilisateur décide d'inverser mini et maxi
- si l'utilisateur décide de saisir des nombres flottants, avec des virgules, ou avec des points
- si l'utilisateur décide d'écrire en notation scientifique
- si l'utilisateur décide d'écrire des entiers relatifs
....

sont des cas qui ne sont pas forcément dans le cdc. Auquel cas, c'est son problème.
la vie est une fête :)



Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 29 Sep 2013, 17:31

Je suis sur Code Blocks mais ça ce n'est qu'un éditeur; et je compile avec Gcc.

Dans tous les cas, j'essaierais de compiler ce code là sous linux une fois en cours !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 29 Sep 2013, 17:36

Il y a de nouvelles choses en C99 qui sont autorisées comme par exemple la déclaration d'un tableau à partir d'une variable.

Code: Tout sélectionner

/* En C89 et version précédente on peut écrire*/
int *tab = NULL;
tab = calloc(15, sizeof(int));

/* En C99 l'écriture suivante est autorisée */
int N = 0;
scanf("%d\n", &N);

int tab[N] = {0};



D'autres subtilités existent comme par exemple :

Code: Tout sélectionner
/* C89 */
int i = 0;
for (i = 0; i < MAX; i++) {

}

/* C99 */
for (int i = 0; i < MAX; i++) {

}


Concernant ton problème de compilateur regarde ici : http://forums.codeblocks.org/index.php?action=printpage;topic=7137.0

fatal_error a écrit:sont des cas qui ne sont pas forcément dans le cdc. Auquel cas, c'est son problème.


Il y a déjà eu un débat sur ce sujet sur le topic suivant : http://www.maths-forum.com/constraint-error-140236.php.

Je travaille actuellement sur un système d'upload de fichiers en ligne en langage C. Dans le cahier des charges il est indiqué certains types de formats (.doc, .jpeg, .pdf, .png, .bmp, .jpg) autorisés. Est-ce que je ne traite que ces cas là et je laisse planter l'application en cas de mauvaises extensions ? Est-ce que j'accepte que les autres fichiers soient pris en compte ? Bien sûr que non, je dois gérer ce genre d'erreur.

L'utilisateur est stupide, certains ne savent même pas utiliser un clavier correctement, ne savent même pas forcément ce qu'ils font. Que vont-ils faire si cela plante ? Ils partent et ne reviennent pas. S'ils ne reviennent pas c'est une perte d'argent.

Rien ne vaut un message indiquant à l'utilisateur que la saisie n'est pas correcte. Personnellement un logiciel qui plante une fois, je le désinstalle directement.

Un logiciel qui m'indique que j'ai mal rentré quelques choses, je corrige et je recommence.



Un autre exemple moins compliqué. Supposons que je fais un site web pour faire un site de page jaune. Pour cela pour chaque personne j'ai besoin d'un numéro de téléphone et d'un mail.

Dans le cdc, je marque clairement que le numéro de téléphone doit être composer de 10 chiffres et que le format du mail doit être example@domain.com. D'après ce que tu dis, je dois faire confiance à l'utilisateur ? Bien sûr que nom, une erreur est si vite arrivée, un chiffre en trop dans le numéro, un ; à la place d'un . dans le mail ect... Si ce genre d'erreur n'est pas traité et que tout plante. Personne n'utilisera ce système.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 29 Sep 2013, 18:09

Bonjour Ampholyte,
Code: Tout sélectionner
/* En C99 l'écriture suivante est autorisée */
int N = 0;
scanf("%d\n", &N);

int tab[N] = {0};

Là j'ai appris quelque-chose.
Il est sûr et certain que le C ne peut pas réserver de l'espace mémoire pour un tableau dont il ne connait pas la dimension.
Donc, je retire ce que j'ai dit.
Mais, par curiosité, comment ça marche, C99 génère un alloc automatiquement ?
En tout cas, mon compilateur (Borland) ne l'accepte pas.
Donc, à mon avis, c'est à éviter.

PS. autre hypothèse, la notion de classe est interne, mais cachée, et cela se traduit par un new, ce qui revient d'ailleurs au même qu'un alloc. Qu'en est-il de la récupération de l'espace mémoire ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 29 Sep 2013, 18:10

Dans le cahier des charges il est indiqué certains types de formats (.doc, .jpeg, .pdf, .png, .bmp, .jpg) autorisés. Est-ce que je ne traite que ces cas là et je laisse planter l'application en cas de mauvaises extensions ? Est-ce que j'accepte que les autres fichiers soient pris en compte ? Bien sûr que non, je dois gérer ce genre d'erreur.

Ton cdc il est pourri.

Il définit quels sont les types autorisés mais ne définit pas la gestion des erreurs du système.
Si toi tu prends sur ton temps de gérer les erreurs, c'est bien, mais c'est pas (directement) rémunéré.

L'utilisateur est stupide, certains ne savent même pas utiliser un clavier correctement, ne savent même pas forcément ce qu'ils font. Que vont-ils faire si cela plante ? Ils partent et ne reviennent pas. S'ils ne reviennent pas c'est une perte d'argent.

Toi tu es développeur. On te donne des specs, tu developpes.
Maintenant, c'est à celui qui fait les spécifications de dire ce que tu fais si jamais il y a une erreur. En particulier, gérer les erreurs en entrée, ca veut dire gérer du fonctionnel puisque il faut (généralement) transmettre à l'utilisateur l'information que ce qu'il a tenté est pas correct/n'a pu aboutir.

client->besoins (le client te paye pour ses besoins et rien de plus)->spec(les besoins tu fais des documents, et tu assures un comportement cohérent du système)->dev(tu codes ce qu'il y a dans les specs, + ce que tu veux tant que ca ne gene pas la spec, mais ca sert à rien sauf pour ton confort)

Si dans ton cdc il écrit tu gères les adresses de 10car, et que le client il en rentre 11, ben t'es pas obligé de gérer ce cas.
Maintenant soit tu assures dans le cdc de retourner un msg expliquant que >10 il a pas le droit et tu charges ton ami le client, soit tu le fais en interne dans la spec pour ton pif, soit tu fais ce que tu veux.
la vie est une fête :)

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 29 Sep 2013, 18:27

Dlzlogic a écrit:Mais, par curiosité, comment ça marche, C99 génère un alloc automatiquement ?


J'avoue ne pas trop savoir comment cela fonctionne, mais je suppose que c'est une nouveauté qui a été repris du C++. L'allocation et la dés-allocation se fait automatiquement, il n'y a donc plus de problème de memory leak (en cas d'erreur / oubli).

Pour plus d'information sur les nouveautés du C99 : http://nicolasj.developpez.com/articles/c99/

J'avoue ne pas savoir si le gain de temps peut se faire ressentir sur de vieilles bécanes. Je suppose simplement qu'un malloc + memset ou un calloc sera sûrement plus rapide qu'une allocation à taille variable sous la forme int tab[n]. (A confirmer !)

fatal_error a écrit:Ton cdc il est pourri.


En effet, le cdc est pourri comme dans la plus part des projets que j'ai eu à traiter. Je ne reçois pas de cahier des charges complets mais plutôt un descriptif du résultat.

Tu pars du principe que chaque projet à son propre cahier des charges hypra complet avec chaque cas traité mais ce n'est pas le cas partout. D'ailleurs je me demande s'il y a vraiment beaucoup d'entreprises qui font cela comme ça (au moins dans ce domaine).

Je reçois mes instructions par mail ou par oral, c'est donc plutôt un résumé de ce qu'il y a à faire. C'est à moi de prendre la décision ou non de vérifier les données rentrées par l'utilisateur. C'est de cette manière que les petites entreprises fonctionnent.

Ce n'est pas compliqué, si je veux garder mon poste, je dois faire les choses bien cad faire en sorte que le remontage de bug soit le plus pertinent possible.

Pourquoi cela ne fonctionne pas ? Car ce n'est pas la bonne extension !

Pourquoi est-ce mon fichier ne veut pas s'uploader ? Car la taille est trop grosse !

Pourquoi est-ce que mon fichier n'est pas valide ? Car il y a une erreur dans la requête.

Ce genre d'erreur me paraît tellement évident que je ne comprends pas comment tu peux simplement dire, ce n'est pas dans le cdc ? Je ne le prends pas en compte. Cela me paraît aberrant.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 29 Sep 2013, 18:43

Je sais pas du tout pour vous; mais de nos jour ou en tout cas dans mon université; on nous met plutôt dans l'optique où on a un problème à résoudre; et c’est à nous d'imaginer une solution.

A partir du moment où tu es la personne qui imagine la solution, c'est toi qui fait ton propre cahiers des charges si je puis dire; tu sais ce que tu dois avoir en sortie; mais ce qu'il y a entre tes entrées et tes sorties on ne te le précise pas du tout; donc si tu ne gère pas au maximum les erreurs (je dis au maximum car sur ce point je rejoins l'avis de fatal; on ne peut pas non plus gérer toutes les erreurs en chaque fois, je pense que cela générerait un code vraiment trop volumineux pour des fois pas grand chose) on pourra toujours nous le faire retomber dessus en nous disant que l'on a mal analyser le problème.

Donc pour moi deux choses bien distinctes; il y a ce que je pense être une directive générale voir un peu plus détaillé; ce dont me semble parler ampholyte; et un cahier des charges en bon et du forme comme en parle fatal.

Si l'on a des directives, pour moi il faut sécuriser au maximum le code; en revanche si on a un cahier des charges à respecter et que l'utilisateur se plante, je ne vois pas en quoi c'est un soucis; si quelqu’un doit morfler car ça n'a pas été bien fait dans ce cas là ce sera l'analyste en charge du cahier des charges; en tout cas c’est mon avis.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 29 Sep 2013, 18:54

Tout à fait d'accord avec Rockleader. Par contre je pars du principe que s'il est pas écrit explicitement que il n'y a pas de gestion d'erreur sur les entrées, je le fais.

Pour moi un programme bien fait est un programme qui ne doit pas planter. Peu-importe comment sont gérées les entrées, je ne connais pas de problème que j'utilise qui plante lorsque je me trompe dans les entrées. Si on utilise une interface graphique les objets sont testés en amont et ne sont pas à la charge du développeur (textArea, inputBox, ...). En revanche quand on travaille en ligne de commande c'est une autre affaire.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 29 Sep 2013, 19:39

Je reçois mes instructions par mail ou par oral, c'est donc plutôt un résumé de ce qu'il y a à faire. C'est à moi de prendre la décision ou non de vérifier les données rentrées par l'utilisateur. C'est de cette manière que les petites entreprises fonctionnent.

Mais pas toutes les entreprises.
Et même dans les petites, c'est pas forcément le cas. Si le gars il a envie d'insérer un iframe d'un autre site au travers de ton IHM (feature) et il se prend un exploit tu fais quoi. Tu fais une liste de tous les sites dangereux?
Si le gars il décide d'écrire en koreen alors que ta db le supporte pas, tu vas faire un dev spécifique pour UNE personne?
Je retourne ton argument du boulet, il y a toujours plus boulet que le plus gros boulet de nos pensées :(.

En revanche quand on travaille en ligne de commande c'est une autre affaire.

c'est marrant parce que j'hésitais justement à parler de la ligne de commande ou tu te prends un segfault si tu rentres n'importe quoi. C'est pas plus gênant que ca.
c'est un peu comme dans la doc du C, ou tu as un undefined behaviour lorsque tu fais un out of bound.

Donc non, c'est définitivement pas la bonne manière d'essayer de gérer tous les erreurs possibles:
1- d'une part parce qu'on peut pas, ne serait-ce que physiquement parlant
2- d'autre part parce que la plupart on s'en fout.
la plupart, c'est ici à remettre dans le contexte de pour qui tu travailles.
pour toi ptet que c'est important de vérifier un nom de document...
mais pour (au pif) un traducteur anglais francais, si tu lui mets un mot francais en entrée, c'est une erreur en soit...pourtant t'en as rien à carrer qu'un des mots soit mal traduit :)

Et sinon, si tu devais écrire le programme de rockleader avec les nombres parfaits,
tu gères l'écriture scientifique?
tu gères tous les premiers entre 1 et 10^10^10?
tu gères les négatifs?
Tu livres un rendu tel quel par rapport à ce que t'as pensé qui était correct? Puis ptet un jour l'utilisateur il verra: mince je peux pas saisir 10^10^10 alors que c'est un nombre comme un autre.

Mais bon, oui chui d'accord que dans les ptites entreprises tu peux te permettre/subir le fait de designer ton système fonctionnellement et techniquement parlant.
la vie est une fête :)

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 29 Sep 2013, 19:58

Je comprends mieux ce que tu veux dire.

Bien évidemment, on ne peut pas traiter l'ensemble des erreurs qu'il est possible de faire vu qu'il y en a une infinité. En revanche rien n'empêche de résoudre les plus courantes.

Vérifier que l'entrée est bien un nombre par exemple sinon on affiche une erreur et non un pauvre plantage du programme empêchant l'utilisateur de comprendre pourquoi cela ne fonctionne pas.

Prenons un exemple plus concret. On souhaite créer une compte mail, par exemple je rentre deux mots de passes différents. Lorsque je souhaite lancer la création, un message m'indique que les mots de passes sont différents. Je peux donc modifier ce qu'il ne va pas.

Si à la place de message on avait un : ERROR. En tant qu'utilisateur tu te poserais pas la question, pourquoi j'ai une erreur ? Alors qu'un simple ERROR : Le nom de compte est invalide suffit à l'utilisateur pour comprendre qu'il faut modifier le nom du compte.


Bien évidemment, le but n'est pas de trouver une solution à toutes les bugs possibles mais plutôt permettre à l'utilisateur de ne pas croire que le programme est foireux.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 29 Sep 2013, 20:11

Il me semble qu'autrefois, la norme prévoyait certains contrôles obligatoires, ça n'existe plus ?
Je persiste et je signe, si un logiciel se plante, pour n'importe quelle raison, faute frappe, cas non prévu, c'est l'auteur du logiciel qui n'a pas fait son boulot. Pour moi, cela ne se négocie pas. Par contre, il ne faut pas oublier que l'utilisateur, et non l'auteur du logiciel, est responsable des résultats qu'il produit, quel que soit le logiciel ou les méthodes utilisées.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 29 Sep 2013, 20:42

Vérifier que l'entrée est bien un nombre par exemple sinon on affiche une erreur et non un pauvre plantage du programme empêchant l'utilisateur de comprendre pourquoi cela ne fonctionne pas.

Prenons un exemple plus concret. On souhaite créer une compte mail, par exemple je rentre deux mots de passes différents. Lorsque je souhaite lancer la création, un message m'indique que les mots de passes sont différents. Je peux donc modifier ce qu'il ne va pas.

Si à la place de message on avait un : ERROR. En tant qu'utilisateur tu te poserais pas la question, pourquoi j'ai une erreur ? Alors qu'un simple ERROR : Le nom de compte est invalide suffit à l'utilisateur pour comprendre qu'il faut modifier le nom du compte.


ben ca typiquement c'est pas du travail de dev, mais du travail d'analyste fonctionnel.
Lui dans sa spec il dit si ya deux mots de passe différents, l'utilisateur, il a un message: les mots de passe sont différents.

dans un exercice tel qu'a rockleader, il devrait, à un moment ou un autre, avoir cet écrit quelque part, qu'il soit fournit par le prof, ou écrit de sa main s'il est en charge de rédiger la spec de son appli, si cas 1 et que c'est pas écrit, ca devrait >pas< être son problème.
la vie est une fête :)

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 29 Sep 2013, 20:51

fatal_error a écrit:ben ca typiquement c'est pas du travail de dev, mais du travail d'analyste fonctionnel.
Lui dans sa spec il dit si ya deux mots de passe différents, l'utilisateur, il a un message: les mots de passe sont différents.


Hum je vois, mais ce travail d'analyste fonctionnel peut être également fait par les développeurs dans des petites structures.

dans un exercice tel qu'a rockleader, il devrait, à un moment ou un autre, avoir cet écrit quelque part, qu'il soit fournit par le prof, ou écrit de sa main s'il est en charge de rédiger la spec de son appli, si cas 1 et que c'est pas écrit, ca devrait >pas< être son problème.


On est d'accord, ce ne sont que des exercices lui permettant de progresser. Il n'y a rien à la clef sauf pour son développement personnel.

Je pense simplement que : "Qui peut le plus peut le moins", il vaut mieux qu'il soit prévenu qu'il existe des solutions permettant de vérifier les données utilisateurs, plutôt que de le laisser dans l'ignorance.
Peut importe ce qu'il en fait derrière, il est important lorsque l'on débute de savoir ce qui peut marcher et ce qui plante un programme.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 30 Sep 2013, 12:19

Vous connaissez la suite de syracuse ?

Son fonctionnement est assez simple: Un+1 = Un/2 si Un pair ou (3*Un)+1 si Un impair.
Cette suite se termine toujours par un 1.

J'ai réalisé un programme cherchant le premier terme d'une suite de syracuse à 354 termes; il me donne bien un résultat: 4 200 720 ce qui me semble plausible; mais je n'ai aucun moyen d'en être sûr sur ce coup là; donc j'aimerais que vous jetiez un oeil à mon code.


J'ai également le retour d'un warning me disant: control reaches end of non-void function {-Wreturn-type}

EN soit ce n'est pas gênant tout compile et le programme s’exécute correctement; mais j'aimerais bien comprendre la signification de ce warning. Particulièrement de void; je vois beaucoup de gens utiliser des void dans leur code mais je ne vois pas vraiment ce que cela peut être: une fonction ? Procédure ? Ce n'est pas vraiment clairement expliqué.



Accessoirement voici le code:

Code: Tout sélectionner
#include
#include



float syracuse();

int main()
{
    syracuse();
    return 0;
}

float syracuse()
{
    int cpt=1;
    int u1=1;
    int terme1;
    while (cpt<=354 && u1 !=1) /*on répète le calcul jusqu'à trouver la première suite de 354 termes se finissant par 1 */
    {
        if (cpt==1) /*on stocke la première valeur u1*/
        {
            terme1=u1;
        }
        if (u1%2==0)
        {
            u1=u1/2; cpt=cpt+1;
        }
        else
        {
            u1=(3*u1)+1;cpt=cpt+1;
        }
        if (cpt==354 && u1!=1) /*Si l'on a pas trouvé la première suite; on incrémente u1 de sa première valeur*/
        {
            u1=terme1+1;
        }
    }
    printf("Le premier terme de la suite de 354 terme est  %d ",terme1);

}



Au passage vous me direz que faire une fonction ici n'était pas utile; mais j'ai préféré faire comme ça pour m'entraîner à la syntaxe et à l'utilisation; déclaration.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 30 Sep 2013, 12:55

Bonjour,
Ca n'a rien de choquant d'avoir une fonction dans un cas comme celui-là.

Explication du Warning : Le prototype de la fonction est float syracuse();
Ce qui signifie que la fonction doit renvoyer un float, pourquoi ?
Or la fonction ne renvoie rien, donc le compilateur n'est pas content.

Il y a 2 solutions, soit tu retournes un indicateur pour tester éventuellement si ça s'est bien passé, alors le prototype serait int syracuse(); et à la fin de la fonction il faudra un avoir un return qqch.
Soit tu ne retourne rien alors le prototype serait void syracyse();
Ce mot-clé est très utilisé, il pourrait se traduire par "rien", "n'importe-quoi", "on-sait-pas-et-on-s'en-fiche", "faut-bien-mettre-qqch" etc.
On peut trouver des déclaration comme void* UnPointDeTypeVoid;

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 30 Sep 2013, 13:22

Ah d'accord, je comprend mieux !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 30 Sep 2013, 19:20

slt,

ben debug à coup de printf pour vérifier.
T'es pas obligé de tester jusqu'à 354...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 30 Sep 2013, 19:47

La fonction tourne bien; le seul soucis qu'elle avait, c'était que je l'avais "typé" avec un float au lieu de void :lol3:

Ensuite; j'ai eu un autre soucis pendant mon TP aujourd'hui; dès que j'ai le code je vous le met.

J'ai en quelque sorte voulu réaliser une fonction pour m'afficher les valeurs d'un tableau de taille donné en entré de la fonction; mais l'affichage me faisait n'importe quoi; je vous montre ça dès que possible.

Et cela ne vient pas du code en lui même de la fonction puisque lorsque je l'avais sorti et remis dans le corps du programme j'ai eu les bonnes valeurs...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 05 Oct 2013, 17:14

Bonsoir, je me permet de revenir sur la question du voulez vous continuez; aurait il été possible de fabriquer une sorte de menu


du genre

Code: Tout sélectionner

int continue(void)

/*au passage j'ai un doute sur la déclaration; on doit mettre int car on retourne quand même un nombre; mais le void est il obligatoire pour
dire que continue ne prend pas d'argument ? Ne pourrait on pas juste mettre int continue()*/

int choix;

printf("Voulez vous continuer ?\n");
printf("1- Oui\n");
printf("2- Non\n");
scanf("%d", choix);
return choix;


et dans le main on fait une structure en switch avec break. Cela devrait pouvoir marcher je pense; je vais le tester sur un futur programme.





EDIT:


Je viens donc de faire un test mais à priori j'ai pas la bonne synthaxe du switch; pourtant je ne pense pas me tromper...

je vous ai mis en commentaire en face du switch et break les erreurs qu'il me trouve...il y a les me^me pour le case 2 et default.

Code: Tout sélectionner
#include
#include

int procedure(void);
int main()
{
    int N;
    do{
        printf("Entrez le nombre N de valeur: ");
        scanf("%d",&N);
    }while (N100);

    int cpt;
    int nb;
    int T[N];

        for (cpt=0;cpt<N;cpt++)
        {
            printf("Nombre %d",cpt+1);
            scanf("%d",&nb);
            T[cpt]=nb;
        }

/on entre dans le problème ici*/

        switch(procedure());
        {
        case 1: /*case label not within a swhitch statement*/
            printf("Procedure 1");
            /*Exécution*/
            break;/*break statement not within loop or swhitch*/
        case 2:
            printf("Procedure 2");
            /*Exécution*/
            break;
        default:
            printf("Il n'y a pas de 3eme méthode !!!\n");
            break;
        }
    return 0;
}

int procedure(void)
{
    int choix;
    printf("Tri du tableau: \n");
    printf("1-Avec un tableau supplémentaire\n");
    printf("2-Sans tableau supplémentaire\n");
    scanf("%d",&choix);
    return choix;
}
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 05 Oct 2013, 18:17

Quelques précisions :
Une fonction prend des paramètres s'il y en a et retourne obligatoirement quelque-chose. Si ce quelque-chose est rien, on met void.
Les deux notions, paramètres et valeur retournée sont indépendantes.

Le switch est une instruction (c'est équivalent à un goto), le break est une instruction, c'est équivalent à un return. Quand le dis "équivalent" je veux dire "produit la même chose" et non "peut être remplacé par ...".
On met des break dans un switch, si on veut sortie, mais rien n'interdit de continuer, dans ce cas, on ne met pas de break.
On peut trouver des break dans des boucles.

La ligne définissant le switch est terminée par un ';', donc, il ne se passe rien, et les instructions case sont hors séquence de switch.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite