Comprendre l'allocation dynamique

ripcurlpro Messages postés 4 Statut Membre -  
blurk Messages postés 487 Statut Membre -
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.
A voir également:

2 réponses

blurk Messages postés 487 Statut Membre 160
 
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
c++man
 
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