Stoffinator | Salut,
Mon probleme est le suivant: je dois pouvoir manipuler des tableaux de plusieurs dimensions (5 au max) contenant un grand nombre de reels longs (plusieurs dizaines de millions ).
Pour cela, et en m'inspirant allegrement de numerical species, j'ai ecrit une routine me permettant d'allouer de la memoire et d'initialiser les tableaux.
Quand je teste le code avec des tableaux simples, tout marche impec, que ce soit au moment de l'allocation memoire ou des manipulations ulterieures.
Par contre, quand je dois allouer de la memoire pour disons 7 tableaux de 35 millions de reels chacun, j'ai le message d'erreur "allocation failure..." (voir code cidessous)
Questions: Combien de place prend un reel long?
Est-ce lie a la memoire vive ou a une limitation de compilateur?
Y a t'il des solutions envisageables?
merci
Le code d'allocation est poste ci dessous:
Code :
- #include <math.h>
- #include <stdio.h>
- #include <stddef.h>
- #include <stdlib.h>
- #include <string.h>
- #define NR_END 1
- #define FREE_ARG char*
- double *****f5tensor(long n1l,long n1h,long n2l,long n2h,long n3l,long n3h,long n4l,long n4h,long n5l,long n5h)
- //allocate a double 5Dtensor with range t[n1l,n1h][n2l,n2h][n3l,n3h][n4l,n4h][n5l,n5h]
- {
- long i,j,k,l,n1=n1h-n1l+1,n2=n2h-n2l+1,n3=n3h-n3l+1,n4=n4h-n4l+1,n5=n5h-n5l+1;
- double *****t;
- //allocate pointers to pointers to pointers to pointers (!!) to rows
- t=(double *****)malloc((size_t)((n1+NR_END)*sizeof(double ****)));
- if(!t) rterror("allocation failure 1 in f5tensor()","f5tensor.txt" );
- t +=NR_END;
- t -=n1l;
- //allocate pointers to pointers to pointers to rows
- t[n1l]=(double ****)malloc((size_t)((n1*n2+NR_END)*sizeof(double ***)));
- if(!t[n1l]) rterror("allocation failure 2 in f5tensor()","f5tensor.txt" );
- t[n1l] +=NR_END;
- t[n1l] -=n2l;
- //allocate pointers to pointers to rows
- t[n1l][n2l]=(double ***) malloc((size_t)((n1*n2*n3+NR_END)*sizeof(double **)));
- if (!t[n1l][n2l]) rterror("allocation failure 3 in f5tensor()","f5tensor.txt" );
- t[n1l][n2l] += NR_END;
- t[n1l][n2l] -= n3l;
- /* allocate pointers to rows and set pointers to them */
- t[n1l][n2l][n3l]=(double **) malloc((size_t)((n1*n2*n3*n4+NR_END)*sizeof(double*)));
- if (!t[n1l][n2l][n3l]) rterror("allocation failure 4 in f5tensor()","f5tensor.txt" );
- t[n1l][n2l][n3l] += NR_END;
- t[n1l][n2l][n3l] -= n4l;
- /* allocate rows and set pointers to them */
- t[n1l][n2l][n3l][n4l]=(double *) malloc((size_t)((n1*n2*n3*n4*n5+NR_END)*sizeof(double)));
- if (!t[n1l][n2l][n3l][n4l]) rterror("allocation failure 5 in f5tensor()","f5tensor.txt" );
- t[n1l][n2l][n3l][n4l] += NR_END;
- t[n1l][n2l][n3l][n4l] -= n5l;
|
|