Soyez le premier à donner votre avis sur cette source.
Vue 5 881 fois - Téléchargée 228 fois
#ifndef SVECTOR_H #define SVECTOR_H #ifdef _WIN32 #include <windows.h> #define SMalloc(size) VirtualAlloc(NULL,size,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,PAGE_READWRITE) #define SFree(ptr) VirtualFree(ptr,0,MEM_RELEASE) #define SMemCpy CopyMemory #else #include <stdlib.h> #include <string.h> #define SMalloc malloc #define SFree free #define SMemCpy memcpy #endif // Peut etre modifier selon les besoins : #define REALLOC_SIZE 100 // Declare le SVector : #define declareSVector(type,name) \ struct SVector##name \ { \ type *elements; \ unsigned int nbElements; \ unsigned int allocatedSize; \ } *name // Creation de SVector : #define createSVector1(type,name) \ do \ { \ name = SMalloc(sizeof(struct SVector##name)); \ name->nbElements = 0; \ name->allocatedSize = REALLOC_SIZE; \ name->elements = SMalloc(REALLOC_SIZE * sizeof(type)); \ } while (0) // Creation de SVector en precisant la taille alouee en argument : #define createSVector2(type,name,size) \ do \ { \ name = SMalloc(sizeof(struct SVector##name)); \ name->nbElements = 0; \ name->allocatedSize = size; \ name->elements = SMalloc((size) * sizeof(type)); \ } while (0) // Destruction de SVector : #define destroySVector(name) \ do \ { \ SFree(name->elements); \ SFree(name); \ } while (0) // Acces a un element : #define elementAt(name,pos) (name->elements[pos]) // Nombre d'elements de SVector : #define sizeOf(name) (name->nbElements) // Ajouter un element : #ifdef _WIN32 #define addElement(type,name,element) \ do \ { \ if (name->allocatedSize == name->nbElements) \ { \ type *tmp; \ name->allocatedSize += REALLOC_SIZE; \ tmp = SMalloc(name->allocatedSize * sizeof(type)); \ SMemCpy(tmp,name->elements,name->nbElements * sizeof(type)); \ SFree(name->elements); \ name->elements = tmp; \ name->elements[name->nbElements++] = element; \ } \ else \ name->elements[name->nbElements++] = element; \ } while (0) #else #define addElement(type,name,element) \ do \ { \ if (name->allocatedSize == name->nbElements) \ { \ name->allocatedSize += REALLOC_SIZE; \ name->elements = realloc(name->elements,name->allocatedSize * sizeof(type)); \ name->elements[name->nbElements++] = element; \ } \ else \ name->elements[name->nbElements++] = element; \ } while (0) #endif // Supprime un element a la position pos, il est retourne dans ret (qui doit etre de type "type *") // ret peut etre NULL // ne fait rien si pos trop grand : #define removeAt(name,pos,ret) \ do \ { \ int i; \ if (pos >= name->nbElements) \ break; \ if ((ret) != 0) \
qsort(name->elements, name->nbElements, sizeof(type), funcCompare);
Sinon, l'utilisation de telles macros génère beaucoup trop de code, et détourne l'utilité des macro. Les macro sont là pour aider à coder, pas pour essayer de faire ce que le langage ne sait pas ou ne peut faire. Il vaut mieux faire un préprocesseur sans ce cas...
De plus, il est possible d'avoir une approche générique sans passer par des macros...
Pour le realloc dans la version non windows j'y ai pensé et je viens de réaliser que se serait facile a faire donc je le modifirais.
Pour le do{...] while (0) je sais pas pourquoi je l'ai pas mis mais je le rajouterais si sa peut te fare plaisir ;-)
Je prevoirais le cas de removeAt(monvector,2,NULL) c'est une bonne idée.
Le createSVector(type,name,size) j'y ai meme pas pensé je le rajouterais aussi.
Quant au tri fusion, pour l'instant je vois pas trop comment faire, mais je vais y réfléchir ...
bref il y a du travail lol :-)
Merci beaucoup pour ton commentaire constructif, ca fait plaisir.
a bientot
tu devrais utiliser realloc plutôt que malloc pour ajouter un élément dans addElement pour la version non windows ?
pourquoi tu mets bien le do { ... } while (0) sauf dans createSVector et destroySVector ?
souvent on propose de retourner une valeur dans un pointeur, ou non si le paramètre est NULL par exemple:
removeAt(monvector,2,NULL)
ça pourrait être intéressant de prévoir ça
pourquoi tu utilises le tri à bulle et pas le quicksort, ou le tri fusion ?
pourquoi pas #define createSVector(type,name,size) ???
a+
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.