J'essaye de faire un programme qui
int
)array[5];
); puisJe demande de l'aide pour que je puisse apprendre à le faire moi-même si nécessaire.
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.
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;
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, " "));
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);
}
}
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.