6
votes

Créez un tableau dans une fonction de C ++ sans une variable globale

Je tiens donc à créer un tableau dans une fonction avec la taille définie par un nombre entrant en tant que paramètre. Voici un exemple: xxx

même si le paramètre est un const int, il ne fonctionnera pas. Je voudrais utiliser un const global et ne pas utiliser de vecteurs. Je suis juste curieux que j'apprends C ++. Je voudrais que cela en fait de sorte que la taille de la matrice soit différente chaque fois que la fonction est appelée. Y a-t-il une solution à cela ou suis-je pour créer une variable Const et la matrice avant que la fonction soit appelée?


9 commentaires

int * temp_arr = nouveau int [array_size]; ... Supprimer [] temp_arr;


@songyuanyao Ce n'est pas vraiment la même chose depuis son allocation statique à une allocation dynamique.


et ne pas utiliser de vecteurs. Je suis juste curieux que j'apprends C ++. - vous pensez que std :: vecteur n'est pas c ++? Qu'est-ce que c'est avec vecteur pourquoi tant de débutants pensent qu'ils ne devraient pas ou ne pas l'utiliser?


@Paulmckenzie Ce n'est pas que je ne pense pas que je devrais utiliser des vecteurs, je sais qu'elles sont distinctes de la STL et que je les utilise dans des projets. Je veux juste comprendre quoi faire avec des tableaux. C'est dans le but de simplement apprendre et je suis en train de jouer pour mieux comprendre la langue.


Les tableaux sont limités et tout simplement muet. Essayer de chagriner plus de caractéristiques en dehors d'eux est une perte de temps, imo.


Mais s'il y avait un cas où vous saviez que vous connaissiez la taille de ce qu'un conteneur devrait être, ne serait-il pas plus rapide d'avoir la matrice créée, par opposition à l'utilisation d'un vecteur. Je pense qu'un vecteur serait préférable quand vous ne connaissez pas la taille que le tableau aurait besoin d'être.


@ kingcobra1986 Utilisation std :: Array . Beaucoup plus intelligent qu'un tableau alors qu'ils connaissent leur propre taille et ne se dégagent pas aux pointeurs lorsqu'ils sont passés à des fonctions.


Votre code est valide avec le compilateur GCC. Cependant, ce n'est pas valide avec la norme de langue C ++.


Je vais devoir regarder dans STD :: Array


5 Réponses :


2
votes

Lorsque vous passez une valeur dans cette fonction, la valeur n'est pas une constante. Définir un tableau doit être fait avec une valeur constante. Bien que vous ayez utilisé const int glob_size , cela ne crée qu'un entier constant dans la fonction. Donc, d'une certaine manière, si vous passez une valeur variable dans la fonction, elle le prend comme une variable. Ainsi, cela produit une erreur. Oui, vous devez créer une constante et transmettre pendant l'appel de la fonction.


3 commentaires

Je me suis fatigué d'avoir un const int en haut et de passer cela dans la fonction. Et j'ai également essayé d'ajouter un const int qui est égal à array_size à l'intérieur de la fonction. Dites-vous que je devrais créer une variable globale?


@ KINGCOBRA1986 Vous n'avez pas à créer une variable globale, voir ma réponse.


@ KINGCOBRA1986 Comme indiqué dans la réponse de l'utilisateur2296177, il n'est pas nécessaire de créer une variable globale.



7
votes

Utilisation d'une fonction de modèle: xxx

Vous pouvez ensuite appeler la fonction avec cette syntaxe: xxx

note

chaque appel avec une valeur différente de array_size instanciera une nouvelle fonction.


3 commentaires

Et si la taille est venue d'une variable?


@Dmitri uniquement s'il s'agit d'un consexpr : consexpr std ::ze_t sz {32}; temp_arr (); fonctionnera. Le point est que cela doit être disponible à la compilation.


Cela a fonctionné pour moi. J'utilise un const int pour passer dans le gabarit.



0
votes

Vous pouvez utiliser: xxx

pour créer un tableau en C ++. Cependant, vous ne pouvez pas utiliser xxx

pour créer un tableau à moins que le compilateur prend en charge les VLAS comme une extension. La norme ne prend pas en charge VLAS.

Le qualificatif const const dans un type d'argument ne fait que la variable const dans la fonction - vous ne pouvez pas modifier Sa valeur. Cependant, la valeur ne peut pas nécessairement être déterminée à la compilation.

Par exemple, vous pouvez appeler la fonction à l'aide de: xxx

puisque la valeur ne peut pas être nécessairement être déterminé à la compilation, il ne peut pas être utilisé pour créer un tableau.


1 commentaires

Le qualificatif const dans le type d'argument n'est pas "inutile"



0
votes

Si vous n'avez pas de problème avec mémoire, laissez-moi vous dire un moyen simple: -

   void temp_arr ( const int array_size )
   {
       //lets just say you want to get the values from user and range will also be decided by the user by the variable array_size

       int arr[100];   //lets just make an array of size 100 you can increase if according to your need;
       for(int i=0; i<array_size ; i++)
       {
         scanf("%d",&arr[i]);
       }
   }


3 commentaires

Vous devez inclure du code pour éviter les débordements de mémoire tampon lorsqu'ils donnent la taille supérieure à 100


Totalement d'accord @ m.m il était juste de donner l'idée aux débutants.


Je suis également sur le chemin de l'apprentissage de la programmation, je veux juste partager les choses que je connais.



0
votes

Vous pouvez utiliser un std :: unique_ptr: xxx


0 commentaires