C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problème union

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
JM_Free
Guest





PostPosted: Wed Jul 21, 2004 8:53 am    Post subject: Problème union Reply with quote



Bonjour,

Suite à une extension logiciel, j'ai du passé en modèle mémoire HUGE,
parceque une variable dépassée 64 K
j'ai maintenant un problème de compilation que j'arrive pas à résoudre


- une variable > à 64 K déclaré en dehors de l'union: => COMPILATION OK

exemple :
char a[10000]; // OK

- une variable > à 64 K dans une union => COMPILATION
ERREUR !

exemple :
union Type1
{
char a[10000];
int b[10000];
};

union Type1 Test1;


Si quelqu'un pouvait m'éclairer sur ce problème (option de compilation,
pragma, ...)
compilateur utilisé: Visual C++ 1.5

Merci d'avance
Marc


Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Jul 21, 2004 2:07 pm    Post subject: Re: Problème union Reply with quote



On Wed, 21 Jul 2004 10:53:31 +0200, "JM_Free" <jmdfree (AT) free (DOT) fr>:

Quote:
Suite à une extension logiciel, j'ai du passé en modèle mémoire HUGE,
parceque une variable dépassée 64 K

Tu travailles pour de l'embarqué, plate-forme 16 bits ?


Back to top
JM_Free
Guest





PostPosted: Wed Jul 21, 2004 3:00 pm    Post subject: Re: Problème union Reply with quote



c'est un logiciel sous Windows (16 bits)


Back to top
Loïc Joly
Guest





PostPosted: Wed Jul 21, 2004 6:41 pm    Post subject: Re: Problème union Reply with quote

JM_Free wrote:

Quote:
Bonjour,

Suite à une extension logiciel, j'ai du passé en modèle mémoire HUGE,
parceque une variable dépassée 64 K

[...]

Quote:
compilateur utilisé: Visual C++ 1.5


Je vous parle d'un temps que les moins de 20 ans ne peuvent pas
connaître... ;)

A part ça, je ne peux pas trop t'aider, sauf à te conseiller de changer
de compilateur. :(

--
Loïc



Back to top
heinquoi
Guest





PostPosted: Thu Jul 22, 2004 11:35 pm    Post subject: Re: Problème union Reply with quote

"JM_Free" <jmdfree (AT) free (DOT) fr> a écrit dans le message de
news:cdlabi$l26$1 (AT) news (DOT) mch.sbs.de...
Quote:
Bonjour,

Suite à une extension logiciel, j'ai du passé en modèle mémoire HUGE,
parceque une variable dépassée 64 K
TINY = code+données <64Ko

SMALL = 64Ko de code + 64 ko de données
Medium = 1mo de code + 64 ko de données
Compact = 64 ko de code + 1 Mo de données
Large = 1Mo de code + 1 Mo de données
Huge = permet des données sttique sup a 64ko + sup a 1 Mo de données + sup à
1Mo de code

pourquoi ne pas utiliser les donnees dynamiques ( new ou malloc suivant ce
qu'accept VC1.5 ), tu pourait continuer à utiliser les modèles Compact et
plus

Quote:
j'ai maintenant un problème de compilation que j'arrive pas à résoudre


- une variable > à 64 K déclaré en dehors de l'union: => COMPILATION OK

le principe de l'union, c'est , si je me souvient bien un objet de lz tzille
de l'objet max contenu par l'union et le programmeur à la possibilité de
choisir une donnée parmis les types declaré dans dans l'union.

Quote:
exemple :
char a[10000]; // OK

size_of (char) *10000=10000 bytes et donc < 64ko

Quote:
- une variable > à 64 K dans une union =
COMPILATION
ERREUR !

exemple :
union Type1
{
char a[10000];
int b[10000];
};
taille max est int donc

size_of (int)*10000=(2ou 4 suivant ton compilo)*10000=20000 ou 40000 bytes,
deja bcp plus.mais tjrs < 64ko
et ceux pour chaque objet Type1 créé.

Quote:
union Type1 Test1;
ici j'ecrirais plus simplement

Type1 Test1
mais c'est peut etre pas pareil sur ton 'antiquité'

Quote:

Si quelqu'un pouvait m'éclairer sur ce problème (option de compilation,
pragma, ...)
compilateur utilisé: Visual C++ 1.5

sur le compilateur borland tu dois en plus du choix de memoire rajouter une
option pour que les données sup à 64 ko soit automatiquement gere avec des
adresses far.

Quote:
Merci d'avance
peu pas t'aider...désolé


--
Cordialement,
Heinquoi



Back to top
heinquoi
Guest





PostPosted: Thu Jul 22, 2004 11:37 pm    Post subject: Re: Problème union Reply with quote

si tu nous met l'erreur renvoyé , ce serais plus facile pour t'aider.

--
Cordialement,
Heinquoi


Back to top
Alain Naigeon
Guest





PostPosted: Fri Jul 23, 2004 1:00 am    Post subject: Re: Problème union Reply with quote

"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit dans le message news:
41004e5f$0$10468$626a14ce (AT) news (DOT) free.fr...
Quote:
"JM_Free" <jmdfree (AT) free (DOT) fr> a écrit dans le message de
news:cdlabi$l26$1 (AT) news (DOT) mch.sbs.de...

compilateur utilisé: Visual C++ 1.5

sur le compilateur borland tu dois [...]

Euh, le niveau baisse, on dirait :-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France



Back to top
heinquoi
Guest





PostPosted: Fri Jul 23, 2004 8:12 am    Post subject: Re: Problème union Reply with quote

"Alain Naigeon" <anaigeon (AT) free (DOT) fr> a écrit dans le message de
news:4100645e$0$15275$636a15ce (AT) news (DOT) free.fr...
Quote:
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit dans le message news:
41004e5f$0$10468$626a14ce (AT) news (DOT) free.fr...
"JM_Free" <jmdfree (AT) free (DOT) fr> a écrit dans le message de
news:cdlabi$l26$1 (AT) news (DOT) mch.sbs.de...

compilateur utilisé: Visual C++ 1.5

sur le compilateur borland tu dois [...]

Euh, le niveau baisse, on dirait Smile

et oui ! c'est d'autand plus inquietant que le mien n'a jamais ete haut.Cela
dit c'etait pas la pire des remarques, dire que sur un compilo concurent il
faut mettre une option voulais suggerer que peut etre sur le compilo VC 1.5,
il y en avait besoins aussi.
Je travail avec le compilo de VC++6 SP6, et je le trouve veillo ( pb avec
template + multiple bug) , ce qui fait que j'imagine mal quelqu'un travaillé
sur VC++1.5, et je n'en voit pas l'interet notament avec DevC++ ou mingw
developper studio qui utilise mingw, l'un des meilleurs compilo. A moins
qu'il souhaite faire du 16 bits, mais la encore il y pas mal de compilo
libre ou gratuit.
cela dit c'est pas interdit d'etre maso et nostalgique.
--
Cordialement,
Heinquoi



Back to top
heinquoi
Guest





PostPosted: Fri Jul 23, 2004 12:07 pm    Post subject: Re: Problème union Reply with quote

dommage, il ne repond pas Mr JM_Free.
J'avais bien envie de revoir du 16 bits et sa gestion 'complexe' de memoire.

--
Cordialement,
Heinquoi


Back to top
JM_Free
Guest





PostPosted: Fri Jul 30, 2004 7:34 am    Post subject: Re: Problème union Reply with quote

Désolé, mais je me suis pas connecté depuis.

En résumé avec certains compilateur 16 bits (dos et window) , on peut
rencontrer des problèmes dans certains cas dés lors que l'on adresse
des blocs de mémoire > à 64 K (tableau , pointeur, ...)

Solution :migrer soit vers un nouveau compilateur, soit organiser sa mémoire
de telle manière < à 64K.

Merci de vos infos.
Cordialement


Back to top
Victor STINNER
Guest





PostPosted: Mon Aug 02, 2004 10:32 pm    Post subject: Re: Problème union Reply with quote

"JM_Free" <jmdfree (AT) free (DOT) fr> wrote

Quote:
Suite à une extension logiciel, j'ai du passé en modèle mémoire HUGE,
parceque une variable dépassée 64 K

Hu hu hu, ça me rappelle Turbo Pascal 7 (sorti en 1990 je crois) sous
MSDOS ça :-)

Connais-tu GCC ? Un des meilleurs compilateurs actuel,
http://gcc.gnu.org/

Quote:
exemple :
union Type1
{
char a[10000];
int b[10000];
};
union Type1 Test1;

Je te conseille d'allouer dynamiquement la mémoire, puis de jouer avec
les pointeur pour accéder à tes données dans différents formats :

#include <cstdlib> // pour avoir size_t, je sais pas où il est
précisément
typedef unsigned char uchar;
class hack // on est sur fr.comp.lang.c++ nan ?
{
private:
uchar * m_ptr;
size_t m_taille;
public:
hack (size_t taille_octet) {
// vérifie que ce ne soit pas une allocation idiote
assert (0 < taille_octet);

// vérifie qu'on prend une taille divisible par la taille d'un int
// pour pouvoir accéder à la classe en char ou int
assert ((taille_octet % sizeof(int)) == 0);
m_taille = taille_octet;
m_ptr = new char[taille_octet];
}
~hack() { delete m_ptr; }
uchar& operator[] (size_t pos) { assert (pos < m_taille); return
m_ptr[pos]; }
int& acces_int (size_t pos) {
assert (pos < (m_taille/4));
int *int_ptr = static_cast return int_ptr[pos];
}
...
};

En résumé :
- Allocation de mémoire avec new
- Libération de mémoire avec delete
- Changement de type avec static_cast<type> (valeur)

Fait bien attention à la taille des données : si tu alloues juste 1
octet, et que tu tentes d'y accéder en int* alors que tu bosses en 16
bits (2 octets par int), tu risques d'avoir des surprises !

@+ Haypo

Back to top
drkm
Guest





PostPosted: Tue Aug 03, 2004 12:33 am    Post subject: Re: Problème union Reply with quote

[email]spam (AT) haypocalc (DOT) com[/email] (Victor STINNER) writes:

Quote:
class hack // on est sur fr.comp.lang.c++ nan ?
{
private:
uchar * m_ptr;
size_t m_taille;
public:
hack (size_t taille_octet) {
// vérifie que ce ne soit pas une allocation idiote
assert (0 < taille_octet);

// vérifie qu'on prend une taille divisible par la taille d'un int
// pour pouvoir accéder à la classe en char ou int
assert ((taille_octet % sizeof(int)) == 0);
m_taille = taille_octet;
m_ptr = new char[taille_octet];
}
~hack() { delete m_ptr; }
uchar& operator[] (size_t pos) { assert (pos < m_taille); return
m_ptr[pos]; }
int& acces_int (size_t pos) {
assert (pos < (m_taille/4));
^^^


?

Quote:
int *int_ptr = static_cast return int_ptr[pos];
}
...
};

En résumé :
- Allocation de mémoire avec new
- Libération de mémoire avec delete
- Changement de type avec static_cast<type> (valeur)

Fait bien attention à la taille des données : si tu alloues juste 1
octet, et que tu tentes d'y accéder en int* alors que tu bosses en 16
bits (2 octets par int), tu risques d'avoir des surprises !

Ce à quoi sert le « assert( 0 == taille % sizeof( int ) ) ».

Pour le reste, je n'ai pas vraiment suivit la discussion. Mais
AMHA, s'il peut se passer d'allocation dynamique, il n'y a pas de
raison de l'utiliser. Cela a tout l'air d'un bug de son compilo. Je
suis pas expert en VC++, mais VC++ 1.5, ça me semble antédiluven,
non ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Back to top
Victor STINNER
Guest





PostPosted: Tue Aug 03, 2004 9:03 am    Post subject: Re: Problème union Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> wrote

Quote:
int& acces_int (size_t pos) {
assert (pos < (m_taille/4));
^^^
?

Oups, il fallait lire "sizeof(int)" bien sûr Smile Je suis trop habitué
à travailler sur des compilos 32 bits ...

Quote:
Fait bien attention à la taille des données : si tu alloues juste 1
octet, et que tu tentes d'y accéder en int* alors que tu bosses en 16
bits (2 octets par int), tu risques d'avoir des surprises !

Ce à quoi sert le « assert( 0 == taille % sizeof( int ) ) ».

Et bien à être sur que la taille du tampon est un multiple de la
taille d'un int. Exemple : on alloue 3 octets sans faire de test. Si
tu accèdes au 2e int, on va lire 1 octet en dehors de la mémorie
allouée ... Bon ok, l'autre assertion va rejetter l'accès, mais autant
faire les choses proprement dès le début.

@+ Haypo

Back to top
drkm
Guest





PostPosted: Tue Aug 03, 2004 11:47 am    Post subject: Re: Problème union Reply with quote

[email]spam (AT) haypocalc (DOT) com[/email] (Victor STINNER) writes:

Quote:
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> wrote in message
news:<wksmb56owk.fsf (AT) fgeorges (DOT) org>...

Fait bien attention à la taille des données : si tu alloues juste 1
octet, et que tu tentes d'y accéder en int* alors que tu bosses en 16
bits (2 octets par int), tu risques d'avoir des surprises !

Ce à quoi sert le « assert( 0 == taille % sizeof( int ) ) ».

Et bien à être sur que la taille du tampon est un multiple de la
taille d'un int.

C'est exactement ce que j'ai dit.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.