Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1789 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  tableau statique : forcer l'allocation ? [Résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tableau statique : forcer l'allocation ? [Résolu]

n°2160179
NotUsedPse​udo
Posté le 14-10-2012 à 14:57:33  profilanswer
 

Bonjour !
 
   Je suis débutant en C++ et je rencontre un problème sur un TP un peu particulier.
Il s'agit de déclarer et manipuler deux tableaux (int et char) qui seront testés sur 10 millions d'entrées.
Or, j'ai l'impression que le système refuse d'allouer plus de 1 millions d'entrées.
Existe t-il un moyen de forcer l'allocation  ?
Je précise que je n'ai le droit qu'à la std, et que l'implémentation
d'une liste dynamique (même faite par soit même)  est fortement découragée...
Merci d'avance pour vos réponses  :jap:


Message édité par NotUsedPseudo le 17-10-2012 à 20:57:06
mood
Publicité
Posté le 14-10-2012 à 14:57:33  profilanswer
 

n°2160189
gilou
Modérateur
Modzilla
Posté le 14-10-2012 à 18:06:44  profilanswer
 

Chez moi ça marche, sur une vieille bécane sous XP avec peu de mémoire

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     int *table = malloc(10000000 * sizeof(int));
  5.     if (!table) {
  6.         printf("Erreur à l'allocation\n" );
  7.     }
  8.     else {
  9.         printf("Allocation OK\n" );
  10.         free(table);
  11.     }
  12.     return 0;
  13. }


C:\Documents and Settings\c>gcc -o tab.exe tab.c
C:\Documents and Settings\c>tab
Allocation OK


A+,


Message édité par gilou le 14-10-2012 à 18:07:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2160233
Terminapor
I'll see you rise.
Posté le 15-10-2012 à 11:05:08  profilanswer
 

Tu parles de std::vector ?

  
Code :
  1. #include<iostream>
  2. #include<vector>
  3. int main()
  4. {
  5.     std::vector<int> i;
  6.     i.resize(10000000);
  7.     std::cout<<"Size : "<<i.size()<<'\n';
  8.     return 0;
  9. }
 

Chez moi, ça marche (d'ailleurs je crois qu'un tel tableau ne prend que 40MB dans la mémoire, ou alors je me plante dans mes calculs mais rien de bien monstre)


Message édité par Terminapor le 15-10-2012 à 11:05:33

---------------
Perhaps you don't deserve to breathe
n°2160316
Farian
Posté le 15-10-2012 à 21:36:59  profilanswer
 

Bonsoir !
 
40 Mo n'est pas une quantité de mémoire énorme, certes, mais uniquement si l'allocation est faite sur le tas (auquel cas il est possible d'allouer toute la mémoire du système en 64 bits et 2 ou 3 Go selon l'OS et le paramétrage en 32 bits).
 
En revanche, une allocation statique ( int tableau[10000000]; ) se fait sur la pile et, là, la taille disponible est bien moindre : Sous Linux, la taille par défaut est souvent de 10 Mo, et sous Windows, souvent de 1Mo pour des programmes compilés avec Visual (cf. http://msdn.microsoft.com/fr-fr/li [...] s58a6.aspx).
 
D'où la nécessité de faire une allocation dynamique, ou d'utiliser une classe qui masque l'allocation dynamique, comme le std::vector.


Message édité par Farian le 15-10-2012 à 21:40:57
n°2160320
NotUsedPse​udo
Posté le 15-10-2012 à 22:01:48  profilanswer
 

Bonsoir!
 
Merci à vous trois pour vos réponses !
...Malheureusement, je suis un peu obligé de faire une allocation statique, type tableau[10000000]...puisque c'est une règle du tp
(je la trouve d'ailleurs assez tadada mais elle est ainsi et je dois composer avec).
Sachant ceci, est ce que je peux utiliser la fonction malloc donnée dans l'exemple de Gilou ?
Ou y a t-il un autre moyen de passer outre cette limite de 10Mo sans passer par les vecteurs ?
 
Encore une fois, merci d'avance pour vos réponses.

n°2160324
Farian
Posté le 15-10-2012 à 23:06:15  profilanswer
 

Je ne partage pas votre avis sur la nécessité d'allouer statiquement le tableau, ce qui ne correspond pas vraiment à une bonne pratique : Imaginez que cette allocation se fasse dans une fonction récursive, chaque niveau d'appel alloue 40 Mo et il faut avoir une pile énorme pour pouvoir lancer le programme ... Pour moi, faire une allocation dynamique (ou allouer un std::vector de la taille voulue, ce qui revient en fait au même) est LA bonne façon de faire. Et devoir augmenter la taille de la pile pour ça est, selon moi, l'indication d'une mauvaise implémentation.
 
Mais ce n'est que mon avis !

n°2160327
gilou
Modérateur
Modzilla
Posté le 16-10-2012 à 00:00:03  profilanswer
 

NotUsedPseudo a écrit :

Bonsoir!
 
Merci à vous trois pour vos réponses !
...Malheureusement, je suis un peu obligé de faire une allocation statique, type tableau[10000000]...puisque c'est une règle du tp
(je la trouve d'ailleurs assez tadada mais elle est ainsi et je dois composer avec).
Sachant ceci, est ce que je peux utiliser la fonction malloc donnée dans l'exemple de Gilou ?
Ou y a t-il un autre moyen de passer outre cette limite de 10Mo sans passer par les vecteurs ?
 
Encore une fois, merci d'avance pour vos réponses.

Les vecteurs, c'est tout aussi dynamique que malloc.
Si vous voulez du vrai statique, c'est toujours possible, en mettant les bonnes options à la compilation pour que la stack ait la taille nécessaire, et ça, ça dépend totalement de votre compilateur et de l'OS. Sous Windows, avec Visual C++, c'est l'option de compilation /F nnn
Mais ça n'a pas grand intérêt, l'allocation dynamique est bien plus pratique à mettre en oeuvre.
Vous n'avez pas le droit d'écrire
int * table = new int[10000000];
pour votre tp?
Parce qu'il m'aurait semblé logique qu'on attende de vous quelque chose de ce genre:

Code :
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. int main(int argc, char *argv[]) {
  5.     int *table;
  6.     try {
  7.         table = new int[10000000];
  8.     } catch (bad_alloc xa) {
  9.         cout << "Echec allocation" << endl;
  10.         return 1;
  11.     }
  12.     cout << "Allocation OK" << endl;
  13.     delete [] table;
  14.     cout << "Desallocation" << endl;
  15.     return 0;
  16. }


ou sa variante sans exception

Code :
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. int main(int argc, char *argv[]) {
  5.     int *table = new (nothrow) int[10000000];
  6.     if (table == 0) {
  7.         cout << "Echec allocation" << endl;
  8.         return 1;
  9.     }
  10.     cout << "Allocation OK" << endl;
  11.     delete [] table;
  12.     cout << "Desallocation" << endl;
  13.     return 0;
  14. }


qui la encore marche très bien sur une bécane poussive et avec peu de mémoire:

C:\clang>g++ -o table.exe table.cpp
 
C:\clang>table
Allocation OK
Desallocation


 
A+,


Message édité par gilou le 16-10-2012 à 00:28:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2160518
NotUsedPse​udo
Posté le 17-10-2012 à 20:56:22  profilanswer
 

Bonsoir à tous !
J'ai effectivement mal compris le sujet  :D  
En faisant int * table = new int[10000000] comme suggéré,  
je n'ai plus d'erreur d'allocation.  
Encore merci pour votre aide  :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  tableau statique : forcer l'allocation ? [Résolu]

 

Sujets relatifs
Changer un element d'un tableauTableau dynamique
Lire et accédé a un tableau de valeur énuméréforcer les navigateurs a zoomer ou dézoomer
Formulaire de contact en html statique + javascriptTableau python vers array php ?
forcer le telechargementÉliminer les doublons dans un tableau word
Comment modifier le contenu de mon tableau ? :)somme des éléments d'un tableau
Plus de sujets relatifs à : tableau statique : forcer l'allocation ? [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR