#2026 Le 30/05/2010, à 14:26
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Pylade : Ta lib, elle est censée faire quoi ?
Sinon, je recode les fonctions de string.h pour m'entraîner, par contre j'ai un problème avec celle-ci :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_strcpy(const char str[], char copied[]);
int main()
{
char str[] = "Test", copied[100] = {0};
my_strcpy(str, copied);
printf("Original : %s\n", str);
printf("Copy : %s\n", copied);
return 0;
}
char* my_strcpy(const char str[], char copied[])
{
int i = 0;
do
{
copied[i] = str[i];
}
while (str[i] != '\0');
return 0;
}
Il compile bien, par contre l'exécution boucle indéfiniment. Aucun message d'erreur au compilo... ça peut venir d'où ?
Dernière modification par Ouranos999 (Le 30/05/2010, à 14:26)
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2027 Le 30/05/2010, à 14:36
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Ouranos999 : tu n'incrémentes pas ton compteur .
Sinon Pylade fais une bibliothèque pour la gestion des options (traitement de la ligne de commande).
Hors ligne
#2028 Le 30/05/2010, à 14:39
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Ouranos999 : tu n'incrémentes pas ton compteur .
Je vais m'acheter une corde.
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2029 Le 30/05/2010, à 15:23
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
grim7reaper a écrit :@Ouranos999 : tu n'incrémentes pas ton compteur .
Je vais m'acheter une corde.
Le voilà obligé de se chercher une corde pour lui-même. ^^
Bon, allez, je suis magnanime :
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2030 Le 30/05/2010, à 15:28
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Ouranos999 a écrit :grim7reaper a écrit :@Ouranos999 : tu n'incrémentes pas ton compteur .
Je vais m'acheter une corde.
Le voilà obligé de se chercher une corde pour lui-même. ^^
Bon, allez, je suis magnanime : http://mysavoircoyote666.ibelgique.com/ … pendre.gif
Merci
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2031 Le 30/05/2010, à 15:36
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
De rien, ça m’a fait plaisir.
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2032 Le 30/05/2010, à 15:37
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Bon mon estimation était bonne : grâce à mon optimisation je consomme maintenant ~1/3 de mémoire en moins sur l'algo de génération le plus gourmand (pour le labyrinthe d'hier je passe de 3,0Mio à 2,1Mio), sans perte de vitesse .
Dernière modification par grim7reaper (Le 30/05/2010, à 15:41)
Hors ligne
#2033 Le 30/05/2010, à 15:38
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Bien joué ! \o/
Sinon, ça révise bien ? ^^
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2034 Le 30/05/2010, à 15:45
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Bien joué ! \o/
Merci , il y a eu quelques SIGSEGV mais je les ai rapidement éliminées.
Sinon, ça révise bien ? ^^
Je vais aller m'y mettre sérieusement là , j'avais des trucs à régler ce matin et là, il fallait que je finisse ça pour pouvoir avoir l'esprit tranquille. Donc pour le moment j'ai pas fait grand-chose mais là j'y vais.
Rien à voir avec l'optimisation que j'ai faite, mais voici the lines of death que j'ai pondu dans ma fonction de rendu.
int imax = (s.h / 2 / ppc < maze->m) ? y0 + (s.h / 2 / ppc) : maze->m;
int jmax = (s.w / 2 / ppc < maze->n) ? x0 + (s.w / 2 / ppc) : maze->n;
(Bon le code est loin d'être entièrement comme ça, et puis en réalité ces 2 lignes sont abondamment commentées).
Hors ligne
#2035 Le 30/05/2010, à 16:45
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Ho, facile, s.h pour height, s.w pour width, et tu prends le minimum entre s.h/2/ppc et maze->m ; ou maze->m si c’est égal.
Sinon, j’ai documenté une fonction directement dans la source, mais ça n’a pas l’air de marcher (ça n’apparaît pas dans les fichiers générés)…
/** Creates an option structure.
* This function will alloc memory needed for a struct option,
* initialize it with the right values; and return a pointer
* to the newly created struct option on a success, and NULL
* on a failure.
*/
struct option* new_option(void)
{
struct option* opt=smalloc(sizeof *opt);
if(opt)
{
opt->active=0;
opt->short_act="";
opt->short_unact="";
opt->takes_value=0;
opt->valuec=0;
opt->value=NULL;
opt->long_act=smalloc(sizeof *opt->long_act);
opt->long_unact=smalloc(sizeof *opt->long_unact);
opt->valuev=smalloc(sizeof *opt->valuev);
if(opt->long_act&&opt->long_unact&&opt->valuev)
{
opt->long_act[0]=NULL;
opt->long_unact[0]=NULL;
opt->valuev[0]=NULL;
}
else
{
free(opt->long_act);
free(opt->long_unact);
free(opt->valuev);
free(opt);
opt=NULL;
}
}
return opt;
}
Mon Doxyfile :
PROJECT_NAME = Libstropt
JAVADOC_AUTOBRIEF = YES
TAB_SIZE = 4
OPTIMIZE_OUTPUT_FOR_C = YES
J’ai fait une erreur quelque part ?
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2036 Le 30/05/2010, à 16:56
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Tu n'utilises pas les "balises" Doxygen dans ta documentation ?
Sinon, c'est ton Doxyfile entier ça ?
Parce qu'il me semble bien maigre (et je ne vois pas trop ce que le JAVADOC_AUTOBRIEF vient foutre dans du C ).
Il faudrait au minimum lui indiquer le dossier où générer la doc, les formats de sortie et aussi où choper les fichiers je pense.
En règle générale, on génère un fichier par défaut via
doxygen -g Doxyfile
puis on l'édite à la main pour l'adapter à ses besoins ou alors on passe par l'éditeur graphique (doxywizard).
Hors ligne
#2037 Le 30/05/2010, à 19:00
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Tu n'utilises pas les "balises" Doxygen dans ta documentation ?
Qu’est-ce ?
Sinon, c'est ton Doxyfile entier ça ?
Non, j’ai utilisé doxygen -g, mais je n’ai retranscrit que les champs dont j’ai changé la valeur par défaut. Mais avec juste ça, l’effet serait le même.
Je ne vois pas trop ce que le JAVADOC_AUTOBRIEF vient foutre dans du C .
Ça me permet d’avoir les briefs automatiques sur la première ligne, à la façon de Javadoc.
Il faudrait au minimum lui indiquer le dossier où générer la doc, les formats de sortie et aussi où choper les fichiers je pense.
Dans le comportement par défaut, il génère dans des répertoires situés dans le répertoire courant, les format de sortie sont LaTeX et HTML, et il choppe les fichiers dans le répertoire courant (et j’ai vérifié, mes fichiers *.c sont bien analysés). Donc nul besoin de modifier ces comportements par défaut, il me semble.
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2038 Le 30/05/2010, à 19:21
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
grim7reaper a écrit :Tu n'utilises pas les "balises" Doxygen dans ta documentation ?
Qu’est-ce ?
Les trucs qu'il y a là.
grim7reaper a écrit :Sinon, c'est ton Doxyfile entier ça ?
Non, j’ai utilisé doxygen -g, mais je n’ai retranscrit que les champs dont j’ai changé la valeur par défaut. Mais avec juste ça, l’effet serait le même.
Ok, donc les remarques suivante n'étaient pas justifiées.
Sinon je n'ai pas trop d'idée sur pourquoi ça ne fonctionne pas (j'ai toujours mis les chemins en durs dans mes doxyfile), mais je sais qu'en général je modifie plus de champs que ça (bon après ça dépend des projets aussi).
Au pire, essaye de passer par doxywizard.
Hors ligne
#2039 Le 30/05/2010, à 19:55
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Pylade a écrit :grim7reaper a écrit :Tu n'utilises pas les "balises" Doxygen dans ta documentation ?
Qu’est-ce ?
Les trucs qu'il y a là.
Ah, OK, je n’avais pas pigé. ^^
Sinon, mon problème est résolu : il suffisait de d’abord documenter le fichier, pour ensuite documenter les fonctions qui le composent. C’était tout con. ^^
Bon, /me va manger, et ensuite retourne à la doc, en fait c’est marrant.
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2040 Le 30/05/2010, à 20:42
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Bon, toujours avec le recodage de fonctions de string.h :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_strchr (const char*, char);
int main()
{
char str[] = "Test text";
char* strend = my_strchr (str, 's');
printf ("After the first s : %s", strend);
}
char* my_strchr (const char* str, char pat)
{
int i = 0;
while (str[i] != pat)
{
i++;
}
int j = strlen(str);
char returned[j-i];
for (i = i; i < j; i++)
{
returned[j-i] = str[i];
}
return returned;
}
`--> gcc strchr.c
strchr.c: In function ‘my_strchr’:
strchr.c:26: warning: function returns address of local variable
.-(~/Prog/C)-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(pierre@Lunaire)-
`--> ./a.out
After the first s : �����/���8��`��E���:��HK��zsh: exit 53 ./a.out
Une solution ?
J'utilise gcc sans option.
Dernière modification par Ouranos999 (Le 30/05/2010, à 20:43)
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2041 Le 30/05/2010, à 21:21
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Ouranos : tu renvoies tout simplement un pointeur vers une chaîne locale à ta fonction.
Je verrais ça comme ça :
char* my_strchr (const char* str, char pat)
{
int i = -1;
char end = 0;
char* ret;
while (str[++i] != pat && !end)
if(str[i] == '\0')
end = 1;
if(end)
ret = NULL;
else
ret = (char*) str + i;
return ret;
}
Ou alors, un peu moins beau mais plus court :
char* my_strchr (const char* str, char pat)
{
int i = -1;
while (str[++i] != pat)
if(str[i] == '\0')
return NULL;
return (char*) str + i;
}
D’autre part, dans ton main, pense à déclarer str en const char[] ; et n’oublie pas de terminer ce qui est envoyé sur la sortie standard par une nouvelle ligne.
Sinon, j’ai comme l’impression que je documente trop mes fonctions…
Et même beaucoup trop : je me retrouve pour certaines avec plus de documentation que de code. C’est grave ?
Un exemple symptomatique :
/** Deletes safely an option structure.
* This function deletes safely the option structure which
* is specified as argument, freeing all members of the
* structure. It needs to take the address of the pointer
* used, because it will assign it to NULL, in order to
* prevent from any further use of the deleted strucutre.
* Consequently, you are not supposed to use multiples
* copies of the pointer to any option structure.
*/
void delete_option(struct option** ptr)
{
int i=0;
free((*ptr)->long_act);
free((*ptr)->long_unact);
while(((*ptr)->valuev)[i])
free(((*ptr)->valuev)[i++]);
free((*ptr)->valuev);
free(*ptr);
*ptr=NULL;
}
Cela vous paraît-il raisonnable ?
Ah, et puis sinon, une question existentielle : pour le texte d’introduction à la licence, quel format trouvez-vous le mieux ?
Celui-ci ?
/*
* lisence
* lisence
* lisence
* lisence
*/
Ou celui là ?
/* lisence
* lisence
* lisence
* lisence
*/
Dernière modification par Pylade (Le 30/05/2010, à 21:32)
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2042 Le 30/05/2010, à 21:25
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Ouranos : tu renvoies tout simplement un pointeur vers une chaîne locale à ta fonction.
Je verrais ça comme ça :char* my_strchr (const char* str, char pat) { int i = -1; char end = 0; char* ret; while (str[++i] != pat && !end) if(str[i] == '\0') end = 1; if(end) ret = NULL; else ret = (char*) str + i; return ret; }
Tu pourrais commenter ? Ça m'a l'air bizarre, ton code : j'ai l'impression qu'il renvoie un nombre, alors que strchr renvoie une chaîne
Sinon, j’ai comme l’impression que je documente trop mes fonctions…
/** Deletes safely an option structure. * This function deletes safely the option structure which * is specified as argument, freeing all members of the * structure. It needs to take the address of the pointer * used, because it will assign it to NULL, in order to * prevent from any further use of the deleted strucutre. * Consequently, you are not supposed to use multiples * copies of the pointer to any option structure. */ void delete_option(struct option** ptr) { int i=0; free((*ptr)->long_act); free((*ptr)->long_unact); while(((*ptr)->valuev)[i]) free(((*ptr)->valuev)[i++]); free((*ptr)->valuev); free(*ptr); *ptr=NULL; }
Cela vous paraît-il raisonnable ?
Ah, et puis sinon, une question existentielle : pour le texte d’introduction à la licence, quel format trouvez-vous le mieux ?
/* * lisence * lisence * lisence * lisence */
/* lisence * lisence * lisence * lisence */
Le premier
On ne documente jamais assez ses fonctions.
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2043 Le 30/05/2010, à 21:36
- grim7reaper
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
@Ouranos999 : Pylade a mis le doigt sur le problème (retour d'adresse d'une variable locale).
Sinon, on est pas en C++ donc main() n'est pas équivalent à main(void). Le main() à un sens bien particulier en C et ce n'est pas celui que tu souhaites exprimer ici.
Hors ligne
#2044 Le 30/05/2010, à 21:39
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Sinon, on est pas en C++ donc main() n'est pas équivalent à main(void). Le main() à un sens bien particulier en C et ce n'est pas celui que tu souhaites exprimer ici.
Tu peux expliquer ?
@Pylade : D'accord, tu renvoies le pointeur. Je crois avoir compris.
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2045 Le 30/05/2010, à 21:42
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Tu pourrais commenter ? Ça m'a l'air bizarre, ton code : j'ai l'impression qu'il renvoie un nombre, alors que strchr renvoie une chaîne
J’ai édité mon message précédant, en rajoutant une autre version ; ainsi qu’une remarque à ton attention.
Et oui, mon code renvoie un nombre… qui est en fait un pointeur sur une chaîne de caractères.
En fait, c’est de l’arithmétique des pointeurs, quand tu incrémente d’un un pointeur, il pointe alors vers l’objet de son type suivant normalement. Ainsi, comme on a un chaîne de caractère, l’objet suivant est le caractère suivant. Un pointeur vers ce caractère sera alors par la même occasion un pointeur vers la chaîne commençant par ce caractère.
Tu remarqueras que l’on ne passe pas une chaîne, dans mon code, tout part n’importe comment, car je risque de faire un buffer overflow si le caractère n’est pas trouvé et que j’arrive à la fin du tableau de caractère sans trouver le caractère NUL…
Le premier
Vote enregistré.
On ne documente jamais assez ses fonctions.
Édit : bon, je me suis encore fait griller.
Et je n’avais pas vu le prototype du main.
En C, les seuls prototypes corrects pour main sont :
int main(void);
int main(int,char**);
En C, f() ne signifie pas que f ne prend aucun argument, mais qu’elle prend un nombre indéterminé d’arguments.
Voilà.
Bon codage, sinon.
Dernière modification par Pylade (Le 30/05/2010, à 21:49)
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2046 Le 30/05/2010, à 21:49
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Ouranos999 a écrit :Tu pourrais commenter ? Ça m'a l'air bizarre, ton code : j'ai l'impression qu'il renvoie un nombre, alors que strchr renvoie une chaîne
J’ai édité mon message précédant, en rajoutant une autre version ; ainsi qu’une remarque à ton attention.
Et oui, mon code renvoie un nombre… qui est en fait un pointeur sur une chaîne de caractères.
En fait, c’est de l’arithmétique des pointeurs, quand tu incrémente d’un un pointeur, il pointe alors vers l’objet de son type suivant normalement. Ainsi, comme on a un chaîne de caractère, l’objet suivant est le caractère suivant. Un pointeur vers ce caractère sera alors par la même occasion un pointeur vers la chaîne commençant par ce caractère.Tu remarqueras que l’on ne passe pas une chaîne, dans mon code, tout part n’importe comment, car je risque de faire un buffer overflow si le caractère n’est pas trouvé et que j’arrive à la fin du tableau de caractère sans trouver le caractère NUL…
Okay ! Merci pour l'explication !
Bon, je me suis fait grillé.
Et je n’avais pas vu le prototype du main.En C, les seuls prototypes corrects pour main sont :
int main(void);
int main(int,char**);En C, f() ne signifie pas que f ne prend aucun argument, mais qu’elle prend un nombre indéterminé d’arguments.
Voilà.
Bon codage, sinon.
Merci pour l'info. Main est pas censée ne pas avoir de prototype, normalement ?
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2047 Le 30/05/2010, à 22:04
- Pylades
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Merci pour l'info. Main est pas censée ne pas avoir de prototype, normalement ?
Mais, euh !
Ce n’est pas gentil de citer mes fautes d’orthographe.
Non, on n’écrit jamais le prototype de main, mais je l’ai fait pour des raisons démonstratives.
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#2048 Le 30/05/2010, à 22:35
- helly
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Bn
Archlinux-wmii-dwb.
Un problème résolu ? Faites le savoir en mettant [résolu] à côté du titre de votre topic.
Un problème non résolu ? Faites le savoir en insultant ceux qui cherchent à vous aider.
Un site bleu super remasterised©, un wiki cherchant des volontaires pour traduire un site.
Hors ligne
#2049 Le 30/05/2010, à 22:37
- \\Ouranos//
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
Ouranos999 a écrit :Merci pour l'info. Main est pas censée ne pas avoir de prototype, normalement ?
Mais, euh !
Ce n’est pas gentil de citer mes fautes d’orthographe.Non, on n’écrit jamais le prototype de main, mais je l’ai fait pour des raisons démonstratives.
D'accord, merci.
Ubuntu facile, c'est :
- Dire "Bonjour"
- Lire la doc et les règles du forum avant de poster. Savoir poser une question intelligemment.
- Mettre des balises url autour des liens et un tiret à su.
Hors ligne
#2050 Le 30/05/2010, à 22:45
- nesthib
Re : ..:: Topic des Codeurs Couche-Tard [0] ::..
plop
GMT+3
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne