Gros tableau 3D typedef int Gd_Tab[longit][haut][larg];

Signaler
Messages postés
35
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
14 mars 2006
-
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Bonjour,
je voudrais manipuler un "gros" tableau d'entiers a 3 dim.
je defini un typedef :
typedef int Gd_Tab[longit][haut][larg];
avec longit = 10;
haut = 200;
larg = 200;

donc 400 000 entiers

je declare un tableau de ce type :
Gd_Tab Mat_ref;

LA compilation est bonne
mais lorsque je lance mon prog et là c'est le drame :
j'obtiens un message d'erreur :operation non conforme.
Par contre avec :
haut = 100;
larg = 100;
Ca marche
Je me dis donc que c'est un probleme de memoire ce qui m'etonne un peu car j'ai 256 meg de ram.
Y a t il une maniere de programmer l'utilisation de tableaux 3D pour ne pas avoir de probleme de memoire ?
PAr exemple avec des : int *** tab;
Et comment passer en parametre ces tableaux et les utiliser pour faire des affectations.

J'espere etre clair et merci pour les reponses :=)

18 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Avec ton tableau, tu bouffes plus de 15go de memoire, normal ke ca marche pas ! en sachant ke tu as un peu moins de 2go de memoire (virtuelle) pour stocker les données de ton application proprement dite, c sur ke ca marchera pas !

100*200*200 = 4 000 000; pas 400 000...

Donc c pas pocible !
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Purée, g un gros pb avec la lecture moi, dsl de la reponse inutile...
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

et 4 000 000 d'entiers sachant qu'un int = 8 bit=1 octect, si mes souvenirs sont bons.

A+
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

oups idem que AlexMan

10*200*200=400 000 (*8 bit quand même)
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Sur un système 32bits par exemple;

char == 1 octet
short == 2 octets
int == dépendant du système(16, 32, 64, ... bits)
long == 4 octets
float == 4 octets
double == 8 octets
long double == 10 octets
pointeur == same as int
enum == same as int
etc ...
etc ...
etc ...

Mais, 1 octets équivaut bien à 8 bits.

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
attention, pour long double les données sont codé sur 80 bits mais la longueur effective est 96 bits pour grantir l'alignement des données sur un systeme 32bits
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Une fois partie aussi bien continuer =P

http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html

~(.:: NitRic ::.)~
Messages postés
35
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
14 mars 2006

Merci pour toutes ces reponses
mais ca ne m'avance pas beaucoup :
j'ai 400 000 octects en fait j'ai deux tableaux donc 800 000 octets et ca plante.
Je voudrais savoir de quelle mémoire dispose t'on sous ms dev cpp toute la ram ?
merci
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
tu le declare ou ton tableau ?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
NitRic > merci pour le lien
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Cela ne dépend pas du IDE ou compilo ou autre, ca dépend du system

Les libs C/C++, à ma connaissances, n'ont imposé aucune limite d'allocation et je ne vois pas pourquoi il l'aurait fait de toute facon :}

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
de toutes facon si il y avait une limite ca compilerais pas (resolution / controle statique)
Messages postés
35
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
14 mars 2006

Je declare mon type de tableau dans un fichier matrice.h :
typedef int Gd_Tab[longit][haut][larg];
et dans mon prog principal
j'inclu bien sur matrice.h
et je declare un tableau de type Gd_Tab
Mais ce qui m'etonne c'est que pour un tableau plus petit ca fonctionne
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

C'était quoi, 400 000 éléments ton array ?
400 000 * 4(int 4 octets) 1 600 000 octets

1 600 000 / 1024 == 1562.5 ko
1562.5 / 1024 == 1,52587890625 mo

Ca fait gros comme tableau je crois ...

use the heap!

Ton idée du int *** array c'est pas mauvais ou bien int ** array[fixed_size] ...

~(.:: NitRic ::.)~
Messages postés
35
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
14 mars 2006

1.5 mo oui c'est un peu gros mais non plus enorme
Si j'utilise un *** array comment je fais pour le declarer le passer en parametre d'une fonction et l'initialiser ???
Par exemple pour moi les dimensions fixes sont :
10 x 200 x 200
Et d'un point de vue occupation memoire ca change quoi ?
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

-------------------------
--- C'est bon ca ? ---
-------------------------

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main() {

int * array[10][200];
size_t i, a;

for ( i = 0; i < 10; i++ ) {
for ( a = 0; a < 200; a++ )
if ( !(array[i][a] = (int *) malloc( 200 * sizeof(int) )) )
exit(-1);
}

array[0][0][0] = 5;
array[0][0][1] = 6;
array[1][5][8] = 14;

printf( "%d - %d - %d\n\n", array[0][0][0], array[0][0][1], array[1][5][8] );

for ( i = 0; i < 10; i++ ) {
for ( a = 0; a < 200; a++ ) {
if ( array[i][a] ) {
free( array[i][a] );
array[i][a] = NULL;
}
}
}

return 0;

}

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ou tous simplement

int (*v)[200][200];

v = malloc( 10 * sizeof *v );

...

free(v);
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Et bien voilà, prenez le temp de penser 2min avant de dire n'importe quoi!

merci djl

~(.:: NitRic ::.)~

PS: Ce message s'adresse à l'auteur seulement

:}