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

Problème UNION

5 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

5 réponses

Avatar
Antoine Leca
En cdla8d$kn3$, JM_Free va escriure:
- une variable > à 64 K dans une union =>
COMPILATION ERREUR !


Normal (si l'on peut dire).
Le compilo (et le programme) ne sait manipuler que des quantités inférieures
à 64K. L'astuce qui te permet d'avoir un tableau (pas n'importe quelle
variable, seulement un tableau) de plus de 64 K utilise l'arithmétique des
pointeurs, et les pointeurs huge sont « truqués » pour se balader dans un
espace mémoire de plus de 64 K. Mais le reste ne l'est pas.

Et quand tu déclare ton union de 100K, cela ne passe plus: le système est
incapable de gérer un objet aussi gros.

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


Quel est réellement ton problème ?
En gros, pourquoi as-tu besoin d'une union ?
Est-ce que la contrainte qui t'a fait passé au modèle huge est bien
compatible avec ce que j'ai écrit ci-dessus (seuls des tableaux peuvent
dépasser 64K). Si la réponse est non, j'ai bien peur qu'il ne te faille
revoir en profondeur les algorithmes...


Antoine

Avatar
Horst Kraemer
"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
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


Tu parles probablement de 100000 et non de 10000. Si je me rapelle
bien le modele HUGE parmet que la taille d'un tableau dépasse 64k,
mais il ne permet pas que la taille d'une struct|union dépasse 64k.

Emmanuel ?

-- Horst

Avatar
Emmanuel Delahaye
Il se trouve que Horst Kraemer a formulé :

Tu parles probablement de 100000 et non de 10000. Si je me rapelle
bien le modele HUGE parmet que la taille d'un tableau dépasse 64k,
mais il ne permet pas que la taille d'une struct|union dépasse 64k.

Emmanuel ?


Le mode Huge est buggé sur mon vieux compilateur (BC 3.1). Je n'utilise
que Small et Large. Un objet (static/dynamique) ne peut dépasser 64k.
((size_t)-1 vaut 0xFFFF)

Par contre, on peut faire des structures non linéaires plus grandes,
mais la taille du free store est d'environ 550 k au démarrage. (Peut
être un peu plus si on active le himem... Dos, c'est loin...)

--


Emmanuel

Avatar
Antoine Leca
En , Emmanuel Delahaye va escriure:
Le mode Huge est buggé sur mon vieux compilateur (BC 3.1).


Mais comme le questeur travaille avec VC++ 1.5...

Un objet (static/dynamique) ne peut dépasser 64k.


Idem chez MS.

Par contre, on peut faire des structures non linéaires plus grandes,
mais la taille du free store est d'environ 550 k au démarrage. (Peut
être un peu plus si on active le himem... Dos, c'est loin...)


En fait, la taille du free store peut monter bien plus haut, que ce soit
avec le compilo de MS ou celui de Borland: cela dépend de la bibliothèque
d'exécution. Je crois que le vrai maximum est aux alentours de 510 Mo (en
utilisant DOSX.EXE, i.e. Windows 3.x en mode standard -- cela correspond
aussi à 8190 segments de 64 K, une limite de l'architecture); mais je n'ai
jamais testé cela dans la réalité. Avec d'autres environnements, on peut
atteindre sans grandes difficultés 256 Mo (au-delà, il y a des pépins, parce
qu'on dépasse 64K pages de 4K).


Antoine

Avatar
JM_Free
OK merci pour les infos,

donc finalement Huge simplement pour les tableaux, pour le reste ça marche
pas !!!

- La nouvelle dimension de cette union correspond à une extension mémoire de
base de données (tableaux à plusieurs dimensions,...)
- Concernant l'Union je vais revoir si son utilisation est toujours
justifiée dans le code .
peut être une piste pour régler mon problème.

PS: oui dans l'exemple donné la taille est 100 K et non 10 K.