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
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è
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 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
[TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010[TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010 par pierre
Stephane Cordonnier de MCNext nous présente les fonctionnalités Web Content Management (WCM) sous SharePoint 2010. Qu'est-ce que le WCM ECM, GED, RM, WCM c'est quoi Plateforme SharePoint Versions SharePoint 2010 SharePoint Fondation...
Cliquez pour lire la suite de l'article par pierre [DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE[DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE par tja
C'est le dernier principe des principes du Design Orienté Objet (The Principles of Object Oriented Design) fondés par Robert C. Martin plus connu sous le pseudonyme d'Uncle Bob.
l'image empruntée de LosTechies.
Je ne traite pas les principes dans...
Cliquez pour lire la suite de l'article par tja TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante
Forum
CAST DE POINTEURSCAST DE POINTEURS par zaraki21
Cliquez pour lire la suite par zaraki21 CARTE GOOGLECARTE GOOGLE par ja92
Cliquez pour lire la suite par ja92 RE : WIN APIRE : WIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|