Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème union

13 réponses
Avatar
JM_Free
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

10 réponses

1 2
Avatar
Fabien LE LEZ
On Wed, 21 Jul 2004 10:53:31 +0200, "JM_Free" :

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 ?

Avatar
JM_Free
c'est un logiciel sous Windows (16 bits)
Avatar
Loïc Joly
JM_Free wrote:

Bonjour,

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


[...]

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

Avatar
heinquoi
"JM_Free" a écrit dans le message de
news:cdlabi$l26$
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

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.

exemple :
char a[10000]; // OK


size_of (char) *10000000 bytes et donc < 64ko

- 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 000 ou 40000 bytes,
deja bcp plus.mais tjrs < 64ko
et ceux pour chaque objet Type1 créé.

union Type1 Test1;
ici j'ecrirais plus simplement

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


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.

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


--
Cordialement,
Heinquoi

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

--
Cordialement,
Heinquoi
Avatar
Alain Naigeon
"heinquoi" <nospam* a écrit dans le message news:
41004e5f$0$10468$
"JM_Free" a écrit dans le message de
news:cdlabi$l26$

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 - - Strasbourg, France


Avatar
heinquoi
"Alain Naigeon" a écrit dans le message de
news:4100645e$0$15275$
"heinquoi" <nospam* a écrit dans le message news:
41004e5f$0$10468$
"JM_Free" a écrit dans le message de
news:cdlabi$l26$

compilateur utilisé: Visual C++ 1.5


sur le compilateur borland tu dois [...]


Euh, le niveau baisse, on dirait :-)


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



Avatar
heinquoi
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
Avatar
JM_Free
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
Avatar
spam
"JM_Free" wrote in message news:<cdlabi$l26$...
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/

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<int *> (m_ptr);
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

1 2