X macros ils arrivent!! faites gaffe, vous pourrez plus vous en passer x) (hein pouet? )
Le C actuel limite volontairement l'usage du préprocesseur. Va sur fclc et tu verras ce qu'ils pensent du préprocesseur.
Je te conseille de lire le livre de Kernighan et Pike, "The Practice of programming", c'est un livre vraiment très instructif. Voilà ce qu'ils disent du préprocesseur :
Citation : Kernighan & Pike
With modern machines and compilers, the drawback of functions macros outweigh their benefits. Avoid functions macros.(...). In C, they cause more problems than they solve.
Rofl c'était juste pour m'amuser tapez pas
Je ferai une version sans préprocesseur
Mais bon là je ne génère aucun code en préprocesseur je ne fais que remplir mon tableau de chaînes de caractères donc bon le "they cause more problems than they solve" je ne suis pas d'accord dans mon cas
D'ailleurs l'avantage avec mon code c'est que je n'ai pas besoin de me faire chier avec tous les nombres de 0 à 99 ils sont déjà là, j'ai juste à piocher dedans
Et comme les plus chiants sont ces nombres là bah j'ai résolu le gros du problème
Mais bon là je ne génère aucun code en préprocesseur
Bien sûr que si, le préprocesseur il te fait grosso modo du copier coller.
Citation : Pouet_forever
je ne fais que remplir mon tableau de chaînes de caractères donc bon le "they cause more problems than they solve" je ne suis pas d'accord dans mon cas
Ça on ne sait pas combien de temps tu as mis pour écrire ton code ni combien de jours ou de semaines pour comprendre comment fonctionne le préprocesseur.
Ton code est complètement illisible (dans le fond comme dans la forme à cause des contraintes de formatage que nécessitent les directives), inmaintenable et indébogable (on ne voit pas les directives sous le débogueur)
Citation : Pouet_forever
D'ailleurs l'avantage avec mon code c'est que je n'ai pas besoin de me faire chier avec tous les nombres de 0 à 99 ils sont déjà là, j'ai juste à piocher dedans
Aucun avantage puisqu'on peut écrire plus facilement le code C gérant l'écriture d'un nombre entre 0 et 99. On pourrait même écrire un code C qui pourrait gérer plusieurs langues (français, anglais, espagnol par exemple).
Citation : Pouet_forever
Et comme les plus chiants sont ces nombres là bah j'ai résolu le gros du problème
Non, ce n'est qu'une partie du problème pas plus difficile que le reste. Le fait de l'avoir écrit avec le préprocesseur ne change rien. Et comme tu vas devoir écrire en C le code qui génère les nombres à trois chiffres (à moins que tu veuilles faire écrire un immense tableau contenant l'écriture littérale des nombres entre 0 et 1000), tu introduis une hétérogénéité de traitement dans ton programme.
Bien sûr que si, le préprocesseur il te fait grosso modo du copier coller.
Oh my god !!
Voilà le résultat du programme de Pouet_forever après un gcc -E (qui a pour effet de faire passer le preprocesseur uniquement, sans compilation) :
Mais non, pourquoi tu as fait ça ?
C'est intéressant de voir ce qu'on peut faire avec le preprocesseur.
Même si ce n'est pas efficace en terme de mémoire...
En plus dis toi que ton prog est le plus rapide qu'on puisse faire (on ne peut faire mieux en terme de rapidité).
Aucun test, accès mémoire instantané !!
Y a que le coté mémoire qui coince... C'est tout
Voici mon code pour l'exo z0zéro qui fonctionne pour tous les nombres entre 0 et 999.
J'étendrais à 999 999 999 999 si j'ai le courage, m'enfin je crois qu'en allant jusqu'à 999 on a déjà traité l'essentiel des exceptions.
J'ai essayé de commenter pour que ce soit le plus clair possible.
Si vous avez des remarques, conseils, suggestions, commentaires...
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "restricted.h"
int
main(int argc, char **argv)
{
char *number;
char letters[256];
if (argc != 2) {
printf("usage: z0zero num\n");
return 1;
}
number = argv[1];
/* If the number is > 999. */
if (strlen(number) > 3) {
printf("error: number too big.\n");
return 1;
}
convert_restricted(number, letters);
printf("%s\n", letters);
return 0;
}
Je pense que tu joues trop avec sprintf pour avoir un nombre "fait du premier coup".
Tu ferais mieux d'utiliser strcat je pense comme ça tu pourras concaténer tes différents nombres sans problèmes (et réduire le nombre de lignes de ton code).
Ce n'est que mon avis hein
Petite erreur ici cependant :
free(p);
Le problème c'est que tu incrémentes p à chaque tour de boucle et à la fin il ne pointe plus sur le début de la zone mémoire allouée, du coup ça va pas
Au lieux d'allouer et de prendre p pourquoi tu ne prends pas tout simplement la chaîne que tu as passée en argument ?
Ouh, bien vu pour le free(p);.
Le souci c'est que je modifie la chaîne en cours de route, et que je trouve ça plus propre de laisser la chaîne passée en entrée intacte.
Pour le coup de strcat, c'est vrai que je pourrais concaténer directement sur la destination. M'enfin je suis pas sûr que ça diminue tant que ça le nombre de lignes, parce que ça revient grosso modo à ce que je fais : je stocke dans un buffer que j'écris ensuite sur la destination.
Sinon je viens aussi de me rendre compte qu'il y a un espace en trop à la fin de la destination.
M'enfin je suis pas sûr que ça diminue tant que ça le nombre de lignes, parce que ça revient grosso modo à ce que je fais : je stocke dans un buffer que j'écris ensuite sur la destination.
Regarde mon code juste au dessus du tiens. Je gère tous les nombres de l'exo en 140 lignes de code
Convaincu ?
Si vous avez des remarques, conseils, suggestions, commentaires...
J'ai testé, et à l'usage, toutes les exceptions sont bien gérées, nickel.
Tout comme Pouet, je trouve que l'utilisation d'allocation dynamique n'est pas utile ici, et te fais faire une bêtise pour le coup.
Citation : Bad_Wolf
Le souci c'est que je modifie la chaîne en cours de route, et que je trouve ça plus propre de laisser la chaîne passée en entrée intacte.
Rien ne t'empèche de faire une copie de la chaîne d'origine...
Pour gérer uniquement les nombres à 3 chiffres, ta fonction char*convert_restricted(constchar*src,char*dst) fait plus de 100 lignes(avec les commentaires, c'est vrai.), je trouve ça un peu long.
Sinon, c'est vraiment plutôt bien.
Merci pour ta participation.
edit: Pouet, je n'avais pas fait attention que tu avais posté un code "normal"! Cool, je vais regarder.
Pour les pragmas...
||=== z0Zero_Pouet2, Debug ===|
main.c|6|warning: ignoring #pragma mark |
main.c|7|warning: ignoring #pragma mark globales|
main.c|27|warning: ignoring #pragma mark |
||=== Build finished: 0 errors, 3 warnings ===|
je suis nouveau sur le site, je suis actuellement en apprentissage sur le langage C, je me suis arrété au tuto " une bête de calcul" car je recherche des exercices simple pour mieux comprendre et digérer l' info, et là je m apperçois qu' il n y a rien...c'est vraiment dommage car ce site et une perle. En attendant que des exercices puissent etre mis à disposition jvais réviser les parties précédente.
En fait, je ne sais pas comment le debuter cet exo
C'est ce qui fait la difficulté de l'exo. Le mieux est que tu essayes de verbaliser comment, dans la vie courante, tu parviens à lire un nombre donné avec ses chiffres.
Si tu n'y arrives pas, essaye de faire l'exo uniquement pour les nombres à au plus deux chiffres, ce n'est déjà pas si évident de traiter efficacement tous les cas.
Bon les noms sont pas terrible terrible mais j'étais pas inspiré
Tu peux modifier dixaines en mettant "dix" et les enlever de unites si tu veux
Ce que tu lui donnes là n'est pas à même de lui permettre de comprendre comment écrire l'algorithme même si ton découpage me semble correct.
Avec tes const partout, à mon avis, tu embrouilles les débutants et même de plus avancés. Par ailleurs, il n'est pas utile de mentionner la taille des tableaux.
On n'écrit pas dixaine mais dizaine. Dans le tableau des dizaines, la répétition de soixante et quatre-vingt ne me semble pas pertinente. De même, dans
ton tableau de centaines, la présence de "cent" ne me paraît pas pertinente.
@lunstick: Il y aura des exercices beaucoup plus simples que celui-ci...
Seulement c'est très compliqué de satisfaire les débutants ainsi que les débutants "avancés"...
Je pense alterner un exercice "difficile" et un autre plus facile. Par contre, il te faudra tout de même avancer encore un peu dans le cours C.
Tu peux trouver des exercices plus accessibles ici
@Artificier59:
N'oublie pas que tu as 15 jours pour résoudre cet exercice. La plupart du temps, même si un exercice est à notre niveau on ne le résout pas instantanément(ou alors c'est que l'exercice est trop simple...)! Il faut souvent plusieurs jours pour trouver un cheminement, et c'est normal.
@candide : Pour le code de Bad_Wolf, c'est l'erreur signalée par Pouet, (pointeur p incrémenté, et free() sur ce pointeur, invalide à la fin de la fonction.).
@Pouet: Effectivement, ton code est très compliqué...
A un moment donné, je pense que c'est important d'écrire du code qui soit lisible et compréhensible par d'autres(même moins avancés.)
Par exemple :
for (i = len-1-(3*j); i >= 0 && i >= len-3*(j+1); i--, mult*=10)