Re: taille d'objet générique
Citation:
Envoyé par Heimdall
comment dans un module supposé générique peut-on retrouver la taille d'un objet utilisateur ?
On la lui fournit.
http://emmanuel-delahaye.developpez.com/clib.htm
Module OBJ
Citation:
par exemple des fonctions comme qsort nécessitent la taille des éléments a trier, ou encore fread() etc...
pour ces deux fonctions, il ya a un parametre "nombre d'élements du tableau" et un parametre "taille d'un élément"
Citation:
par exemple disons que j'ai du coté utilisateur un tableau de double, dans mon module générique les double seront pointés par des void*, seulement comment faire pour savoir que ce sont des double ?
On ne le sait pas. On ne connais que l'adresse et la taille. On ne connait pas le type. C'est pour ça que dans qsort(), la fonction qui a besoin de connaitre le type est fournie par l'utilisateur (callback), par lui, il connait le type.
Citation:
pour exemple ce programme :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
double a = 4;
void *p;
p = &a;
printf("sizeof(double) = %d\n",sizeof(double));
printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(*p) = %d\n",sizeof(*p));
return 0;
} |
qui sans surprise m'affiche :
Pour moi, la surprise, c'est qu'il compile.
Code:
1 2 3 4
| Compiling MAIN.C:
Error MAIN.C 14: Not an allowed type
Error MAIN.C 14: Not an allowed type
Warning MAIN.C 18: 'p' is assigned a value that is never used |
Reessaye en mode ANSI strict, parce que ça ressemble à une extension bien connue de gcc qui attribue 1 à sizeof (void), ce qui est contraire aux regles du langage C.
Citation:
Code:
1 2 3
| sizeof(double) = 8
sizeof(a) = 8
sizeof(*p) = 1 |
et comme coté module je n'ai que '*p' sous la main, impossible de savoir que mes éléments font '8' en taille, ce qui est la source de nombreux disfonctionnements...
C'est une question de domaine. Regarde bien comment est utilisé qsort().
On passe l'adresse et les tailles à la fonction.
Le callback passe les adresses. C'est l'utilisateur qui connait les types (et donc les tailles)
Il faut travailler en couches 'domaines' :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
qsort(..., compare);
| -------------------
| | compare() |
| -------------------
| | ... |
| -------------------
Application | ^
--------------------|----------------------------|---------
Bibliothèque | |
v |
--------------------------- |
| qsort(..., pf_compare) | |
--------------------------- |
| ... | |
| (*pf_compare)(...); | --
| ... |
--------------------------- |
Re: taille d'objet générique
Citation:
Envoyé par Emmanuel Delahaye
http://emmanuel-delahaye.developpez.com/clib.htm
Module OBJ
ok, un brin trop abstrait/compliqué pour moi :-)
Citation:
On ne le sait pas. On ne connais que l'adresse et la taille. On ne connait pas le type. C'est pour ça que dans qsort(), la fonction qui a besoin de connaitre le type est fournie par l'utilisateur (callback), par lui, il connait le type.
ah oui ok, bon voyant vite fait ton code OBJ, il est vrai que la 'taille' est un paramètre de l'objet et par conséquent devrait faire partie d'un module abstrait sensé le représenter, comme tu l'a fait. Cependant j'ai aps envie de me casser à faire ce genre de trucs un brin compliqué et pas vraiment utile pour moi en ce moment, étant donné que mes listes sont sensées êtres utilisées pour y stocker des nombres.
Citation:
Pour moi, la surprise, c'est qu'il compile.
[code]Compiling MAIN.C:
Error MAIN.C 14: Not an allowed type
Error MAIN.C 14: Not an allowed type
Warning MAIN.C 18: 'p' is assigned a value that is never used
Reessaye en mode ANSI strict, parce que ça ressemble à une extension bien connue de gcc qui attribue 1 à sizeof (void), ce qui est contraire aux regles du langage C.
je sais pas quoi dire... j'ai pourtant dis à devc++ de respecter le C ansi, d'ailleurs dans la commande de compil je vois '-ansi'
Citation:
C'est une question de domaine. Regarde bien comment est utilisé qsort().
On passe l'adresse et les tailles à la fonction.
Le callback passe les adresses. C'est l'utilisateur qui connait les types (et donc les tailles)
ok je comprends. J'avance... pas encore fini mais pas loin : http://nicolas.aunai.free.fr/particule/vect/ je me suis inspiré de ton site pour la présentation d'ailleurs ;-)
Re: taille d'objet générique
Je vois ça! Ca fait plaisir.
Attention à ça:
Code:
1 2
| #ifndef _LIST_H
#define _LIST_H_ |
Tu ne respecte pas mes conventions :
http://emmanuel-delahaye.developpez.com/codage.htm#nommage
libre à toi, mais tu brises une regle du C qui dit que les identificateurs commençant par '_' suivit de '_' ou 'A'..'Z' sont réservés pour l'implémentation. A ta place, je ne pourrais plus dormir!
Re: taille d'objet générique
Citation:
Envoyé par Emmanuel Delahaye
Je vois ça! Ca fait plaisir.
ton site rassemble les exemples de rigueur absolue, peut-etre même trop d'ailleurs, que j'ai commencé à connaitre sur fclc et sur ce point c'est bien.
M'enfin je te soupçonne de t'avoir fait des log qui te préparent tous tes trucs genre fichiers etc.... parce que sinon c'est vrai que c'est chiant. m'enfin ça permet d'etre lisible (RElisible surtout)
pendant qu'on parle de ton site, un truc à signaler, je trouve assez emmerdant la petite "infobulle" qui se trimballe sous le curseur tout le temps pour répéter le titre de la page.. ça cache constamment ce qu'on lis... m'enfin c'est un avis perso ;-)
Citation:
Attention à ça:
Code:
1 2
| #ifndef _LIST_H
#define _LIST_H_ |
Tu ne respecte pas mes conventions :
http://emmanuel-delahaye.developpez....ge.htm#nommage
libre à toi, mais tu brises une regle du C qui dit que les identificateurs commençant par '_' suivit de '_' ou 'A'..'Z' sont réservés pour l'implémentation. A ta place, je ne pourrais plus dormir!
ah euh ouais... mais quand je vois ça :
Code:
H_ED_EXEMPLE_20040529115235
j'ai peur...
Re: taille d'objet générique
Citation:
Envoyé par Heimdall
ton site montre un exemple de rigueur absolue, peut-etre même trop d'ailleurs, m'enfin je te soupçonne de t'avoir fait des log qui te préparent tous tes trucs genre fichiers etc....
J'ai effectivement écrit un générateur de code qui à partir de 'xxx' construit xxx.c, xxx.h et txxx.c (le fichier de test unitaire), avec entête, datation automatique, protection, organisation, structures, prototypes, etc. Vive le C, bien que c'est sûrement plus facile à faire en d'autres langages que je ne connais pas...
Citation:
pendant qu'on parle de ton site, un truc à signaler, je trouve assez emmerdant la petite "infobulle" qui se trimballe sous le curseur tout le temps pour répéter le titre de la page.. ça cache constamment ce qu'on lis... m'enfin c'est un avis perso ;-)
Euh, ok, je vais voir ça... Je ne suis pas trop sûr de savoir la retirer... Le HTML, je débute, et franchement, ça ne me passione pas!
Citation:
<...>mais quand je vois ça :
Code:
H_ED_EXEMPLE_20040529115235
j'ai peur...
Arf! Pareil c'est de la génération automatique.
H : header (pour être sûr de ne pas commencer par E qui est réservé pour les codes d'erreur : ERANGE etc.)
ED : c'est moi!
EXEMPLE : sans commentaires...
20040529115235 = Le 2004/04/05 à 11:52:35
Mais tu peux mettre
Code:
1 2 3
|
#ifndef H_LIST
#define H_LIST |
et tout le monde est content.
D'ailleurs, il y avait une erreur dans ton code qui fait que la protection ne fonctionne pas :
Code:
1 2
| #ifndef _LIST_H
#define _LIST_H_ |
Les deux identificateurs doivent être strictement identiques, or ici, il y a un '_' qui traine...
Re: taille d'objet générique
Citation:
Envoyé par Emmanuel Delahaye
J'ai effectivement écrit un générateur de code qui à partir de 'xxx' construit xxx.c, xxx.h et txxx.c (le fichier de test unitaire), avec entête, datation automatique, protection, organisation, structures, prototypes, etc. Vive le C, bien que c'est sûrement plus facile à faire en d'autres langages que je ne connais pas...
ahaha oui j'en étais sûr :
Code:
/* File generated by 'NEW.EXE' Ver 1.10 (c) ED 1998 */
en parlant de tests unitaires, il serait aussi intéressant de voir une page explicant les démarches rigoureuses de tests d'un module en C dans tes pages... justement je cherche à en fait un pour mes 'list' et 'vect' cependant je ne vois pas trop par où commencer pour faire un truc béton.
Citation:
Euh, ok, je vais voir ça... Je ne suis pas trop sûr de savoir la retirer... Le HTML, je débute, et franchement, ça ne me passione pas!
le coté intéressant dans la conception web c'est le côté respect de la norme w3c je trouve. Les CSS permettent de faire des choses fantastiques...
Citation:
Code:
H_ED_EXEMPLE_20040529115235
Arf! Pareil c'est de la génération automatique.
je m'en serai bien douté.
Citation:
H : header (pour être sûr de ne pas commencer par E qui est réservé pour les codes d'erreur : ERANGE etc.)
ED : c'est moi!
EXEMPLE : sans commentaires...
20040529115235 = Le 2004/04/05 à 11:52:35
oui oui j'avais vu l'explication, c'est un peu barbare quand même ;-)
Citation:
Mais tu peux mettre
Code:
1 2 3
|
#ifndef H_LIST
#define H_LIST |
et tout le monde est content.
D'ailleurs, il y avait une erreur dans ton code qui fait que la protection ne fonctionne pas :
Code:
1 2
| #ifndef _LIST_H
#define _LIST_H_ |
Les deux identificateurs doivent être strictement identiques, or ici, il y a un '_' qui traine...
AH merci, une boulette que j'avais pas vu !
Re: taille d'objet générique
Citation:
Envoyé par Heimdall
en parlant de tests unitaires, il serait aussi intéressant de voir une page explicant les démarches rigoureuses de tests d'un module en C dans tes pages... justement je cherche à en fait un pour mes 'list' et 'vect' cependant je ne vois pas trop par où commencer pour faire un truc béton.
Ok, Je vais y refléchir.
Citation:
Code:
H_ED_EXEMPLE_20040529115235
oui oui j'avais vu l'explication, c'est un peu barbare quand même ;-)
Tes jugements de valeur à l'emporte-pièce m'étonneront toujours...