web-dev-qa-db-fra.com

Comment créer un tableau avec une taille dynamique? Utilisation générale des tableaux dynamiques (peut-être aussi des pointeurs)?

J'essaye de faire un programme qui

  1. Prend l'entrée de l'utilisateur (disons que tout est int)
  2. Stockez-le dans un tableau sans taille de départ (c'est-à-dire pas -> array[5];); puis
  3. Utilisez les informations stockées dans le tableau à des fins sinistres.

Je demande de l'aide pour que je puisse apprendre à le faire moi-même si nécessaire.

  • Comment créer un tableau dynamique sans taille définie?
  • Comment puis-je utiliser/accéder/atteindre les éléments du tableau ci-dessus?

La lecture ne m'expliquait tout simplement pas assez.

Je sais que c'est une question très noobish, et oui, je suis un noob, mais pour changer cela, j'ai besoin d'aide.

8
hilchev

Pour C++:

Si vous avez juste besoin d'un conteneur, utilisez simplement std:vector. Il prendra en charge toutes les allocations de mémoire nécessaires pour vous. Cependant, si vous souhaitez développer votre propre conteneur dynamique (quelles qu'en soient les raisons), vous devez vous-même prendre en charge les allocations de mémoire. Autrement dit, lorsque votre tableau grandit, vous devez allouer un nouveau bloc de mémoire, copier les valeurs actuelles du tableau dans le nouvel emplacement de mémoire et ajouter de nouvelles valeurs à la mémoire nouvellement allouée. Habituellement, on enveloppe ce type de logique dans une classe séparée, par exemple GrowingArray (comme la classe standard fournie vector)

MODIFIER

Pour élaborer plus sur ma réponse (étant donné que vous l'utilisez à des fins d'apprentissage):

le stocker dans un tableau sans taille de départ (c'est-à-dire pas -> array [5];)

Ici, vous voulez utiliser quelque chose comme ceci: int * myDynamicArray; Lorsqu'un utilisateur entre des valeurs, vous allouez un bloc de mémoire où ces valeurs vont être stockées: myDynamicArray = new int[5]; avec la taille de votre entrée initiale. Je recommanderais également d'enregistrer la taille du tableau dans une variable: int arraySize = 5; Si plus tard vous voulez ajouter de nouvelles valeurs à votre myDynamicArray vous devez tout d'abord allouer un nouveau bloc de mémoire pour le tableau développé (éléments du tableau en cours + nouveaux éléments du tableau). Disons que vous avez 10 nouvelles valeurs à venir. Ensuite, vous feriez: int* grownArray = new int[arraySize+10]; cela alloue un nouveau bloc de mémoire pour le tableau agrandi. Ensuite, vous voulez copier des éléments de l'ancien bloc de mémoire vers le nouveau bloc de mémoire et ajouter des valeurs ajoutées par l'utilisateur (je suppose que vous l'utilisez à des fins d'apprentissage, donc je vous ai fourni un cycle simple pour copier des éléments. Vous pouvez utiliser std:copy ou c comme memcopy également):

int i = 0;
for (; i < arraySize; ++i)
   {
   grownArray[i] = myDynamicArray [i];
   }
// enlarge newly allocated array:
arraySize+= 10;
for (; i < arraySize; ++i)
   {
   grownArray[i] = newValues from somewhere
   }
// release old memory
delete[] myDynamicArray;
// reassign myDynamicArray pointer to point to expanded array
myDynamicArray = gronwArray;
17
Robertas

C'est probablement la manière la plus intelligente (utilisation excessive cryptique de la STL pour certains) ...

std::vector<int> vec;

// read integers 1 at a time from the user,
// will stop when non-integer input is entered
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(), 
          std::back_inserter(vec));

// print out the vector
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
13
David

J'ai une suggestion pour toi. Vous pouvez utiliser une liste chaînée au lieu d'un tableau si vous allez développer avec C

voici un exemple:

typedef struct linked_list {
    int x,
    struct linked_list *next
} linked_list;

struct linked_list *head = NULL;

void add_element(int x)
{
    struct linked_list *elem;
    elem = malloc(sizeof(struct linked_list));
    elem->x =x;
    elem->next = head;
    head = elem;
}

int main()
{
   int x;
   struct linked_list *p;
   do
   {
       printf("Enter Number : ");
       scanf("%d",&x);
       add_element(x)
       printf("Press 'q' or 'Q' to quit or any other key to continue : ");
       scanf("%c",&c);
   }while(c!='q' && c!='Q');

   for (p=head;p!=NULL;p=p->next)
   {
        printf(%d\r\n",p->x);
   }

}
1
MOHAMED

En C, vous pouvez utiliser cette méthode.

int i=0;
int *p;
char c;
int size; 
printf("Enter size :");
scanf("%d",&size); 
int *p=malloc(sizeof(int)*size);
do
{
 printf("Enter Number : ");
 scanf("%d",&p[i]);
 i++;
 printf("Press 'q' or 'Q' to quit or any other key to continue : ");
 scanf("%c",&c);
}
while(c!='q' && c!='Q' && i<=size);
p=realloc(p,i*sizeof(int));

De cette façon, vous pouvez libérer le reste de la mémoire allouée si le nombre d'entiers souhaité est inférieur à la mémoire allouée.

0
Omkant