Si le but est de faire que de l'affichage, alors une simple boucle sur un printf suffit. Non ? Ou bien je n'ai pas compris la question ?Envoyé par Rydley
Si le but est de faire que de l'affichage, alors une simple boucle sur un printf suffit. Non ? Ou bien je n'ai pas compris la question ?Envoyé par Rydley
Pourquoi y aurait-il ça ? Les variables locales n'ont qu'un intérêt ... 'local' dont le nom doit suffire pour expliquer leur rôle si il n'est pas évident au premier coup d'oeil.Envoyé par souviron34
Par contre si c'est pour expliquer que la fonction agit par effet de bord sur des globales (aka procédures d'un autre age), je sors mon lance-flamme (sauf cas très particuliers et parfaitement documentés).
Pas de problème pour le Miel et les Fourmis Rouges.mais c'est souvent associé à d'autres pratiques beaucoup plus douteuses (mettre des variables globales ou des include ou define au beau milieu d'un module, etc...).
A part qu'un
me va tout à fait, toujours au nom de la réduction de la porté au minimum (ça peut aussi s'appliquer aux macros).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 { #define xxx ceci /* ... */ #undef xxx /* ... */ #define xxx cela /* ... */ #undef xxx }
Oui, mais en tant que vieil écolo recycleur depuis plus de 35 ans, j'utilise le moins de bits possibles.Envoyé par Spootnik
me va très bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part *s = 0;
Oui avec ça pas de problème, mais j'ai déjà vu (et malheureusement pas qu'une fois) la chose suivante (modules de 1000 ou 2000 lignes) :Envoyé par Emmanuel Delahaye
et malheureusement pas simplement quelques fois......(voir le code original de HTTP, le code de MPEG1 de mpeg.org, entre autres....)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 ........ ........ /* déjà à la moitié du module */ ... int toto ( void ) { } ... #include "MonInclude.h" int toto1 ( void ) { } ...... int Ma_Variable ; int toto3 ( void ) { } .... #define MA_VARIABLE_DEFINE int toto4 ( void ) { } ....
Donc juste pour les gens peu expérimentés, je pense qu'il vaut mieux être TRES clair, même si le langage permet beaucoup de choses... :-)
Parce qu'après, ben reprend un code comme ça, et tu finis par t'arracher les (quelques à notre âge ;-) ) cheveux ....
salut tout le monde.
Grace aux conseils que vous m'avez donné hier, j'ai reussi à faire mon programme. Mais j'ai une erreur à la compilation.
Voici mon code( un peu long j'avou):
Mon compilateur (Dev c++) indique une erreur a la ligne que j'ai souligné, il m'écrit:expected primary-expression before `]`token.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 #include <iostream> using namespace std; int dupliqueMot(int *nbPoss,char *retour[], char mot[], int *nbOcc){ int cpt=0; int taille; int resul=0; while (mot[cpt]!='\0')// cette boucle calcul la place que prend la chaine que veut creer l'utilisateur { // c'est a dire la suite de mots. cpt++; } taille=cpt*(*nbOcc); if (taille<=30) { // si la suite est assez petite pour rentrer dans le tableau *retour[0] = '\0'; for (int i=0; i<*nbOcc; i++) // on rentre dans la boucle for qui effectue la suite des mots. { strcat(*retour, mot); } return 0; } else { //si la suite est trop grande pour rentrer dans le tableau do { // on rentre dans la boucle do while qui calcul le nombre d'occurence possible resul=cpt*(*nbPoss); // que l'on peut mettre dans le tableau nbPoss++; } while (resul<=30); *retour[0] = '\0'; // le tableau retour est un tableau vide ou l'on va stocker la chaine. for (int i=0; i<*(nbPoss-2); i++) { strcat(*retour, mot); } return 1; } } int main(){ char resultat[30]; char MotVoulu[20]; int nombreVoulu=0; int nombreObtenu=0; int x; printf("quelle mot voulez-vous dupliquer? : "); gets(MotVoulu); printf("combien d'occurences voulez-vous?:"); scanf("%ld", &nombreVoulu); x=dupliqueMot(&nombreObtenu, &resultat[], MotVoulu[], &nombreVoulu);// x est egal a la valeur de retour de la fonction if (x==0) { printf("resultat : %s\n ",resultat); printf("on a %ld fois le mot %s \n", nombreVoulu, MotVoulu); } else { printf("resultat : %s\n ",resultat); printf("on a seulement %ld fois le mot %s \n", nombreObtenu-2, MotVoulu); } system("PAUSE"); return 0; }
Je sais pas si l'erreur vient des pointeurs ou d'un autre truc parce que j'ai pas encore vu les pointeurs, c'etait justement le but de l'éxo, utiliser les pointeurs mais la j'dois avouer que j'suis larguer sur cette erreur.
Salut,
2 remarques :
* Ton code semble être du C++ => catégorie C++
* Utilise la balise CODE pour que ce soit plus clair...
je ferais plusieurs remarques :
1) fais des indentations correctes
2) pourquoi passes-tu des entiers par adresse alors que tu ne vas pas les modifier (nombreVoulu) ?
3) il y a une fonction standard qui te calcules la longueur de la chaîne (strlen(Mot) ) au lieu de faire ta boucle while.....
4) il te manque une allocation sur retour
5) "mot" est masculin , donc "quelle" est en fait "quel" ......![]()
6) Si tu es en C++ je ne sais pas ce qu'il te faut comme include, mais en C je ne sais pas ce que vient faire "namespace" et "iostream"... stdlib et stdio marchent très bien
7) pourquoi fais-tu "system(PAUSE)" ??
8) En général la règle veut qu'on passe les arguments qui ne sont pas modifiés et qui sont des INPUT en premier (mot, nbVoulu), puis ceux qui sont entrée/sortie, et enfin ceux qui sont sortis...
9) tes accolades ne sont pas par paires (voir le 1) donc c'est sûr qu'il y a un pbe à la compilation... Regardes attentivement...
C'est tout pour l'instant![]()
L'ordre des parametres d'une fonctions different beaucoup en fonction des normes de codage et des langages.Envoyé par souviron34
En C, c'est meme plutot l'inverse qui est utilise, voir a ce sujet la bibliotheque standard (en partculier les fonctions du type memcpy, strcpy, strcat, etc.)
J'ai recompté les acolades et elles sont en paires( ou alors j'suis completement aveugle).
Sinon, j'connaissais pas la fonction strlen mais elle est tres pratique merci.
Le system("PAUSE"), je sais plus à quoi sa sert mais on m'a toujours dit de le mettre à la fin de mon prog.
Et pour le "quelle",on va dire que c'est une faute d'innatention.
Mais bon, mon programme ne marche toujourset je comprend pas c'est quoi comme erreur expect primary-key...
int main(void)
ça marcherait pas mieux ??
Poste le code à jour. On ne sait pas quelles nouvelles erreurs tu as ajouté...Envoyé par Rydley
D'autre part, le C++, c'est pas ici. C'est la porte d'à-coté...
J'y avais pensé mais non sa marche pas toujours pareil.Envoyé par souviron34
ok noté milles excuses..Envoyé par Emmanuel Delahaye
Mais j'ai vu ce que c'était tes erreurs Rydley...
Il n'y a rien qui te choques là-dedans ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 char resultat[30]; char MotVoulu[20]; ...... x=dupliqueMot(&nombreObtenu, &resultat[], MotVoulu[], &nombreVoulu);
Il faut mettre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 char resultat[30]; char MotVoulu[20]; ...... x=dupliqueMot(&nombreObtenu, &resultat[], MotVoulu[], &nombreVoulu);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 x=dupliqueMot(&nombreObtenu, &resultat, MotVoulu, &nombreVoulu);
et dans ta fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int dupliqueMot(int *nbPoss,char **retour, char *mot, int *nbOcc){
J'avoue que mettre les crochets dans l'appel de la fonction, c'est quand même une grosse erreur.
J'ai fait les modifications dans l'appel de la fonction et dans le prototype et l'ancienne erreur a disparu GENIAL
Mince j'ai appuyé sur entré.
Bon reprenons.
Maintenant y a une autre erreur: Dev me dit toujours a propos de cette ligne :63 cannot convert `char (*)[30]' to `char**' for argument `2' to `int dupliqueMot(int*, char**, char*, int*)' .
bon je ne connais pas C++. En C j'écrirais comme ça..
Ah sa y est j'ai reussi a regler mon probleme, mon programme marche nikel, en fait il me manquait une etoile quelque part dans le code j'ai eu du mal a trouver l'erreur mais c'est fait.
Merci pour toute les informations que vous m'avez donné ce week-end, j'aurais jamais reussi sans.
Si tu programme en C++, le bon forum est http://www.developpez.net/forums/forumdisplay.php?f=19
Par ailleurs, contrairement au langage C, il est possible en C++ d'écrire int main() qui signifie que la fonction main ne possède aucun paramètre.
Si tu écris ton code en C++, je ne comprends pas pourquoi tu utilises des fonctions telles que printf() ou strcat() alors qu'il existe des alternatives en C++. Malgré tout, si tu désires utiliser ces fonctions, tu doit inclure les fichiers d'en-tête suivants:
A part quelques détails qui laissent penser que ton code est du C++, le style de programmation utilisé ici est du C (aucun idiome C++ à l'horizon), et il y a beaucoup d'erreurs. Regardons tout d'abord l'interface de la fonction duplique mot:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <cstdio> #include <cstring>
Le paramètre nbOcc correspond au nb de répétitions demandées par l'utilisateur. La valeur de ce paramètre n'est pas modéfié par ta fonction. Il n'y a donc aucune raison ici de passer nbOcc par pointeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int dupliqueMot(int *nbPoss, char *retour[], char mot[], int *nbOcc) { /*...*/ }
Le paramètre mot correspond à la chaîne de charactères que l'utilisateur veut répéter nbOcc fois. Cette chaîne n'est pas modifiée par la fonction, on peut donc déclarer mot avec le type suivant: char const mot[]
Le paramètre retour, si j'ai bien compris ton code, correspond à la chaîne retournée par ta fonction. Il s'agit d'une chaine de caractères et non d'un tableau de pointeurs sur char. Ainsi, le paramètre retour est déclaré comme: char retour[].
Ici, ta fonction dupliqueMot n'alloue aucune resources. L'espace mémoire pour contenir la chaine de caractère retour est alloué par la fonction appelante. nbPoss pointe sur un entier. Si l'espace alloué à retour est insuffisant pour contenir nbOcc occurences de mot, *nbPoss indique le nombre d'occurences de mot effectivement placées dans le buffer pointé par retour. Par ailleurs, si l'espace mémoire pointé par retour est insuffisant pour insuffisant pour accueillir nbOcc occurences de mot, la fonction renvoie le code d'erreur 0.
Personnellement, je modifierais la stratégie pour indiquer en retour de la fonction duplique mot le nb d'occurences de mot effectivement concaténées au sein de la chaine retour, ce qui permet d'éliminer nbPoss et donne le code suivant (traduit en C):
Attention, j'ai remarqué que tu avais utilisé la gets(). Cet pratique est à éviter absolument. La fonction gets() peut toujours être remplacée par fgets() plus sure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 #include <stdio.h> #include <stdlib.h> #include <string.h> /** * Compose la chaine retour avec nb_occ occurences de mot */ int dupliqueMot(char p_retour[], size_t size_retour, char const mot[], int nb_occ) { int i; int nb_copies; const int nb_mots_max = (size_retour - 1) / strlen(mot); nb_copies = nb_occ < nb_mots_max ? nb_occ : nb_mots_max ; p_retour[0] = '\0'; for (i = 0; i < nb_copies; i++) { strcat(p_retour, mot); } return nb_copies; } /** * Affiche message sur stdout et saisit la ligne entrée par l'utilisateur. */ void get_line(char buffer[], size_t size_buff, char const *message) { char *p_saisie_ok = NULL; if (buffer != NULL && size_buff >= 2) { while (p_saisie_ok == NULL) { printf("%s (max %d caractères) : ", message, size_buff - 2); fflush(stdout); fgets(buffer, size_buff, stdin); /* si p_saisie_ok vaut NULL, le mot entré par l'utilisateur est trop long */ p_saisie_ok = strchr(buffer, '\n'); if (p_saisie_ok == NULL) { scanf("%*[^\n]"); getchar(); } else { /* On élimine le caractère '\n' à la fin de mot_voulu */ *p_saisie_ok = '\0'; } } } } /** * Affiche message sur stdout et saisit l'entier entré par l'utilisateur. */ void get_int(int *p_number, char const *message) { int rc; /* return code of scanf() */ if (p_number != NULL) { while (rc != 1) { printf("%s : ", message); fflush(stdout); /* scanf retourne le nombre de valeurs lues avec succès */ rc = scanf("%d", p_number); /* On vide le flux stdin */ scanf("%*[^\n]"); getchar(); } } } /* Point d'entrée du programme */ int main(void) { char resultat[30]; char mot_voulu[20]; int nombre_voulu = 0; int nombre_obtenu = 0; /* Saisie d'un mot entré par l'utilisateur */ get_line(mot_voulu, sizeof mot_voulu, "Quel mot voulez-vous dupliquer?"); /* Saisie d'un entier entré par l'utilisateur */ get_int(&nombre_voulu, "Combien d'occurences voulez-vous?"); nombre_obtenu = dupliqueMot(resultat, sizeof resultat, mot_voulu, nombre_voulu); printf("Voici %d fois le mot %s (%d répétitions demandées)\n", nombre_obtenu, mot_voulu, nombre_voulu); printf("=> %s\n", resultat); return EXIT_SUCCESS; }
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Partager