Comment faire pour copier les valeurs d'un tableau dans un nouveau?
J'ai essayé de comprendre cela et de décollage depuis une semaine maintenant et je continuer à courir dans des problèmes.
Mon objectif:
Écrire une fonction qui alloue de la mémoire pour un tableau d'entiers. La fonction prend comme argument un pointeur entier, la taille de la matrice, et newSize être attribués. La fonction renvoie un pointeur vers la mémoire tampon allouée. Lorsque la fonction est appelée en premier, la taille sera de zéro et un nouveau tableau sera créé. Si la fonction est appelée lorsque la taille du tableau, est supérieure à zéro, un nouveau tableau est créé et le contenu de l'ancien tableau seront copiés dans le nouveau tableau. Votre instructeur a fourni arrayBuilder.cpp en tant que starter code pour ce défi en termes de programmation. En outre, Lab9_1.exe est l'exécutable pour cette application que vous pouvez tester.
Le code:
#include <iostream>
using namespace std;
int * arrayBuilder(int * arr, int size, int newSize);
void showArray(int * arr, int size);
int main()
{
int * theArray = 0;
int i;
cout << "This program demonstrates an array builder function." << endl << endl;
//create the initial array. The initial size is zero and the requested size is 5.
theArray = arrayBuilder(theArray, 0, 5);
//show the array before values are added
cout << "theArray after first call to builder: " << endl;
showArray(theArray, 5);
//add some values to the array
for(int i = 0; i < 5; i++)
{
theArray[i] = i + 100;
}
//show the array with added values
cout << endl << "Some values stored in the array: " << endl;
showArray(theArray, 5);
//expand the size of the array. size is not the original size. newSize
//must be greater than size.
theArray = arrayBuilder(theArray, 5, 10);
//show the new array with the new size
cout << endl << "The new array: " << endl;
showArray(theArray, 10);
cout << endl;
delete [] theArray; //be sure to do this a1t the end of your program!
system("pause");
return 0;
}
/*
FUNCTION: arrayBuilder
INPUTS Pointer to an array. Size of the array. If size is zero, arr can be NULL.
Size of the new array.
OUTPUTS: Returns a pointer to allocated memory. If newSize is greater than size,
an array of newSize is allocated and the old array is copied into the new
array. Memory pointed to by the old array is deleted. All new elements
are initialized to zero.
*/
int * arrayBuilder(int * arr, int size, int newSize)
{
//TODO: Your code goes here
return NULL; //default return value. No memory allocated!
}
/*
FUNCTION: showArray
INPUTS: Pointer to an array. Size of the array. If size is zero, arr can be NULL.
OUTPUTS: Prints the contents of the array to the console.
*/
void showArray(int * arr, int size)
{
cout << "arr = ";
for(int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
Mes luttes: je ne peux pas comprendre comment le commutateur "arr" et un tableau temporaire de valeurs.
int * arrayBuilder(int * arr, int size, int newSize)
{
//TODO: Your code goes here
int * temp = new int [newSize];
for (int i = size; i < newSize; i++)
{
*arr = *temp;
temp++;
}
return NULL; //default return value. No memory allocated!
}
une autre tentative, alors que la recherche de réponses:
int * arrayBuilder(int * arr, int size, int newSize)
{
//TODO: Your code goes here
int * temp = new int [newSize];
memcpy (temp, arr, size *sizeof(int));
//HINT: Design the function before writing it.
delete[] arr;
for (int i = size; i < newSize; i++)
{
temp[i] = i;
}
return NULL; //default return value. No memory allocated!
}
Fondamentalement, mon but final est d'avoir la réponse ressembler à ceci:
This program demonstrates an array builder function.
theArray after first call to the builder:
arr = 0 0 0 0 0
some values stored in the array:
arr = 100 101 102 103 104
the new array:
arr = 100 101 102 103 104 0 0 0 0 0
PROGRÈS!! Ses pas s'écraser plus 🙂 C'est là où je suis maintenant:
This program demonstrates an array builder function.
theArray after first call to builder:
arr = -842150451 0 0 0 0
Some values stored in the array:
arr = 100 101 102 103 104
The new array:
arr = -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -8
42150451 -842150451 -842150451 -842150451
Press any key to continue . . .
Je vais continuer à bricoler et de laisser tout le monde sais que si j'ai frappé un mur! Merci encore les gars!
D'ACCORD! on fini par s'afficher correctement:
This program demonstrates an array builder function.
theArray after first call to the builder:
arr = 0 0 0 0 0
some values stored in the array:
arr = 100 101 102 103 104
the new array:
arr = 100 101 102 103 104 0 0 0 0 0
C'est ce que j'ai fait. Je me sens comme si je peut avoir triché dans la deuxième partie quand j'ai mis des valeurs à 0 pour "temp". C'est ma compréhension que j'allais prendre les données du tableau précédent et le mettre dans le nouveau, et à la place j'ai juste refait. (Donc, il ne fonctionne qu'avec cet ensemble particulier de valeurs [0]). Est-il un autre moyen pour que je puisse le code de la deuxième partie de sorte qu'il fonctionne de manière universelle, à ce que les valeurs sont jetées???
int * arrayBuilder(int * arr, int size, int newSize)
{
int i = size;
int * temp = new int [newSize];
//What if the size is 0?
if (size <= 0)
{
while (i < newSize)
{
temp[i] = 0;
i++;
}
}
//Assuming the size _isn't_ 0
else
{
//"a new array will be created" (good)
for (i = 0; i < newSize; i++)
{
//The contents of the "old" array (arr) will be
//copied into the "new" array (temp)
while (i < size)
{
temp[i] = arr[i];
i++;
}
while (i >= size && i < newSize)
{
temp[i] = 0;
i++;
}
//as a hint, you can address the elements in
//both arrays using the [] operator:
//arr[i]
//temp[i]
}
}
//"The function returns a pointer to the allocated buffer."
//So, NULL is wrong, what buffer did you allocate?
return temp; //default return value. No memory allocated!
}
OriginalL'auteur Peter | 2013-12-05
Vous devez vous connecter pour publier un commentaire.
Depuis que vous avez mis de l'avant un certain effort.
Le prototype de cette fonction est fournie pour vous:
Cela ne dit rien au sujet de faire quelque chose avec le "vieux" (passés) tableau, nous devons supposer qu'il doit être laissé seul.
Le texte ci-dessus est vide de sens, étant donné le contexte. Hésitez pas à dire à votre instructeur je l'ai dit. Si la taille est égale à zéro, comment savez-vous combien d'éléments d'allouer?
OK, maintenant les entrailles de ce qui doit être fait (vous êtes donc proches)
Hmmm, oui, l'ajout de commentaires dans le code est mieux pour la, ligne par ligne de l'examen que de tenter de le préciser en anglais.
+1 Bonne réponse. Pourrait avoir utilisé memcpy, mais c'est plus explicite à des fins d'enseignement.
WOW! merci beaucoup, je vais passer un peu de temps à digérer cette. Je serai de retour, espérons-le, laissez-vous savez, j'ai pensé à elle. Si non, je vais être de retour avec plus de questions que vous ou quelqu'un d'autre peut m'aider. Merci encore!
Je suis nouveau sur ce site donc je ne sais pas si l'édition de mon post vous a notifié ou quoi que ce soit, mais j'espère que cela ne. De toute façon, j'apprécie vraiment votre aide et si vous ne me dérangerait pas de prendre un coup d'oeil à mon post mis à jour, je serai éternellement reconnaissant
OriginalL'auteur Chad
Vous avez déjà eu la réponse ici:
mais vous faites plusieurs autres erreurs après cela. Essentiellement, vous avez besoin de
return temp ;
pasreturn NULL ;
Mais aussi, vous n'avez pas besoin de la boucle après le
delete arr[] ;
Aussi, ne pas
delete arr[]
si la taille est égale à zéro.new
ed tableau de taille 0.Une autre possibilité est de remplacer
memcpy
avecstd::copy
.OriginalL'auteur woolstar
Juste pour vous aider à comprendre pourquoi la première tentative n'a pas fonctionné:
C'est l'affectation d'une valeur à l'ancien tableau, à partir de la nouvelle matrice. C'est à l'envers.
Mais c'est juste ciblage de la première valeur,
*arr
ne change pas. Vous incrément*temp
, mais vous avez aussi besoin d'incrémenter*arr
. (Aussi, manuel de manipulation du pointeur comme ça horrible et memcopy() est beaucoup mieux. Mais bon, c'est à des fins d'apprentissage, non?)Aussi, de penser que la boucle:
C'est à itérer une fois pour chaque bit newSize est plus grand que la taille. Mais vous êtes en train de faire deux choses ici. 1) la Copie des données, et 2) l'initialisation de nouvelles données. Que pour la boucle que vous avez est bon pour aller sur les nouvelles données, mais ce n'est pas la boucle que vous voulez pour copier les données que vous avez déjà. Qui vont de zéro à la taille, à droite?
Et lorsque vous avez terminé, vous devez renvoyer l'adresse du tableau que vous avez construit.
C'est juste un mannequin se moquer de code. C'est un espace réservé par l'enseignant. C'est une partie du code que vous êtes censé changer.
Par votre mise à jour:
Bien de quoi d'autre avez-vous été à mettre là? Vous NE copiez plus de l'ancien tableau de données. Ensuite, vous DÉVELOPPEZ le tableau. Ce qui se passe dans le nouveau territoire? Les valeurs zéro comme valeur par défaut est parfaitement valide.
Bien oui, mais vous devez avoir quelque chose à jeter. Votre
ArrayBuilder
fonction peut prendre des arguments supplémentaires, peut-être variadic fonction, de sorte qu'il sait ce que les valeurs à mettre dans les nouveaux champs. Mais votre déclaration de fonction n'a pas que. Il n'est de rendre le tableau plus grand.Également, au cours de la dernière modification que vous avez obtenu ces deux boucles à parcourir
i
à l'intérieur d'une boucle for qui a également parcourti
. Que ça va marcher, mais seulement si vous savez que c'est un peu... mal dégrossi. C'est le genre de chose que vous obtenez en difficulté quand les choses deviennent plus compliquées.Vous pourriez faire ceci à la place:
Vous devriez certainement supprimer les commentaires qui font sonner comme quelqu'un d'autre a écrit votre code pour vous. Parce que quelqu'un d'autre l'a fait vos devoirs pour vous. Il est préférable de
Enfin, TU AURAS à INDENTER TON CODE!
OriginalL'auteur Philip
C'est horriblement complexe de code. La programmation est tout au sujet de réduire complexité.
Avec cela à l'esprit, voici une bonne C++ solution:
Que c'est. J'espère que cela illustre bien pourquoi vous devrait utilisation de la bibliothèque standard (ou d'autres bibliothèques) plutôt que de réinventer la roue. À partir du code que vous avez posté, je suis en supposant que vous avez appris (ou d'apprentissage) C++ à partir d'un horrible livre ou d'un cours. Poubelle et obtenir un bon livre. C++ est assez complexe comme il est, pas besoin d'ajouter de la complexité inutile.
Durr. Dans ma défense, c'est un horrible affectation. Pas parce que c'est mauvais en soi, mais parce que les élèves n'ont manifestement pas appris à écrire du bon code C++ encore, donc, ça vient trop tôt.
À l'aide de la STL n'est pas bon. Il y a beaucoup exemples de quand vous avez ne devrait pas l'utilisation de la STL. Par exemple, comme la plupart des professionnels de l', STL n'est pas thread-safe et ne peut pas être utilisé en multi-thread de programmation. Les gens devrait l'utilisation de la STL lorsque c'est approprié, non pas comme d'une béquille. L'apprentissage de la copie de base de tableaux est toujours bon.
STL peut pas être utilisé dans les programmes multithread? omg, je ferais mieux de tirer toutes mes applications sur le marché....
C'est ridicule. Indépendamment de ces mises en garde, à l'aide de la bibliothèque standard bon. Il a également être utilisé dans un environnement multithread, vous avez juste besoin de fournir votre propre de verrouillage. Il y a de bonnes raisons pour le manque de sécurité des threads – à savoir, l'efficacité des demandes (et la rétrocompatibilité de avant le C++ pris en charge le multithreading). Et enfin, bon gré mal gré l'accès partagé les structures de données communes n'a pas sa place dans un plan bien conçu multithreading environnement de toute façon. Bon multithreading utilise dédié, synchronisé canaux de communication pour atteindre cet objectif.
OriginalL'auteur Konrad Rudolph
Si j'ai bien compris l'attribution de la fonction doit regarder la façon suivante.
Tout d'abord, je voudrais remplacer la déclaration de la fonction
pour
Voici sa définition
OriginalL'auteur Vlad from Moscow
Essayez ceci:
Code:
OriginalL'auteur Mr_Tanki_Online_Pro_TO