6
votes

Est-il possible d'autoriser un utilisateur à entrer une taille de matrice avec un clavier?

est-il possible d'autoriser l'utilisateur à entrer la taille d'un tableau avec un clavier?

Je sais que les tableaux ne peuvent pas changer de taille. La seule solution que je pouvais penser est la suivante: xxx

Comment puis-je vérifier que cela fonctionne? Dois-je utiliser un vecteur à la place?


19 commentaires

Ce que vous recherchez sont des matrices de longueur variable. Ils ne sont pas en C ++, sauf si vous utilisez des extensions de compilateur.


Qu'est-ce qui vous empêche d'essayer ce code?


Insistez-vous sur l'allocation statique? Je pense qu'une meilleure solution serait d'utiliser type * userarray = nouveau type [NumberInCutByUser]. N'oubliez pas de le supprimer après! :)


Quel est le problème avec std :: vecteur array (userize) . Ça marchera.


La partie "clavier" de la question est un hareng rouge. Ce qui suit fonctionne également: Echo 10 | ./myprog


Essayer est génial, mais simplement parce que «fonctionne» ne signifie pas que cela fonctionne et nous pourrons certainement donner une meilleure connaissance générale sur la situation sur ce site. Par exemple, même si cela fonctionne sur votre compilateur, vous feriez mieux d'essayer d'allouer plus d'environ 4 Mo sur la pile!


Serait-il plus facile avec la souris?


En tant que note latérale, vous ne pouvez pas attribuer un const à une variable d'heure d'exécution. C'est ce que conscroit signifie ici. Cela ne peut pas changer.


@ScarleMaranteh: Chaque fois que vous êtes mince "N'oubliez pas de ..." Vous le faites absolument mal. Cela devrait aller dans le destructeur d'une classe et cette classe devrait avoir une copie appropriée / déplacer une sémantique. Supprimer [] n'existe jamais dans le code client.


@Gman vous avez absolument manqué mon point de bon monsieur :) Je n'allais pas dans les détails ou quoi que ce soit comme ça, je viens de fournir un peu de tête à un très grand niveau abstrait :) Je n'ai jamais tapé 'Suppr []' comme vous aurait pu remarquer, juste dire;);)


@ScarleMaranth: Mon point est que si vous allez donner des conseils, rendez-vous la peine de conseiller et non de mauvais conseils que vous ne suivez même pas.


@Gman Vous pensez donc que l'avis de l'allocation dynamique était un mauvais conseil, gentil monsieur? Ou éventuellement l'idée de libérer des ressources était un mauvais conseil?


@ScarleMaranth: Si vous lisez mon premier commentaire, c'est le conseil que la gestion de la mémoire doit être effectuée manuelle («N'oubliez pas de le supprimer ...»)


@Gman Vous avez dit que cela devrait aller à destructeur de sorte qu'il soit toujours pris en charge par un compilateur que je suis d'accord avec mais que vous n'avez toujours pas besoin d'oublier de le mettre là-bas, sans oublier de libérer des ressources :) Nous devrions laisser tomber cela, vous souhaiter Bonne chance gentil monsieur.


@ScarleLaranth: Non, vous utilisez std :: vecteur qui l'a déjà fait pour vous .


@Gman, j'ai fourni une solution alternative simple et ajoute un peu de conseils de programmation générale. Je ne l'ai pas posté comme une réponse complètement feuilletée, juste un commentaire. Oui, utiliser std :: vecteur est encore mieux que de gérer la répartition dynamique et la transaction manuellement, vous êtes très correct cher monsieur.


@ScarleMaranteh: "Oui, utiliser std :: Vector est encore mieux que de gérer une allocation dynamique et une translation manuellement" alors comme je l'ai dit du début , dites simplement que au lieu de mauvais conseils .


@Gman il n'est certainement pas un mauvais conseil. Il fournit une solution à un problème qu'il a présenté.


@ScarleMaranth: Je pense que nous avons fini. Vous ne pouvez apparemment pas vous décider à ce que la meilleure solution est et ne reconnaissez pas (pour la raison de Whaver Raison) que la gestion de la mémoire manuelle est mauvaise, un principe bien établi en C ++.


5 Réponses :


17
votes

Les tableaux de longueur variable ne sont pas approuvés par la norme C ++. C ++ Mandats standard que la taille d'un tableau doit être une constante de temps de compilation.
Vous pouvez utiliser VLA via Extension du compilateur fourni dans GCC mais note le Votre code n'est pas portable si vous le faites.

Un moyen approuvé standard de faire est d'utiliser std :: vecteur .


3 commentaires

EXTESNSIOM pour une longueur variable Automatique Arrasys? Pourriez-vous fournir un lien?


C'est dans la GCC, ils en ont un dans le cadre du support C99.


@Violetgiraffe: Il y a vous allez.



0
votes

Non, vous ne pouvez pas avoir des allocations dynamiques comme celle-ci sur la pile (oui, je sais, certains compilateurs ont des extensions pour cela, mais de manière générale, la réponse est non). Vous voudriez utiliser malloc ou neuf pour allouer de manière dynamique la pièce sur le tas. Ou bien sûr, il y a toujours des structures pour faciliter la vie, comme le vecteur.


0 commentaires

1
votes

Non, les tableaux ne peuvent pas être dimensionnés de manière variable en C ++. Le code que vous avez là-bas ne compilera pas, car la valeur d'une constante doit être évaluée à la compilée.

Vous pouvez essayer le std :: vecteur classe et utilisez la méthode redimensionner ou transmettez la taille via le constructeur. Bien que, selon ce dont vous avez besoin, vous pouvez peut-être simplement le laisser pousser naturellement en utilisant push_back .

une alternative de niveau inférieur consiste à utiliser des tableaux alloués dynamiquement: xxx


0 commentaires

12
votes

Beaucoup d'autres réponses sont correctes, mais pour montrer vos choix possibles. Chacun s'intégrera mieux dans différentes situations.

Le premier est le plus similaire à votre code. Il fait une matrice de taille constante et permet à l'utilisateur de choisir la quantité d'utilisation. C'est simple, mais limitatif. Il peut gaspiller de l'espace inutilisé, mais a des endroits où ils sont utilisés. (Peu probable basé sur la saisie de l'utilisateur si) p> xxx pré>

Le deuxième choix est une allocation de mémoire dynamique et en utilisant un pointeur C régulier pour en garder une trace. Si vous oubliez (ou êtes incapable) de la supprimer, vous avez une fuite de mémoire. p> xxx pré>

Le troisième choix écrit votre propre pointeur intelligent, boost ou en C ++ 0x A unique_ptr code>. Il gardera une trace du pointeur pour vous et supprimez-le quand il est hors de portée. P>

#include <vector>
...
std::vector<int> vec; 
cin >> userSize;
vec.resize(userSize);


0 commentaires

1
votes

Oui, vous pouvez. Ici, il est: xxx


1 commentaires

Cette solution a déjà été donnée plusieurs fois il y a plusieurs années;)