begin process at 2012 05 24 02:34:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Api Windows

 > CRÉER DES TABLEAUX DE DONNÉES DE MANIÈRE DYNAMIQUE

CRÉER DES TABLEAUX DE DONNÉES DE MANIÈRE DYNAMIQUE


 Information sur la source

Note :
Aucune note
Catégorie :Api Windows Classé sous :dynamic, array, tableau, heap, HeapReAlloc Niveau :Débutant Date de création :27/11/2010 Vu / téléchargé :1 914 / 85

Auteur : ToutEnMasm

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

 Description

Le source est composé de plusieurs fonctions (utilisables par inclusion du fichier).
Il est assez prétentieux puisque il veut simplifier le problème.
Un exemple,des plus simples,est fourni et le source est abondamment commenté.


 Conclusion

Ne risquer plus les memory leak,utiliser la mémoire de manière dynamique,c'est plus simple.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip LA COMMUNICATION ENTRE PROGRAMMES PAR ECHANGES DE MESSAGES
Source avec Zip EDITEUR AVEC RICHEDIT ET OLE (POUR LES PHOTOS..)
Source avec Zip METTRE UN BOUTON DANS UN CONTROLE EDIT
Source avec Zip ARCHIVEUR DE PROJETS ASM OU C++
Source avec Zip DISTRIBUTEUR DE FICHIERS

 Sources de la même categorie

Source avec Zip Source avec une capture BODY_ROTATION BASÉ SUR LE TRAVAIL DE TOM par jose2pepe
Source avec Zip Source avec une capture FROM TOM'S CUBE_ROTATION AND CUBE_5 CUBE COLOR RENDERIZED par jose2pepe
Source avec Zip REUTILISER N'IMPORTE QUEL PROGRAMME EX:WORDPAD par ToutEnMasm
Source avec Zip AFFICHAGE DATE ET HEURE AVEC DES BITMAPS par jejamar
Source avec Zip HORLOGES DIVERSES par jejamar

 Sources en rapport avec celle ci

PROGRAMME DE TRI (CROISSANT) D'UN TABLEAU EN ASSEMBLEUR DU D... par monticarlo

Commentaires et avis

Commentaire de patatalo le 30/11/2010 20:49:08 administrateur CS

salut,


Tu devrais pouvoir agrandir l'index sans changer l'emplacement en mémoire en reservant une partie plus grosse mais en commitant morceau par morceau.

Le heap étant pour moi une interface entre la memoire virtuelle et une allocation memoire malloc, les éléments de petite taille pourraient avoir une gestion d'allocation différente de ceux de grosse taille. Chaque petit objet < 16 octets seraient stockés dans une liste chainée.

--HEAD
| DATA1
->NODE1--
  DATA2 |
  NODEN<-
  DATAN

Je ne suis pas sur que cela puisse empêcher d'oublier de liberer un bloc mémoire devenu inutile dans le programme (leak). Windows libère la mémoire d'un process quoi qu'il en soit à la fermeture de ce process. Rien de gagné pour le système en lui-même.

@++

Commentaire de ToutEnMasm le 01/12/2010 09:40:57

Le changement d'adresse des tampons mémoires est un choix fait par le système pour optimiser la gestion de la quantité de mémoire disponible.En particulier éviter les trous inutilisables.
Même si c'était possible,je ne vois pas l'intérêt de le faire vu que ça diminue la quantité de mémoire disponible.

Commentaire de patatalo le 05/12/2010 01:07:18 administrateur CS

pas vraiment compris ce que tu racontes. Tu ne confondrait pas memoire virtuelle et memoire physique ?

Commentaire de patatalo le 05/12/2010 01:30:13 administrateur CS

A noter également que c'est inutilisable en environnement multithread.

C'est évidement faisable et assez simplement ce que je dis. Les petits blocs entre les gros blocs sont utilisés pour l'allocation des petits objets justement.

Commentaire de patatalo le 05/12/2010 01:53:32 administrateur CS

ici, tu trouveras la fonction VirtualAlloc:
http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx

Si la mémoire avait dû être gérée par index comme les HINSTANCE et autres handles, je ne pense pas qu'ils aient eut besoin de l'ingeniosité de Toutenmasm ;-)

Commentaire de ToutEnMasm le 06/12/2010 08:11:55

Ce que tu ne comprend pas c'est la manière dont le système gère la mémoire.Les blocs doivent rester contigus car on ne peut pas adresser une mémoire composée de petits morceaux.
La gestion de la mémoire est faite par le système et non par mon ingéniosité.Autrement dit,tu es en train de donner des leçons a microsoft,amusant non !?
Pour t'en convaincre,regarde la documentation de la fonction HeapReAlloc (MSDN),il est bien préciser que le pointeur de heap peut changer.
citation msdn
HeapReAlloc is guaranteed to preserve the content of the memory being reallocated, even if the new memory is allocated at a different location.


Commentaire de patatalo le 06/12/2010 23:02:17 administrateur CS

Evidement que c'est le système qui s'occupe de gerer les choses derrières les fonctions que tu utilises (heureusement non ?). Cela ne t'empêches certainement pas de faire ta propre sauce. D'ailleurs, les gestionnaires de heap n'ont pas tous les mêmes benchmark et les mêmes capacitées.

Je pense plutôt que tu travaille sur des sujets que tu ne maîtrises pas tout en voulant nous faire croire que oui. L'utilité de cette source pour toutes les raisons que tu avances est loin d'être prouvé.

Commentaire de ToutEnMasm le 07/12/2010 10:48:30

Si patatalo veut faire "sa sauce" à la place de microsoft,rien ne l'empêche de faire un source.
Ce serait une bonne réponse.

Commentaire de patatalo le 09/12/2010 02:38:26 administrateur CS

Je me demandais comment ton truc pourrait fonctionner et peut-être est-ce là l'idée que tu avais:

pour empêcher les fuites de memoire, il faudrait que le programme soit découpé en morceau bien distinct. Chaque morceau disposerait de son propre tableau. Quand le programme saute d'une étape à l'autre, on sait que l'on peut liberer le tableau dans son ensemble.

Ca me paraît quand même assez chaud à mettre en place pour un logiciel digne de ce nom. De plus, ce que l'on gagnerait en sécurité, on le perdrait en besoin de traitement.

Pour finir, je dirais que le code qui gère le tableau ne devrais pas retourner des indexes à l'appelant mais le pointeur quand même afin d'eviter des appels trop fréquents au tableau. Le tableau ne servirait ainsi que de garde fou. ( C'est peut-être déjà comme cela que tu l'as prévu, je n'ai pas regardé le code car les .inc ne sont pas téléchargeables directement.) A ce propos, tu peux tout à fait faire un include "file.asm", ce n'est pas gênant pour l'assembleur.

@++

Commentaire de patatalo le 09/12/2010 03:56:57 administrateur CS

Il y a une autre solution qui est utilisée dans le kernel Windows mais pas pour cette raison je crois. Il faudrait associer des tags aux allocations, ce qui permettrait de savoir à quel usage correspond telle ou telle allocation.

Commentaire de patatalo le 09/12/2010 17:14:14 administrateur CS

"Si patatalo veut faire "sa sauce" à la place de microsoft,rien ne l'empêche de faire un source.
Ce serait une bonne réponse."

Tu trouveras dans la source "livecd" un fichier qui s'appelle mmap.asm: c'est un début d'idée, le porter sur Windows serait très simple.

Commentaire de ToutEnMasm le 10/12/2010 17:31:46

Si on suit tes dires , tu es capable de créer le même type de fonction que  HeapReAlloc ,remplissant le même rôle, et ceci sans que la fonction décale les adresses.
J'attends cette fonction,et non pas une autre,ou du baratin.
Ta prétention est,je fais mieux que microsoft.Prouve le.

Commentaire de patatalo le 12/12/2010 12:11:46 administrateur CS

Si tu avais regardé le code, tu aurais vu qu'une fonction réalloc verifie avant de changer d'adresse, si il n'est pas possible de le faire sans.

Je n'ai pas la prétention de faire mieux que microsoft mais toi tu as celle de faciliter la gestion de la memoire. Je ne fais que transmettre des choses que j'ai réfléchies à l'avance...

Commentaire de patatalo le 12/12/2010 12:17:38 administrateur CS

Et puis au lieu de me parler de "Microsoft", parle moi plutôt de Russinovich et des programmeurs qui existent réellement.

Commentaire de ToutEnMasm le 12/12/2010 14:28:23

"Si tu avais regardé le code, tu aurais vu qu'une fonction réalloc verifie avant de changer d'adresse, si il n'est pas possible de le faire sans."
Voila,j'ai gagné 10 mn à regardé ton code et j'obtiens en plus un aveu,le changement d'adresse est nécessaire dans certains cas.
HeapReAlloc ne fait rien d'autre et surement mieux que toi (sans vouloir te vexer).


Commentaire de patatalo le 15/12/2010 12:36:19 administrateur CS

Si tu avais regardé le source, tu aurais vu que le code n'est plus mis à jour. Ma version est ok. Pour finir, ce n'est pas une question de mieux ou de moins bien, mais de choix...

Si tu nous exposais les tiens, il y aurait peut-être matière à cogiter...

Commentaire de ToutEnMasm le 15/12/2010 18:37:44

Je n'ai pas trop le temps de "cogiter" là desus et HeapReAlloc me va bien.Merci quand même.
Ce qui peut être fait,si la chose t'interesse,ce sont des tests de rapidité sur le même type de fonctions que HeapReAlloc.Avec la heap ,avec globalrealloc..
Globalrealloc est donné plus rapide sur de gros blocs de mémoire et Heaprealloc plus rapide sur de petits blocs de mémoires,reste a savoir dans quels conditions et à vérifier l'assertion.

Commentaire de patatalo le 21/12/2010 00:22:59 administrateur CS

mmap.realloc:;(MMAP*,*,CB):CF&EAX=SIZE,!CF
LBEG
mov ebx,__parm(1)
mov eax,__parm(2)
xor edx,edx
mov esi,[ebx+MMAP.pdir]
mov ecx,[ebx+MMAP.cdir]
call mmap.getnode
jb .5
mov edx,[esi+ecx*8+4]
lea edi,[esi+ecx*8+4]
.1; tant que ccb < cbreq
cmp edx,__parm(3)
mov eax,__parm(2)
jb .3
je .4
.2;recherche du bloc suivant
mov esi,[ebx+MMAP.pdir]
add eax,edx
mov ecx,[ebx+MMAP.cdir]
call mmap.getnode
jb .5
.21;allocation du bloc suivant
btr pd[esi+ecx*8+4],BLOCLOCK
jnb .5
.22;liberation du bloc suivant
add edx,[esi+ecx*8+4]
mov pd[esi+ecx*8],0
mov pd[esi+ecx*8+4],2
jmp .1
.3;coupe le bloc.
mov eax,__parm(3)
sub edx,__parm(3)
add eax,__parm(2)
call mmap.allocnode
mov eax,edx
mov edx,__parm(3)
jnb .4
add edx,eax
.4;met a jour la node.
mov [edi],edx
mov __eax,edx
clc
LEND
ret
.5
mov __eax,edx
stc
LEND
ret

Cette fonction réalloc ne change jamais le pointeur, elle préfère ressortir en echec. A l'utilisateur de réallouer une autre zone et de copier la précedente. J'aurais pu automatiser mais je n'ai jamais utilisé ni même testé cette fonction. Par contre, on y pense pas forcement mais un réalloc d'une zone plus petite libèrera la partie en trop.

Vu que ça semblait te tenir à coeur de la voir, la voilà...

Commentaire de patatalo le 21/12/2010 01:11:19 administrateur CS

Il faudrait être un idiot pour croire que réalloc puisse toujours avoir le même pointeur. Cependant, il y aurait des solutions intermediaires: allouer une zone virtuelle plus grosse et allouer physiquement par petit morceaux à la demande. C'est ce que je t'ai expliqué plus haut mais tu as crié à l'impossibilité, or, ce que tu ne sais pas faire n'est pas forcement impossible.

Deuxièmement, le changement de pointeur est embêtant dans quels cas: Quand le pointeur est partagé par plusieurs fonctions ou threads. Il serait possible de faire les fonctions AllocForRealloc et Realloc2 qui contiendraient la gestion de la memoire virtuelle en plus.

Donc oui, je serais capable de la programmer et non, je ne l'ai pas encore fait. Cela ne veut pas dire que c'est impossible mais juste que je n'en ai pas eut encore besoin.

@++

Commentaire de patatalo le 21/12/2010 17:32:43 administrateur CS

Pour les allocations locales, il faut des petits blocs car sinon la fonction est obligée de passer par une allocation globale.

L'allocation globale est plus lente car elle doit faire appel au système plutôt que de rester dans son processus.

Je s

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

encore du tron et du graphisme [ par krater ] me revoila pour une question de TRON( et oui j'ai un ambitieux projet)je sais que pour afficher point par point un dessin, je peut mettre dans un tabl mode 13h [ par krater ] RebonjourEnfait je voudrait remplacer une parti de l'ecran par un dessin fixée a l'avanceMon ecran etant un tableau[0;320*200] si je ne me trompe pas taille d'un tableau [ par krater ] Bonjour,je voudrait utiliser un tableau de ce style :exemple db 0,8,0,0,0,8,0,8,0,0,0,0,0,8,8,8,8,12,8,8,8,8,0,0,0,0,0,8,0,8,0,0,0,8,0seulement av Parcours tableau de HWND [ par AlexMAN ] Bonjour, Voila mon pb : Je declare un tableau de HWND comme suit :hwndCmd HWND 10 dup (?)Ensuite, je veux créer 10 boutons et stocker leur handle ds c Différence entre stack et heap [ par Stormy ] salut à tous,Quelqu'un aurait-il la gentillesse de m'expliquer la différence entre la pile (stack) et le tas (heap). Je sais que le tas alloue une mém saisie d'un tableau d'entiers [ par rhumsek ] je veux concevoir un prog contenant une boucle pour saisir dix entiers signés sur 32 bits, en les stockant ds un tableau puis en les affichant!!!!!HEL tableaux [ par mat74 ] salut tt le monde ,j'ai chercher sur google des informations a propos des tableaux en assembleur mais je n'est pas trouver mon bonheur .voila je veux Parcour et trie d'un tableau [ par SalAdiN23 ] salut &#224; tt.bon voila c pr tri&#233; un tableau d'entiees en ordre croissent.et avr&#233; dire je cpas tropcomment parcourir un tableau en assembl Problème avec un code [ par showbiz_hurricanes ] Bonjour Pour un projet universitaire, je dois concevoir un programme de tri en assembleur mais celui ci ne fonctionne pas comme je le voudrai. Le les tableaux dans masm32 [ par cricri_b34 ] salut, j'ai une procedure en delphi que jveux traduire en assembleur, mais la, ma procedure utilise un tableau pour enregistrer des informations.donc


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 1,342 sec (3)

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