Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/11/2021, à 15:53

benOAH

[Résolu] chargement dynamique d'un très grand tableau d'entiers

Bonjour,
J'ai besoin d'allouer un tableau de 65000 entiers dynamiquement. Le malloc() dont je me sers ne
m'envoie pas d"erreur sur le

#define MAX 65000       /* y'a pas de problème avec 1024 mais avec 65000 */
int intTab [MAX];
*intTab = (int*)malloc(MAX * sizeof(int));

Mais quand je trace la taille du tableau, il ne dépasse pas la taille de 4096 apparemment (une page mémoire) ce qui fait que j'ai un problème de 'Erreur de segmentation (core dumped)" à un moment pendant le chargement.
Comment remédier à ce problème ?
Je vous remercie par avance pour toute info.
Ben smile

Dernière modification par benOAH (Le 27/11/2021, à 17:52)

Hors ligne

#2 Le 26/11/2021, à 16:06

CM63

Re : [Résolu] chargement dynamique d'un très grand tableau d'entiers

Bonjour,

Le problème c'est que tu crées un tableau statique à MAX positions, et ensuite tu essaies de modifier son pointeur en re-réservant MAX positions (chose qui est déjà faite). Donc soit tu fais :

#define MAX 65536 ;
int *intTab;
intTab = (int *)malloc(MAX * sizeof(int));   (là il n'y a pas d'étoile devant intTab, et il vaut mieux mettre un blanc entre int et *, devant le malloc)

Soit tu fais :

#define MAX 65536;
int intTab [MAX];

Dans le premier cas ton tableau est dynamique, tu peux le réallouer à une autre taille dans la suite de ton programme, à condition de faire un free auparavant, sinon il y aura des "fuites mémoires".
Dans le deuxième cas ton tableau est statique, dimensionné à MAX positions de int, tu ne pourras pas le modifier.

D'autre part, il faudrait éviter d'utiliser des mots clef du langage comme nom de variable : MAX est une fonction définie elle-même par des define, là tu l'as écrasée, tu n'aurais pas pu l'utiliser. Tu n'obtiens pas de message d'erreur car, "malheureusement" le langage le permet.

Dernière modification par CM63 (Le 26/11/2021, à 16:12)


D'sous n'a mis, est-elle avare, frivole ou tellurique?

Hors ligne

#3 Le 26/11/2021, à 22:58

kamaris

Re : [Résolu] chargement dynamique d'un très grand tableau d'entiers

Tu devrais compiler avec -Wall -Wextra, ça t'aiguillerait, car

*intTab = (int*)malloc(MAX * sizeof(int));

ça n'a pas de sens (ou pas celui que tu penses), et ça t'aurait aussi indiqué la redéfinition de macro pointée par CM63.

Hors ligne

#4 Le 27/11/2021, à 13:48

benOAH

Re : [Résolu] chargement dynamique d'un très grand tableau d'entiers

mon problème consiste effectivement à me servir d'un tableau pour faire différentes allocations selon les besoins du traitement, d'où l'allocation dynamique. J'avais effectivement pas besoin d'allouer 'en dur' la taille lors de la définition du tableau, mais besoin de le définir comme un pointeur - vous avez sans doute remarqué que je suis peu expérimenté dans Linux/C et je me mélange encore pas mal les pinceaux avec les pointeurs. Je crois que le free() que j'avais essayé ne passait pas à cause de ça - seul le premier malloc() passait bien mais il ne servait à rien !
Pour finir il faut que je te remercie aussi CM63 pour le MAX à proscrire comme constante globale car je ne savais pas que c'était déjà utilisé _ je suis assez sensible à cette organisation du code et j'avais vérifié par un

echo $MAX 

qui n'avait rien donné...
tout ça faisait beaucoup d'erreurs mais elles sont vite corrigées finalement
Pour ce qui est de la compilation gcc me suffit pour l'instant, merci quand même
Bon week-end !

Dernière modification par benOAH (Le 27/11/2021, à 13:53)

Hors ligne

#5 Le 27/11/2021, à 14:23

kamaris

Re : [Résolu] chargement dynamique d'un très grand tableau d'entiers

-Wall -Wextra sont des options de gcc, essaie de compiler avec tu verras (et tu trouveras leurs descriptions dans man gcc).
Quant à echo $MAX, ça n'a rien à voir avec le fait que MAX soit déjà définie dans le programme C : les symboles du shell et ceux du programme C sont complètement disjoints.

Dernière modification par kamaris (Le 27/11/2021, à 14:25)

Hors ligne

#6 Le 27/11/2021, à 15:32

CM63

Re : [Résolu] chargement dynamique d'un très grand tableau d'entiers

Bon courage dans tes travaux. Le langage C est ancien, et il n'y a plus ces problèmes de gestion mémoire dans les langages plus récents. Mais c'est bien de maîtriser C car cela est une bonne initiation, c'est bien pour "faire ses classes".

Quand tu considéreras que tu en connais assez du C, tu pourras passer à des langages plus récents comme Python ou Java. Mais à mon avis il est inutile de s'initier au C++, qui est trop compliqué, et qui ne faisait qu'une partie du chemin. La gestion mémoire par exemple, n'existe qu'en bibliothèque additionnelle, et pas dans le langage de base, comme ce sera la cas plus tard des langages plus récents.


D'sous n'a mis, est-elle avare, frivole ou tellurique?

Hors ligne