Tableau a taille variable en C [Résolu]

fandestargate 14 Messages postés dimanche 5 avril 2009Date d'inscription 5 avril 2009 Dernière intervention - 28 nov. 2008 à 18:55 - Dernière réponse : slashbrus 1 Messages postés dimanche 2 octobre 2005Date d'inscription 30 novembre 2008 Dernière intervention
- 30 nov. 2008 à 18:00
Voila, je cherhcer a programmer un tableau dont la taille serait définit par une variable qu'on pourrait choisir au debut du programme:

taille=0;
scanf ("%lf", &taille);
long x[taille];

et ensuite je rempli mon tableau.

Pourquoi faire une taille variable me direz vous?
Simplement car le but de la manip est de calculer une itération dont on pourrait choisir le pas.
Plus le pas est élevée, et plus la résolution va produire de valeures à stocker dans le tableau.

Ma question est donc existe t-il une commande permettant de définir un tableau à taille variable?
Si oui laquelle?
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 29 nov. 2008 à 01:44
3
Merci
!xtab c'est equivalent a xtab != NULL (donc a xtab != 0)

ensuite, sizeof est un operateur qui renvoie la taille d'un element. on peut effectuer cet operateur sur une variable ou sur un type.

les syntaxes sont differentes si on l'utilise sur une variable ou sur un type :

en effet, on peut faire :
sizeof variable
mais :
sizeof(type)

(pour les types, les parentheses sont obligatoires)

Merci coucou747 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de coucou747
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 28 nov. 2008 à 19:01
0
Merci
long *xtab;

xtab = (long*) malloc(taille * sizeof(long));
if(!xtab) ERREUR MEMOIRE;

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 28 nov. 2008 à 19:20
0
Merci
salut

pourquoi taille n'est pas un size_t (enfin un int quoi...) ?

taille ne doit pas etre un double...

int taille;
scanf ("%d", &taille);

ensuite :
long x[taille];
ceci fonctionne en C99 (mais c'est pas un truc super propre...)


sinon, pour le C89, ou pour faire propre, comme le disait brunews :
long *xtab = malloc(taille * sizeof(long));
if(!xtab) ERREUR MEMOIRE;

(les casts, c'est vraiment utile ? c'est pas en CPP qu'on en a besoin pour pouvoir convertir un void* en long* ?)
Commenter la réponse de coucou747
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 28 nov. 2008 à 19:44
0
Merci
En C ça compilerait sans cast (avec averto du compilo si correctement réglé) mais il faut prendre l'habitude du cast explicite, ça force à bien penser ce qu'on produit.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
fandestargate 14 Messages postés dimanche 5 avril 2009Date d'inscription 5 avril 2009 Dernière intervention - 28 nov. 2008 à 22:54
0
Merci
ça a l'air sympa vos idées, mais personnes ne pourrait me détailler un peu votre série de commandes, je suis débutant^^. Par exemple sizeof??? !xtab???

PS: dsl pour l'oubli de int pour la definition de taille^^.
Commenter la réponse de fandestargate
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 28 nov. 2008 à 22:56
0
Merci
Les bases d'un langage s'apprennent dans un bouquin.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
slashbrus 1 Messages postés dimanche 2 octobre 2005Date d'inscription 30 novembre 2008 Dernière intervention - 30 nov. 2008 à 18:00
0
Merci
Bonsoir,

Relativement au problème posé, je me permets de vous soumettre à votre étude un code, somme toute assez complet.

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


/* Nous souhaitons gérer dynamiquement la taille d'un tableau unidimentionnel de type "long".
 * cette taille est le résultat d'une saisie clavier récupérée par un scanf
 */
 
int main(int argc, char * argv[], char * envp[])
{
    size_t uiTaille;
    int mainReturnValue = EXIT_SUCCESS;

     if (scanf("%u", &uiTaille) == 1)
     {
         /* La ligne de code suivant est somme toute la plus importante.
          * Elle déclare un pointeur constant, ce qui endigue toute tentative d'en modifier la valeur.
          * Ce pointeur correspond indirectement au nom du tableau dont nous avons besoin.
          * La fonction "malloc" demande au système de concéder, à ce programme, une partie de la RAM
          * dont il assure la gestion.
          * C'est dans cette RAM allouée que seront implantés les éléments du tableau.
          * L'argument indiquant un nombre d'octets, sachant que sizeof(long) fournit le nombre d'octets
          * occupés par un tel type, en le multipliant par le nombre d'éléments du tableau, cela contribue
          * à demander le juste nombre nécessaire
          */
      long * const aTab = malloc(sizeof(long) * uiTaille);
      if (aTab != NULL)
      {
          long index;


          /* Initialisation des éléments du tableau à zéro, par exemple
           */
          for (index = 0; index < uiTaille; index++)
              aTab[index] = 0;


          printf("Le premier élément du tableau est initialié à : %ld\n", aTab[0]);
          printf("Le dernier élément du tableau est initialié à : %ld\n", aTab[uiTaille -1 ]);


          /* La fonction "free" restitue au système la mémoire qu'il lui a concédée (temporairement)
           */
          free(aTab);


          putchar('\n');
      }
      else
      {
          puts("L'allocation dynamique de mémoire a échoué.");
       mainReturnValue = EXIT_FAILURE;
      }
  }
  else
  {
      puts("La saisie de la taille est incorrecte");
      mainReturnValue = EXIT_FAILURE;
  }


 return mainReturnValue;
}

   Cordialement.
Commenter la réponse de slashbrus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.