Ah ? Il y a un realloc() dans ton code ? Je ne l'ai pas vu. Il ne faut pas recopier du code qu'on ne comprend pas et si on ne le comprends pas, il faut poser des questions, (surtout si l'auteur est à portée de main...)Envoyé par Spootnik
http://emmanuel-delahaye.developpez....tes.htm#malloc
http://emmanuel-delahaye.developpez....es.htm#realloc
Ben non. avec malloc() , c'est plus simple parce que allouer, c'est pas pareil que réallouer...Bien que dans la table ce soit avec malloc(), le principe est le même.
Euh, tu peux justifier ? Parce que ça va à l'encontre de la pratique universellement reconnue qui veut que les fonctions de bas niveau (qui ne savent même pas ce qu'est un printf(), les pauvres...) soient évidemment "muettes" (sauf en mode debug, mais c'est autre chose), mais qu'elles retournent un code OK ou erreur (comme fopen(), malloc(), fgetc() etc.). Tu as déjà vu une fonction de bibliothèque pleurer sa mère parce qu'il y a une erreur ?)De plus, je tiens à prévenir l'utilisateur en cas d'erreur, et non pas simplement renvoyer un pointeur NULL.
Au contraire, le code d'erreur est remonté au plus haut niveau (applicatif) et là, une décision intelligente et contextuelle est prise :
- Ficher inconnu ? -> création ou proposition de création etc.
- Pas assez de mémoire -> on recommence dans 1 seconde. Trop d'essais ? On sauvegarde et on quitte en prévenant gentiment l'utilisateur etc.
Ce n'est pas à la bibliothèque de prendre ce genre de décision. Jamais.
Ah ? Pourquoi 2 return ?. Et tu connais maintenant ma position sur les messages. En mode Debug, OK. Pas en Release. Pas besoin de noms compliqué. On a un pointeur, p suffit bien. Je te montre une méthode d'initialisation rapide et portable et auto évolutive :Cela pourrait donner quelquechose comme ça :
Je ne trouve pas ce code compliqué.
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 // creation de la Table Table *newTable(void) { // allocation de l espace necessaire Table *newTable = malloc(sizeof(Table)); if (newTable != NULL) { // quelques mises au point une fois la memoire allouee newTable->count = 0; newTable->Items = NULL; return newTable; } else { puts("*** erreur: newTable(): memoire insuffisante\n"); // retour NULL en cas de probleme lors de l allocation return NULL; } }
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 // creation de la Table Table *newTable(void) { // allocation de l espace necessaire Table *p = malloc (sizeof *p); if (p != NULL) { /* mise a 0 automatique de tous les champs. */ static const Table z = {0}; *p = z; } #if DBG else { puts("*** erreur: newTable(): memoire insuffisante\n"); } #endif return p; }Pas du tout. Tu devrais lire la norme plus souvent.NULL est défini par (en tout cas chez moi, mais je pense que c'est pareil chez tout le monde non ?) :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL 0
http://emmanuel-delahaye.developpez.com/notes.htm#norme
Sur le plan sémantique, NULL est équivalent à 0 dans le contexte d'un pointeur, mais il peut être implémenté au moins de 2 façons :
et j'ai déjà vu ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define NULL 0 #define NULL ((void*)0)
alors se garder de toute hypothèses, et ne pas utiliser les éléments du langage hors de leur contexte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL __null
Pour un caractère, c'est 0 ou '\0' si tu veux te la péter.
Tu te trompes et mon compilateur s'en est aperçu.Donc renvoyer NULL ou 0 revient au même (si les définitions sont les mêmes sur tous les systèmes). Je me trompe ?
Oui. Pour rester portable, se limiter au charset officiel :Tu parles des apostrophes et des quelques caractères accentués c'est ça ?
http://emmanuel-delahaye.developpez....htm#caracteres
Partager