begin process at 2012 02 07 08:47:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > 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

Note :
Aucune note
Catégorie :Astuces Classé sous :vector, vecteur, dynamique, générique Niveau :Débutant Date de création :27/02/2007 Date de mise à jour :28/02/2007 09:33:54 Vu / téléchargé :4 598 / 138

Auteur : spiky31

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   SVector
    •   Release
      • SVector.ex_Télécharger ce fichier [Réservé aux membres club]49 152 octets
    • main.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 037 octets
    • SVector.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 411 octets
    • SVector.slnTélécharger ce fichier [Réservé aux membres club]Voir ce fichier878 octets
    • SVector.suoTélécharger ce fichier [Réservé aux membres club]11 264 octets
    • SVector.vcprojTélécharger ce fichier [Réservé aux membres club]3 973 octets

Télécharger le zip


 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

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [C++] CLASSE DE GESTION DE FONCTIONS par pop70
Source avec Zip Source avec une capture ALGORITHME DE CRYPTAGE/DECRYPTAGE par besilent
Source avec Zip Source avec une capture MODÉLISATION D'UNE SURFACE AVEC UN MAILLAGE MASE RESSORT OPE... par SebLinck
Source avec Zip CHAINE RADIO/TV par snpier wolf
FILE DE PRIORITÉ DYNAMIQUE par mehdi7604

Commentaires et avis

Commentaire de acx01b le 28/02/2007 00:22:02

salut!

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+

Commentaire de spiky31 le 28/02/2007 00:45:33

Salut

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

Commentaire de vicenzo le 28/02/2007 14:10:37

pour le tri, pourquoi pas faire un qsort tout simple...qui sera autrement plus performant..

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...

 Ajouter un commentaire


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&lt;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&#233;rences (avantages et/ou inconv&#233;nients) y-a t'il entre un parcours de vecteur &#224; 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&lt;Graph&gt; 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 &#224; 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,231 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales