Comprendre l'allocation dynamique

Fermé
ripcurlpro Messages postés 4 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 19 mars 2005 - 4 nov. 2004 à 09:58
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 - 4 nov. 2004 à 10:28
Bonjour j'ai un tableau de structure avec mon prog, je vous met tout pour que vous compreniez.

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

const Nbmax=3;

typedef struct {
             	int nbcours;
             	char nom[20];
               char ville[50];
            	}FicheEl;

FicheEl TAB[Nbmax] ;
int i;

void Lister ()
{
for (i=0;i<Nbmax;i++)
	{
   	if (TAB[i].nbcours != 0)
      	{
         printf ("Le nom de l'eleve est   			: %s\n",TAB[i].nom);
         printf ("La ville de l'eleve est 			: %s\n",TAB[i].ville);
         printf ("Le nombre de cours passé par l'eleve est 	: %d\n",TAB[i].nbcours);
         printf ("-------------------------------------------------\n");
         }
   }
}

void AjouEleve ()
{
i=0;
while (TAB[i].nbcours!=0)
i=i+1;

	{
   	if (i<Nbmax)
			{
   		printf ("Veuillez saisir le nouvel %cl%cves\n",130,138);
         printf ("Veuillez saisir le nom de %cl%cves\n",130,138);
   		scanf ("%s", TAB[i].nom);
         printf ("Veuillez saisir la ville\n");
   		scanf ("%s", TAB[i].ville);
         printf ("Vous avez saisi l'eleve %s de la ville %s\n",TAB[i].nom,TAB[i].ville);
         getch ();
         TAB[i].nbcours=0;
         TAB[i].nbcours=TAB[i].nbcours+1;
         }
         else
         printf ("Il n'y a plus de place pour un nouvel %cl%cves\n",130,138);
   }
}

void AjouCours ()
{
char nomel[25];
printf ("Ecrivez le nom de %cl%cves\n",130,138);
scanf ("%s",nomel);

for (i=0;i<=Nbmax;i++)
	{
   if ( strcmp(nomel,TAB[i].nom)==0)
      {
   	if (TAB[i].nbcours != 0)
	      {
 				printf ("Vous allez ajouter un cours à l'eleve %s\n",nomel);
 				TAB[i].nbcours=TAB[i].nbcours+1;
            printf ("L'%cl%cve %s a d%csormais %d cours\n",130,138,TAB[i].nom,130,TAB[i].nbcours);
            getch ();
 	      }
      }
   }
   }

void DescEl ()
{
char nomel[25];
printf ("Ecrivez le nom de %cl%cves\n",130,138);
scanf ("%s",nomel);

for (i=0;i<Nbmax;i++)
	{
   if ( strcmp(nomel,TAB[i].nom)==0)
      {
   	if (TAB[i].nbcours != 0)
            {
 				printf ("Vous allez d%csinscrire un l'%cl%cve %s\n",130,130,138,nomel);
 				TAB[i].nbcours=0;
            }
      }

   }
}

}

void main ()
{
int i = 0;
FILE * fichier = fopen("Autoecolesauvegarde.txt","r+");
if ((fichier = fopen("Autoecolesauvegarde.txt","r+"))!= NULL)
     {
    	for (;i<Nbmax;i++)
	 		{
          fread (&TAB[i],sizeof(TAB[i]),1,fichier);
          fclose(fichier);
    		}
     }
     else
     fprintf (stderr,"Le fichier de sauvegarde est introuvable\n\n");
char c;
do
{
clrscr ();
printf ("Veuillez faire votre choix\n\n");
printf ("1 : Lister les %cl%cves\n",130,138);
printf ("2 : Inscrire un %cl%cves\n",130,138);
printf ("3 : Ajouter un cours\n");
printf ("4 : D%csinscrire un %cl%cves\n",130,130,138);
printf ("5 : Quitter\n\n");
scanf ("%c",&c);
	switch (c)
  		{
		case '1':
         {
         clrscr ();
         printf ("Voici la liste des %cl%cves\n\n",130,138);
         Lister();
         printf("Appuyez sur une touche pour continuer\n");
         getch ();
         break ;
         }
		case '2': ;
       {
        clrscr ();
         printf ("Vous allez inscrire un %cl%cves\n",130,138);
         AjouEleve();
         printf("Appuyez sur une touche pour continuer\n");
         getch ();
         break ;
         }
		case '3': ;
       {
        clrscr ();
         printf ("Vous allez ajouter un cours:\n");
         AjouCours();
         printf("Appuyez sur une touche pour continuer\n");
         getch ();
         break ;
         }
		case '4': ;
      {
       clrscr ();
         printf ("Vous allez ajouter un %cl%cves\n",130,138);
         DescEl();
         printf("Appuyez sur une touche pour continuer\n");
         getch ();
         break ;
         }
		case '5': ;
      {
       clrscr ();
         printf ("Vous allez quitter le programme:\n");
         int i = 0;
			FILE * fichier = fopen("Autoecolesauvegarde.txt","w+");
    		for (;i<Nbmax;i++)
    		fwrite (&TAB[i],sizeof(TAB[0]),1,fichier);
    		fclose(fichier);
         printf("Appuyez sur une touche pour continuer");
         getch ();
         break ;
         }

      case '\n' :
      	break;
      default :
       printf("vous avez taper un mauvais charact%cre.\n",138);
       getch ();
       break;
      }
} while ( c!='5');
}



Ce que je voudrai faire c'est degager le tableau creer mais faire quelque chose de dynamique que je ne soit pas obligé de donnr la taille maximum du tableau, merci de votre aide a tous.

2 réponses

blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
4 nov. 2004 à 10:28
Déjà, la structure ici est une variable globale, ce qui pose problème
pour l'allocation dynamique: elle ne peut se faire que par addresse.
or aucune fonction ici ne traite la structure par adresse.
L'allocation dynamique d'une varable globale (dont la durée de vie est celle du programme) présente peu d'intérêt.
D'ailleurs, on alloue de la mémoire dynamique pour une variable dans la fonction où elle est déclarée. Le plus souvent, on alloue la mémoire pour une variable en début de fonction et on libère la mémoire en sortie de fonction. La variable allouée dynamyquement est transmise par pointeur (ou adresse) aux autres fonctions gràce à l'usage des paramètres et des pointeurs. En fait l'allocation dynamique permet d'éviter les inconvénients provoqués par les variables globales:
lenteur, occupation permanente de la mémoire.

Donc la structure pourrait être déclarée dans main, et passée par pointeur comme paramètre à toutes les fonctions.
Ensuite on peut faire de l'allocation dynamyque
main
{
struct mastructure=(struct *type_de_structure)= 
malloc(nbfiches * sizeof(*mastructure);
...............
fonction1(&mastructure[1]); //une fiche précise
.........................
fonction1(mastructure); // le fichier complet

free(mastructure)
}


fonction1(struct * mastructure)
{
......................
}


ps: le typedef c'est pas indispensable (j'ai jamais compris ce qu'il avait de plus que #define à partir du moment ou on peut faire struct mastructure)
cordialement.
¤
1
FicheEl* TAB = NULL;

int = 12; // par exmeple

allocation:

TAB = (FicheEl*)malloc( n* sizeof(FicheEl));



libération
free(TAB);
TAB = NULL; // na pas oublier ça !!!
0