🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #15333

Re:Tableau: différence entre pile et tas

#15333
From: Pierre Maurette
Date: Thu, 29 Sep 2005 10:49
151 lines
6767 bytes
(supersedes <mn.eada7d59f468a056.31483@laposte.net>)

dab@acri-st.fr, le 29/09/2005, a �crit :
> C'est peut-�tre une mauvaise habitude, mais je ne teste habituellement
> pas la valeur de retour de malloc.
C'est vous qui voyez. Je ne teste pas non plus syst�matiquement, tant 
que le programme reste chez moi. Encore que pour le malloc() je m'y 
suis mis, c'est tellement simple de tester le retour NULL.

> Par contre, dans ce cas, cela me
> parait appropri� parce que je demande une grosse quantit� de
> m�moire.
J'ai peu d'exp�rience des grosses allocations portables (je passe par 
des fonctions API). Mais il est clair que l� vous aurez deux cas de 
figure:

- Dans le cas que vous proposez, un simili tableau (m�moire 
discontinue) de dimension 2. Vous allouez en deux temps, un tableau de 
pointeurs puis une boucle pour initialiser chaque pointeur par une 
allocation de ligne. Vous testez chaque retour, c'est plus informatif, 
�a autorise �ventuellement une strat�gie de repli (traitement par blocs 
plus petits), et �a complique un peu la lib�ration, en particulier 
quand �a �choue "au milieu".

- Vous n'allouez qu'un seul gros bloc en un seul malloc(), c'est 
beaucoup plus simple, si �a �choue vous n'avez plus rien � faire, m�me 
pas lib�rer. Vous pouvez m�me �crire dans un code de finalisation:
if(pointeur != NULL)free(pointeur);


> Pour les tableaux, j'ai developp� mon code avec des typedef pour la
> taille des tableaux et sans malloc: t_grid_point*
> gridPointTable[NB_MAX_GRID_POINT]; par exemple.
> Mais maintenant que je dois passer avec des grandes valeurs pour
> NB_MAX_GRID_POINT (2621442), ben �a marche pas et je suis oblig� de
> passer par malloc pour allouer mes tables.
C'�tait clair. Vous �tes tenu d'allouer dynamiquement et non 
automatiquement (ou alors globalement ou static). Ensuite, nous ne nous 
sommes pas bien compris. Votre question portait sur l'acc�s et donc le 
type de ce que vous allouez (on suppose que l'alocation s'est bien 
d�roul�e). Dans le code que je donnais, j'ai r�duit les tailles � cause 
des printf(), mais �a ne changeait rien.
Je reposte un code plus complet, en esp�rant qu'il est auto-comment�, 
et corrig� d'une erreur:
#define TAB (*ptab) et non #define TAB *ptab
(on peut pr�f�rer �viter ce #define, d'ailleurs)

La ligne importante est :
typedef int TMonTab[TAB_L][TAB_C];
qui d�finit TMonTab comme un type "tableau de dimensions TAB_L x 
TAB_C", et non comme un pointeur. Voir les sizeof() par exemple.
Vous pouvez ensuite utiliser TAB et TAB[x][y], ou (*ptab) et 
(*ptab)[x][y] comme dans votre code d'essai (vrais tableaux en pile), 
sans restriction: passage du tableau � une fonction, copie par 
memcpy(), cochonneries du genre TAB + offset,

J'ai remplac� vos objets que je ne connais pas par des int.

#define TAB_L 2621442
#define TAB_C 8

typedef int TMonTab[TAB_L][TAB_C];
typedef TMonTab* TpMonTab;

int main(void)
{
	int i;
	/* Tableau automatique */
	int TUB[100][TAB_C];

	/* M�thode m�moire continue, vrai tableau */
	TpMonTab ptab = malloc(TAB_L * TAB_C * sizeof(int));
	#define TAB (*ptab)

	/* M�thode m�moire discontinue, faux tableau */
    int** distTable = malloc(TAB_L * sizeof(int*));
	if(distTable != NULL)
	{
		for(i=0; i < TAB_L; i++)
		{
			if(NULL == (distTable[i] = malloc(TAB_C * sizeof(int))))
			{
				for(i -= 1; i >= 0; i--)
				{
					free(distTable[i]);
					distTable[i] = NULL;
				}
				free(distTable);
				distTable = NULL;
				break;
			}
		}
	}

	/* Taille des types */
	printf("%d\n", sizeof(TUB));
    printf("%d\n", sizeof(ptab));
	if(ptab != NULL)printf("%d\n", sizeof(TAB));
	printf("%d\n", sizeof(distTable));

	/* utilisation */
	TUB[20][2] = 120;
	printf("%d\n", TUB[20][2]);
	printf("%d\n", *((int*)TUB + ((20 * TAB_C) + 2)));

	if(ptab != NULL)
	{
		/* utiliser TAB comme un tab[TAB_L][TAB_C] */
		TAB[20][2] = 121;
		printf("%d\n", TAB[20][2]);
		printf("%d\n", *((int*)TAB + ((20 * TAB_C) + 2)));
		/* c'est un peu con mais �a fonctionne */
	}
	if(distTable != NULL)
	{
		/* utiliser distTable comme un tab[TAB_L][TAB_C]
		   avec des restrictions */
		distTable[20][2] = 122;
		printf("%d\n", distTable[20][2]);
		/* �a compile, mais �a ne fonctionne pas :
		printf("%d\n", *((int*)distTable + ((20 * TAB_C) + 2)));
		*/
	}

	/* finalisation
	remettre les pointeurs � NULL est ici inutile */
	if(distTable != NULL)
	{
		for(i=0; i < TAB_L; i++)free(distTable[i]);
		free(distTable);
	}
	if(ptab != NULL)free(ptab);

	return 0;
}


> PS: Pour le code, je pr�f�re ne pas polluer mon message avec des
> lignes de code quand je juge que c'est superflu. J'ai un peu de mal
> avec les messages du genre:
> "Bonjour, voila mon code, pourquoi �a plante ? :)"
> Si je ne trouve pas de solution � mon probl�me, je pense que je le
> ferais aussi, mais j'essaye d'abord de trouver tout seul une solution.
Je comprends bien. Mais � ce moment-l�, postez un code r�duit simple, 
avec des int et autres types simple. Vous avez conserv� vos noms 
d'origine qui rendaient la lecture difficile. Mais ce n'est pas 
important.


-- 
Pierre Maurette
Technical Details
Message-ID: <mn.eb017d59a0eb8637.31483@laposte.net>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!proxad.net!infeed-2.proxad.net!news18-e.free.fr!not-for-mail
References: <1127923112.347881.79740@z14g2000cwz.googlegroups.com> <mn.e49a7d59f0935c1a.31483@laposte.net> <1127978086.261193.54490@g14g2000cwa.googlegroups.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,9ee84542aed426f5
X-Google-Attributes: gidf9822,public
X-Google-Language: FRENCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!proxad.net!infeed-2.proxad.net!news18-e.free.fr!not-for-mail
Subject: Re:Tableau: différence entre pile et tas
From: "Pierre Maurette" <maurettepierre@wanadoo.fr>
References: <1127923112.347881.79740@z14g2000cwz.googlegroups.com> <mn.e49a7d59f0935c1a.31483@laposte.net> <1127978086.261193.54490@g14g2000cwa.googlegroups.com>
Newsgroups: fr.comp.lang.c
Message-ID: <mn.eb017d59a0eb8637.31483@laposte.net>
Supersedes: <mn.eada7d59f468a056.31483@laposte.net>
X-Newsreader: MesNews/1.04.00.00
Date: Thu, 29 Sep 2005 12:49:34 +0200
MIME-Version: 1.0
X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}<qH-?#_Y$B9]$q1"~iUGtN#HVy?}7.`m&iKF>gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~
Reply-To: maurettepierre@wanadoo.fr
Content-Type: text/plain; charset="iso-8859-15"; format=flowed
Content-Transfer-Encoding: 8bit
X-Antivirus: avast! (VPS 0539-1, 27/09/2005), Outbound message
X-Antivirus-Status: Clean
Lines: 153
Organization: Guest of ProXad - France
NNTP-Posting-Date: 29 Sep 2005 12:47:58 MEST
NNTP-Posting-Host: 84.7.242.66
X-Trace: 1127990878 news18-e.free.fr 30649 84.7.242.66:3926
X-Complaints-To: abuse@proxad.net