Accueil > > > IMPLÉMENTATION D'UNE STRUCTURE DE DONNÉE DYNAMIQUE ET GÉNÉRIQUE DE TYPE "VECTOR" EN C
IMPLÉMENTATION D'UNE STRUCTURE DE DONNÉE DYNAMIQUE ET GÉNÉRIQUE DE TYPE "VECTOR" EN C
Information sur la source
Description
Alors voila, je croi que tout est dans le titre. J'ai fais ca un peu a la va-vite car j'en avais besoin tout de suite ;-) J'ai mis une petite batterie de test avec pour que vous compreniez comment ca marche. ATTENTION !!!! : Aucune gestion d'erreur n'est effectuée, a utiliser en faisant trés attention avec les MACROS. Je vous aurais prévenu ...
Source
- #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) \
- *(ret) = name->elements[pos]; \
- for (i = pos;i < name->nbElements - 1;i++) \
- name->elements[i] = name->elements[i + 1]; \
- name->nbElements--; \
- } while (0)
-
- // Supprimer un element, il est retourner dans ret (qui doit etre de type "type *")
- // ret peut etre NULL
- // La fonction funcCompare doit etre du type "int (*func)(type element1,type element2)"
- // et doit retourner 0 si element1 == element2 et != 0 sinon
- // ne fait rien si element pas trouve :
- #define removeElement(name,funcCompare,element,ret) \
- do \
- { \
- int i,j; \
- for (i = 0;i < name->nbElements;i++) \
- if (!funcCompare(element,name->elements[i])) \
- break; \
- if (i == name->nbElements) \
- break; \
- if ((ret) != 0) \
- *(ret) = name->elements[i]; \
- for (j = i;j < name->nbElements - 1;j++) \
- name->elements[j] = name->elements[j + 1]; \
- name->nbElements--; \
- } while (0)
-
- // Trouve un element dans SVector et met sa position dans ret qui doit etre de type "int *"
- // La fonction funcCompare est la meme que pour "removeElement"
- // ret sera -1 si element pas trouve :
- #define findElement(name,funcCompare,element,ret) \
- do \
- { \
- int i; \
- for (i = 0;i < name->nbElements;i++) \
- if (!funcCompare(element,name->elements[i])) \
- break; \
- if (i == name->nbElements) \
- { \
- *(ret) = -1; \
- break; \
- } \
- *(ret) = i; \
- } while (0)
-
- // Trie le SVector avec l'algo de tri a bulle
- // La fonction funcCompare doit etre du type "int (*func)(type element1,type element2)"
- // et doit retourner val < 0 si element1 < element2, val > 0 si element1 > element2
- // val = 0 si element1 == element2 :
- #define sort(type,name,funcCompare) \
- do \
- { \
- int size,i,fini; \
- type tmp; \
- size = name->nbElements; \
- do \
- { \
- fini = 1; \
- for (i = 0;i < size - 1;i++) \
- if (funcCompare(name->elements[i],name->elements[i + 1]) > 0) \
- { \
- tmp = name->elements[i]; \
- name->elements[i] = name->elements[i + 1]; \
- name->elements[i + 1] = tmp; \
- fini = 0; \
- } \
- size--; \
- } while (!fini); \
- } while (0)
-
- #endif
#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) \
*(ret) = name->elements[pos]; \
for (i = pos;i < name->nbElements - 1;i++) \
name->elements[i] = name->elements[i + 1]; \
name->nbElements--; \
} while (0)
// Supprimer un element, il est retourner dans ret (qui doit etre de type "type *")
// ret peut etre NULL
// La fonction funcCompare doit etre du type "int (*func)(type element1,type element2)"
// et doit retourner 0 si element1 == element2 et != 0 sinon
// ne fait rien si element pas trouve :
#define removeElement(name,funcCompare,element,ret) \
do \
{ \
int i,j; \
for (i = 0;i < name->nbElements;i++) \
if (!funcCompare(element,name->elements[i])) \
break; \
if (i == name->nbElements) \
break; \
if ((ret) != 0) \
*(ret) = name->elements[i]; \
for (j = i;j < name->nbElements - 1;j++) \
name->elements[j] = name->elements[j + 1]; \
name->nbElements--; \
} while (0)
// Trouve un element dans SVector et met sa position dans ret qui doit etre de type "int *"
// La fonction funcCompare est la meme que pour "removeElement"
// ret sera -1 si element pas trouve :
#define findElement(name,funcCompare,element,ret) \
do \
{ \
int i; \
for (i = 0;i < name->nbElements;i++) \
if (!funcCompare(element,name->elements[i])) \
break; \
if (i == name->nbElements) \
{ \
*(ret) = -1; \
break; \
} \
*(ret) = i; \
} while (0)
// Trie le SVector avec l'algo de tri a bulle
// La fonction funcCompare doit etre du type "int (*func)(type element1,type element2)"
// et doit retourner val < 0 si element1 < element2, val > 0 si element1 > element2
// val = 0 si element1 == element2 :
#define sort(type,name,funcCompare) \
do \
{ \
int size,i,fini; \
type tmp; \
size = name->nbElements; \
do \
{ \
fini = 1; \
for (i = 0;i < size - 1;i++) \
if (funcCompare(name->elements[i],name->elements[i + 1]) > 0) \
{ \
tmp = name->elements[i]; \
name->elements[i] = name->elements[i + 1]; \
name->elements[i + 1] = tmp; \
fini = 0; \
} \
size--; \
} while (!fini); \
} while (0)
#endif
Conclusion
Bon beh si vous avez des suggestions, n'hésitez pas ... Merci de me prévenir si vous constatez un bug
Historique
- 27 février 2007 21:56:30 :
- suppression des tabulations du code source
- 28 février 2007 09:33:55 :
- ajout des modifications enoncées dans mon commentaire
sauf pour le tri fusion
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
vector [ par borgeomi ]
borgeomibonjouuuuuuur !!!!!j'ai crée un vectorstruct enregistrement {string zone_date;string zone_montant;string zone_nom;};typedef vector<enregist
Pb de vecteur d'objet [ par 9sber ]
Salut tout le mondeJ'ai longtemps cherché sur le forum des infos sur mon pb avant d'envoyer un p'tit msg mais voilà:J'essaie de créer un vecteur d'obj
MULTIPLICATION D'UNE MATRICE PAR UN VECTEUR [ par jfk20004 ]
Quelqu'un pourrait il m'expliquer le bout de code suivant tiré d'un prog de raytrace .Cette partie est censée multiplier une matriceet un vecteur.Je n
vector [ par Vincentsoft ]
Salut, J'aimerai simplement savoir quelles différences (avantages et/ou inconvénients) y-a t'il entre un parcours de vecteur à l'aide
initialisation d'un vecteur [ par dud1410 ]
salut tout le monde, est ce que quelqu'un peut me dire comment initialiser un vector de taille l contenant L vector of int??merci d'avance <img src=
STL : Vector, Deque ou Map ? [ par jul39dole ]
Bonjour,Je ne sais pas trop quoi choisir comme conteneur... Voici mon problème : j'utilise un vector, chaque case du vector contient un set. Le problè
[STL] vector d'une classe [ par Fa7 ]
Bonjour J'ai un probleme. j'ai un vecteur d'une classe que j'ai definie vector<Graph> vectGraph; et quand je je veux ajouter un graphe dans le
Vector de classe [ par 0xYg3n3 ]
Bonjour, Voila j'ai defini un vecteur de classe Mais le probleme c'est que je ne sais pas comment ajouter un objet avec un vecteur. En effet ma class
valeur du vector erronée [ par Spiffou ]
bonsoir à tous, j'ai un petit probleme de vector dans mon prg c++ (vc7). j'utilise un vecteur contenant des structures "coup" struct Coup { &nb
Alloc dynamique pour un std vector ? [ par statquant ]
Bonjour, Je croyais que les std vector etaient un moyen de créer un vecteur dynamiquement, est ce vrai ?? En autre terme y'a t'il un interet à ecrire
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Forum
RE : ARBRE BINAIRERE : ARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|