OVH Cloud OVH Cloud

Tableau dynamique

75 réponses
Avatar
Pierre CHAUVEAU
Bonjour à toutes et à tous,

Personnellement, je réalise mes programmes avec DELPHI (langage Pascal de
BORLAND) où sont définis des "tableaux dynamiques". Ce sont des tableaux
dont on peut fixer la taille (le nombre d'éléments) à l'exécution.

J'utilise ce type de tableaux pour échanger des infos entre un programme et
des DLL.

Existe-t-il l'équivalent, pour ne pas dire la même chose, dans d'autres
langages, notamment le C++ de chez Microsoft.

Sinon, comment faites-vous pour échanger entre .exe et .dll quand vous ne
connaissez pas à la compilation la taille des infos à échanger ;le nombre de
pixels de l'image en cours de traitement par exemple.

Merci de votre aide.

Pierre.

10 réponses

4 5 6 7 8
Avatar
Alexandre
> Oui, cependant le débutant se doit de se faire un tableau dynamique avec
du
malloc, il se doit de faire des applications typiques comme celle ci, il
se
doit d'expérimenter les concept de base de la programmation. Parce que le
débutant a du temps par définition ! temps qu'il doit utiliser pour
comprendre les mécanismes de bases de l'informatique, ainsi aura-t-il une
chance de devenir un programmeur...



pourquoi alors ne pas directement appeler les méthodes du système
d'exploitation pour demander une page mémoire ? C'est vrai, quoi, malloc
c'est pas assez conceptuel.

On rappelle le point de départ : un posteur cherchait à faire un tableau
dynamique pour passer des pixels de nombre inconnu au départ d'une fonction
à l'autre. Proposer de re-coder à base de malloc une liste chainée ou un
tableau dynamique à la place d'utiliser un std::vector ne l'aide pas tant
que ça.
Avatar
Alexandre
"Pierre CHAUVEAU" a écrit dans le message de
news: 4197cc33$0$25342$
Oui, effectivement. Mon réflexe basique étant "Windows" puisque je crois
que
le langage principal de programmation y est le C++. Mais tu as entièrement
raison, je vais aller sur ce forum.

Merci.

Pierre.



de rien. Et sur ce forum on ne t'ennuira pas avec malloc ;-)
oups je vais re-lancer un fil stérile, désolé.
A++ :-)
Avatar
Loïc Joly
Vincent Burel wrote:

"Alexandre" wrote in message
news:4197b504$0$30305$

bonjour,


C'est une confusion classique chez les "pseudo-programmeur" C++, je le
répète donc, le NEW en C++ sert à hinstancier, créer et déclencher





l'appel

du constructeur d'un object de type C++. le Malloc est une fonction qui
permet d'allouer de la mémoire. Donc, il n'y a pas grand rapport avec





ces

deux fonctions, ou plutot fonctionnalités, car "malloc" est une fonction
d'un librairie, "new" est un mot réservé du langage...



merci pour le pseudo-programmeur, un jour je te dirais où je travailles.




si vous voulez, mais sachez que cela ne m'intéresse pas beaucoup. l'emploi
du terme "pseudo-programmeur" était surtout un moyen pour moi d'évaluer
votre taux d'humour...


new sert effectivement à instancier (pas de h ici, ne pas confondre avec



une

hInstance) un objet, mais également à allouer de la mémoire. Donc comme
malloc, mais en mieux (par ex déclenchement d'une exception en cas de pb).




Alors non ! il faut que je le répète encore et encore, (les "pseudo
programmeurs" sont sourds , c'est connu) ... new ne sert pas à allouer de la
mémoire, la mémoire c'est un composant système gérer par le système, pour
allouer de la mémoire il faut donc utiliser les services systèmes, sous
windows, ca peut se faire avec les API HeapAlloc, GlobalAlloc etc.. ou bien
à l'aide de la fonction généric d'un librairie "C/C++" ; MALLOC qui elle,
est définit comme une fonction d'allocation mémoire et qui d'ailleurs fait
appel au système pour faire son allocation... New sert à créer un objet ++,
si cela engendre une allocation mémoire , c'est fortuit et généralement non
désiré, l'utilisateur C++ ne comprend généralement pas qu'un ordinateur ne
puisse plus créer d'objet par manque de mémoire. ca lui parait sur-réaliste
! ce qui est vrai, car encore une fois, le new n'est pas là pour allouer de
la mémoire. :-)



J'essaie de comprendre ton vocabulaire et la distinction que tu essaie
de faire. Quand tu as le code suivant :

class C{/*...*/};

char *p = new char[sizeof(C)]; // 1
C* pC = new(p) C; // 2

Pour toi, le new de la ligne 1 n'a pas pour seul but d'allouer de la
mémoire, la création de l'objet étant réalisée par le new de la ligne 2 ?



Et pour toi, remplacer la ligne 1 par

char *p = (char*) malloc(sizeof(C));

Changerait son sens, puis dans un cas on a une new expression qui
appelle la fonction new de la bibliothèque, alors que dans le second, on
appelle une fonction d'allocation ?


--
Loïc
Avatar
Vincent Burel
"Loïc Joly" wrote in message
news:4199041e$0$20975$
Vincent Burel wrote:

J'essaie de comprendre ton vocabulaire et la distinction que tu essaie
de faire. Quand tu as le code suivant :

class C{/*...*/};

char *p = new char[sizeof(C)]; // 1
C* pC = new(p) C; // 2

Pour toi, le new de la ligne 1 n'a pas pour seul but d'allouer de la
mémoire, la création de l'objet étant réalisée par le new de la ligne 2 ?



oui.

Et pour toi, remplacer la ligne 1 par



non pas pour moi, pour tout le monde ! :-)

char *p = (char*) malloc(sizeof(C));

Changerait son sens, puis dans un cas on a une new expression qui
appelle la fonction new de la bibliothèque, alors que dans le second, on
appelle une fonction d'allocation ?



ben oui. Remplacez "new" par "CreateObject" et peut-être la disctinction
vous sautera aux yeux...
Et j'ajoute, que cette distinction n'est pas de mon fait.
Avatar
Loïc Joly
Alexandre wrote:
??? Bah, à peine que je vérifie les valeurs retournées par les fonctions !
Et après ont s'étonne que les programmes plantent... Rien d'étonnant si
les 99% des programmeurs raisonnent comme toi.

Dis-moi, et si ton new() plante, puisque tu ne vérifie pas, je suis
curieux de savoir comment tu poursuis ton programme...




bien sur qu'on vérifie, mais un capture les exceptions dans un try...catch
qui est général et pas ligne à ligne.
Par exemple :

try {
A = new classe;
B = new classe;
C = new classe;
D = new classe;
}
catch(std::bad_alloc)
{
std::cerr<<"nErreur d'allocation mémoire";
throw;
}



Attention, si A, B, C, D sont de type classe* (ce n'est pas dit, mais
c'est probable) ce code contient des fuites mémoires, qui sont souvent
un problème dans l'environnement d'exécution. Pour les éviter, le plus
simple dans ce cas est d'utiliser l'idiome RAII, par exemple avec des
pointeurs intelligents.

Par exemple (remarque : plus besoin d'écrire de try/catch localement,
tout sera géré dans la couche appropriée) :

boost::scoped_ptr<classe> A (new classe);
boost::scoped_ptr<classe> B (new classe);
boost::scoped_ptr<classe> C (new classe);
boost::scoped_ptr<classe> D (new classe);

--
Loïc
Avatar
AMcD®
> A = (classe*)malloc(sizeof(classe));
La 2e version ne te parait pas plus lourde que la
première ?



Parce que tu codes comme un pied. Écris un truc du genre (exemple théorique
tapé comme ça au feeling hein, je vérifie pas) :

error = 0;

error = ( NULL == ( A = (classe*)malloc(sizeof(classe)) ) );

if ( !error ) error = (NULL == (B = (classe*)malloc(sizeof(classe))));

if ( !error ) error = (NULL == (C = (classe*)malloc(sizeof(classe))));

if ( !error ) error = (NULL == (D = (classe*)malloc(sizeof(classe))));

if ( error )
{
std::cerr<<"nErreur d'allocation mémoire";
}

C'est certes plus "lourd" que ton bout de C++.

il n'y a pas forcément de sérieur et de rigueur quand on choisit une
solution plus lourde qu'une autre



N'importe quoi. Apprends déjà à écrire du code non scolaire, on discutera
ensuite :-).

Fin du thread pour moi.

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Loïc Joly
Vincent Burel wrote:

"Loïc Joly" wrote in message
news:4199041e$0$20975$

Vincent Burel wrote:

J'essaie de comprendre ton vocabulaire et la distinction que tu essaie
de faire. Quand tu as le code suivant :

class C{/*...*/};

char *p = new char[sizeof(C)]; // 1
C* pC = new(p) C; // 2

Pour toi, le new de la ligne 1 n'a pas pour seul but d'allouer de la
mémoire, la création de l'objet étant réalisée par le new de la ligne 2 ?




oui.



Pourrais tu développer quel est de ton point de vue son rôle
supplémentaire ?


Et pour toi, remplacer la ligne 1 par




non pas pour moi, pour tout le monde ! :-)



Es-tu en mode troll ? Si oui, merci de me l'indiquer plus clairement,
pour éviter que je perde mon temps. Si non, merci de me citer un article
qui va dans le sens de ta vision.

char *p = (char*) malloc(sizeof(C));

Changerait son sens, puis dans un cas on a une new expression qui
appelle la fonction new de la bibliothèque, alors que dans le second, on
appelle une fonction d'allocation ?




ben oui. Remplacez "new" par "CreateObject" et peut-être la disctinction
vous sautera aux yeux...
Et j'ajoute, que cette distinction n'est pas de mon fait.



On tourne en rond. Si je résume :
Toi : new n'alloue pas, il ne fait que créer des objets
Moi : Voici un exemple où new ne crée pas l'objet, puisque l'objet est
créé plus tard
Toi : Si tu remplace new par CreateObjet, tu verra que tu crée un objet

C'est un peu comme si je te disais : Malloc n'alloue pas de la mémoire,
il fait des achats avec ta carte bleue. La preuve, si dans ton code, tu
remplaces malloc par FaitDesAchatsAvecLaCarteBleue, tu verras ce que
malloc fait vraiment.

--
Loïc
Avatar
Vincent Burel
"Alexandre" wrote in message
news:41990798$0$15079$
> Oui, cependant le débutant se doit de se faire un tableau dynamique avec
> du
> malloc, il se doit de faire des applications typiques comme celle ci, il
> se
> doit d'expérimenter les concept de base de la programmation. Parce que


le
> débutant a du temps par définition ! temps qu'il doit utiliser pour
> comprendre les mécanismes de bases de l'informatique, ainsi aura-t-il


une
> chance de devenir un programmeur...



pourquoi alors ne pas directement appeler les méthodes du système
d'exploitation pour demander une page mémoire ? C'est vrai, quoi, malloc
c'est pas assez conceptuel.



en quoi c'est conceptuelle le malloc !? la pagination ca c'est conceptuel,
mais le malloc non, d'ailleurs le malloc est la première fonction présente
quand on peut gérer de la mémoire dynamique, sur tout système, de l'embarqué
à base de DSP à la dernière station à la mode...

On rappelle le point de départ : un posteur cherchait à faire un tableau
dynamique pour passer des pixels de nombre inconnu au départ d'une


fonction
à l'autre. Proposer de re-coder à base de malloc une liste chainée ou un
tableau dynamique à la place d'utiliser un std::vector ne l'aide pas tant
que ça.



ha bon, pourtant c'est la base. le B-A-BA. je l'ai déjà dit ici : la base de
la programmation c'est savoir gérer les collections d'objet, les stocker,
les compter, les trier, les retrouver. Donc, je conseille au débutant de
commencer pas la base.
Avatar
Vincent Burel
"Loïc Joly" wrote in message
news:41990e3c$0$21003$
Vincent Burel wrote:
>>char *p = new char[sizeof(C)]; // 1
>>C* pC = new(p) C; // 2
>>
>>Pour toi, le new de la ligne 1 n'a pas pour seul but d'allouer de la
>>mémoire, la création de l'objet étant réalisée par le new de la ligne 2


?
>
>
> oui.

Pourrais tu développer quel est de ton point de vue son rôle
supplémentaire ?



mon point de vue !? ben, je ne t'apprend rien si je te dis que le new
déclenche l'appel des éventuels constructeurs...

Es-tu en mode troll ? Si oui, merci de me l'indiquer plus clairement,
pour éviter que je perde mon temps. Si non, merci de me citer un article
qui va dans le sens de ta vision.



De ton côté, si tu estime m'avoir fait gagner du temps, démontre le moi,
alors je te
répondrai ! :-) Je vais te donner un indice quand même : quelle intérêt
aurais-je à démontrer ou pas que le "new" n'est pas une fonction
d'allocation mémoire ? ca me rapporte quoi ? et ca m'intéresse où !?

On tourne en rond. Si je résume :



ha, enfin ! de la pertinence ! :-)

Toi : new n'alloue pas, il ne fait que créer des objets
Moi : Voici un exemple où new ne crée pas l'objet, puisque l'objet est
créé plus tard
Toi : Si tu remplace new par CreateObjet, tu verra que tu crée un objet

C'est un peu comme si je te disais : Malloc n'alloue pas de la mémoire,
il fait des achats avec ta carte bleue. La preuve, si dans ton code, tu
remplaces malloc par FaitDesAchatsAvecLaCarteBleue, tu verras ce que
malloc fait vraiment.



Tu me fais penser à cet employé qui affirmait dur comme fer, que la
commande clavier CTRL-X servait à effacer un texte dans Word, et que CTRL-V
faisait office de UNDO . Il m'a été impossible de lui expliquer vraiment à
quoi servait le CTRL-X et le CTRL-V. Et l'expérience montre que certains
individus, sont inaptes à comprendre quelque chose de différent que ce qu'il
ont déjà compris auparavant. :-)

j'aime bien cet anecdote non !? :-)
Avatar
Loïc Joly
Vincent Burel wrote:

"Loïc Joly" wrote in message
news:41990e3c$0$21003$

Vincent Burel wrote:

char *p = new char[sizeof(C)]; // 1
C* pC = new(p) C; // 2







mon point de vue !? ben, je ne t'apprend rien si je te dis que le new
déclenche l'appel des éventuels constructeurs...



Sauf qu'ici je me suis spécifiquement placé dans le cas où il n'y a pas
de constructeurs, afin de pouvoir utiliser la syntaxe qui permet de
décomposer la création d'un objet (qui souvent se fait à l'aide d'un
simple new) en deux sous-éléments : Allocation mémoire et initialisation
de l'objet. Et pour chacun des deux sous éléments, j'ai utilisé new.

Ma conclusion était que suivant les cas, new pouvait servir à construire
un objet, à initialiser un objet dans un emplacement mémoire pré-alloué,
ou à allouer un emplacement mémoire pour que d'autres, plus tard,
puissent y construire quelquechose.


Es-tu en mode troll ? Si oui, merci de me l'indiquer plus clairement,
pour éviter que je perde mon temps. Si non, merci de me citer un article
qui va dans le sens de ta vision.




De ton côté, si tu estime m'avoir fait gagner du temps, démontre le moi,
alors je te
répondrai ! :-)



J'utilisais plus "perdre" part rapport à "passer" que par rapport à
"gagner". J'accepte de passer du temps à discuter de ce genre de sujet
(même sans intérêt immédiat pour moi). J'évite d'en perdre si
l'interlocuteur s'est mis dans une logique "trollesque". Ayant hésité à
ton sujet, j'ai demandé des précisions.


Tu me fais penser à cet employé qui affirmait dur comme fer, que la
commande clavier CTRL-X servait à effacer un texte dans Word, et que CTRL-V
faisait office de UNDO . Il m'a été impossible de lui expliquer vraiment à
quoi servait le CTRL-X et le CTRL-V. Et l'expérience montre que certains
individus, sont inaptes à comprendre quelque chose de différent que ce qu'il
ont déjà compris auparavant. :-)

j'aime bien cet anecdote non !? :-)



Elle est effectivement sympatique. N'as-tu pas réussi à lui expliquer
que CTRL-V ne permettait pas d'annuler la mise en gras, et donc n'était
pas un véritable UNDO ?

--
Loïc
4 5 6 7 8