|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 39 ![]() |
Bonjour !
Dans certaines applications qui doivent charger, interpréter, écrire des fichiers, les opérations de lecture/écriture prennent parfois beaucoup de temps J'ai donc progammé une bibliothèque de fonctions de lecture/écriture dans des fichiers, avec un buffer. Par exemple dans le cas de l'importation d'un fichier WAV avec traitement et écriture à la volée, j'ai diminué le temps d'exécution par 4. Je donne les sources ici, c'est une archive 7-zip. J'ai créé 2 structures de données, une pour le buffer en lecture et une pour le buffer en écriture. Principalement parce que c'est beaucoup plus facile comme ça Les fonctions disponibles sont : - écriture/lecture d'un unique caractère - écriture/lecture d'une plage entière - positionnement à un endroit particulier dans le fichier - récupérer la position courante |
|
|
00
|
|
|
#2 | ||||
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 437 ![]() |
Quelques remarques (en commentaires) après une lecture rapide :
Code :
Code :
|
||||
|
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 39 ![]() |
Bonjour !
En effet diogene, je m'étais aperçu de la perte de mémoire mais je n'avais pas internet pendant ces vacances alors je n'ai pas encore actualisé le code. Je crois bien que j'ai aussi fait une ou deux retouches plus esthétiques qu'autre chose, en tout cas ce sera dans le nouveau code. Je préviendrai quand il sera disponible. Remplacer Code :
if(fb->file == NULL) return NULL; // perte mémoire Code :
if(fb->file == NULL) {free(fb); return NULL;} Si on veut écrire des données int ou double ou n'importe quelle structure exotique on met tranquilement : Code :
filebuf_addm(&ma_donnee, sizeof(ma_donnee), fb) |
|
|
00
|
|
|
#4 |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 437 ![]() |
Le passage d'un void * en paramètre est logique. C'est l'incrément du void *,qui me gène :
Du fait que le type (donc la taille) de l'objet pointé est inconnu, de combien sera incrémenté ptr ? En bonne logique, ce devrait être interdit. J'ai testé sur 2 compilateurs. Le premier me donne une erreur et le second un warning (ce qui est le moins qu'on puisse attendre). Je n'ai pas trouvé de comportement clairement défini dans la norme sur la question de l'arithmétique mettant en cause un pointeur sur void. Pour ces raisons, j'éviterais ce genre d'écriture. |
|
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 39 ![]() |
J'ai actualisé les sources avec les modifications que j'ai indiquées dans mon dernier post.
Je donne les sources ici, c'est une archive 7-zip. Pourtant, je n'ai aucune erreur ni aucun warning de compilation (avec mingw sous windows) alors je ne me suis pas préoccupé du tout de la manipulation du void*. Peux-tu indiquer les compilateurs que tu as utilisé ? En tout cas si on fait comme ça le problème doit être réglé : Je vais me documenter un peu avant de faire la modif dans le code. En tout cas il y a plusieurs endroits à modifier. Mais quand même, vu que l'unité élémentaire de mémoire c'est l'octet, mon void* pointe vers un certain octet, alors en incrémentant de N on va aller N octets plus loin... et comme sizeof() renvoie un nombre d'octets, tout le monde doit être content ! en fait je ne vois pas trop comment il faut se représenter ce fameux void* si tu dis que ça pose problème... pour moi c'est de le transtyper en char* qui n'est pas logique parce que la nature des données manipulées on s'en moque pas mal. Est-ce que tu peux expliquer ? et dire dire ce qui ne va pas dans mon avis ? |
|
|
00
|
|
|
#6 | |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 437 ![]() |
Un compilateur Borland (Builder 6) indiquait une erreur. Mingw émettait un warning. Ca doit dépendre des options de warnings à la compilation si le tien était muet sur le sujet.
Pour info, l'unité de mémoire est le byte (qui correspond souvent à un octet). La norme dit Citation:
Normalement, incrémenter un pointeur augmente l'adresse concernée du nombre de bytes égal à la taille de l'objet pointé. Dans le cas de void *, cette taille est inconnue et on ne devrait pas faire d'arithmétique sur ces pointeurs (ni les déréférencer). C'est leur différence par rapport à un char*. A ta place, j'opérerais un transtypage tant que ce point est incertain. |
|
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 39 ![]() |
Aah bah si c'est la norme qui le dit
J'ai mis à jour le code, toujours dispo ici en archive 7-zip. Mais quand je compile j'active TOUS les warnings pourtant (-Wall), sous MingW et rien n'apparaît à ce sujet. J'ai une version plutôt récente de MingW, celle incluse dans CodeBlocks 8.02 |
|
|
00
|
|
|
#8 | |
![]() ![]() |
Citation:
.
|
|
|
|
00
|
|
|
#9 |
|
Membre expérimenté
![]() Étudiant Inscription : juillet 2007 Messages : 472 ![]() |
Il y a les fonctions setbuf() et setvbuf().
__________________
:wq |
|
|
00
|
|
|
#10 | ||
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 39 ![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com