Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un programme qui créé des variables à la chaîne.

29 août 2022 à 17:49:43

Bonjour !

J'aimerais savoir si il est possible de créer un programme en C++ où au moins de manière théorique, qui déclare des variables lui-même sans que le développeur ai écrit au préalable les variables à créer. Par exemple, une boucle qui à chaque fois déclare une nouvelle variable.

Le problème, c'est que quand on déclare une variable, que je sache, on lui attribue un nom, et si on veut faire ce type de programme, je ne vois pas comment faire en sorte de déclarer une variable qui portera à chaque fois un nom différent puisque en pratique, tout ce qui est inscrit entre le type de la variable est son initialisation est défini comme le nom de la variable, donc on ne peut même pas récupérer des chaines de caractère stockés dans une liste par exemple.

J'aimerais bien comprendre comment faire ça, quelqu'un en a une idée ?

Merci par avance.

  • Partager sur Facebook
  • Partager sur Twitter
29 août 2022 à 18:07:34

Salut,

Oui ce dont tu parles est un tableau (dynamique).

En C++ tu peux faire un std::vector. Par exemple de int.

std::vector<int> t;

Ici, t est un tableau dynamique.

Si tu veux créer des variables tu créeras t[0], t[1], t[2], etc.... Autant que tu veux !

  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

29 août 2022 à 19:15:52

Il faut comprendre que seul le compilateur a besoin de nommer des variables.

Et encore, si le compilateur/optimiseur "voit" que vous ne foutez rien avec ces variables, il est en droit de ne même pas générer du code correspondant au stockage des valeurs "stockées dans la variable".

La récupération de valeurs de variables par leur 'identifiants/noms" n'est souvent possible que dans des langages interprétés, ce que n'est pas le C++.

>Par exemple, une boucle qui à chaque fois déclare une nouvelle variable.

do
{
   auto pobj = new Object();
}while(true);

Cela créera autant d'objet "Object" qu'il faudra pour remplir le tas, (si l'optimiseur ne supprime pas tout le code).

Avec le std::vector de @Fvirtman :

std::vector<int> t;
do
{
    t.push_back(t.size());
}while(true);



  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
30 août 2022 à 11:50:24

Bonjour.

Je sais ce qu'est un tableau dynamique et comment l'utiliser, mais ma question n'était pas très claire : je veux plus précisément créer des variables globales.

@bacelar, dans ton premier code, la boucle va créer un nouvel objet à chaque fois, mais comme le nom ne change pas, impossible de récupérer chacun des objets !

Ce que je cherche à faire du coup, c'est pouvoir faire ce premier code mais pouvoir changer le nom de la variable à chaque fois que la boucle recommence, et donc de pouvoir accéder à toute ces variables.

Est-ce que c'est possible ?

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 11:57:39

> Ce que je cherche à faire du coup, c'est pouvoir faire ce premier code mais pouvoir changer le nom de la variable à chaque fois que la boucle recommence,

Est-ce que tu peux donner un exemple simple - même avec une syntaxe imaginaire - d'utilisation de telles variables ?

Souvent, quand on se pose ce genre de question, c'est dans le vide, et ça ne correspond pas du tout à un besoin (en plus d'être impossible à réaliser).

> et donc de pouvoir accéder à toute ces variables.

Question pratique, pour accéder à des variables, il faut pouvoir les désigner. Comment tu vas faire, si tu n'en connais pas le nom ?

-
Edité par michelbillaud 30 août 2022 à 12:01:20

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 13:31:39

Yixraie a écrit:

Je veux plus précisément créer des variables globales.

Rien ne t’empêche de mettre le std::vector en global.

  • Partager sur Facebook
  • Partager sur Twitter
...
30 août 2022 à 14:11:40

Re bonjour.

En fait, ce qui fait que je ne peux pas créer ces variables dans un tableau dynamique, c'est que j'ai besoin de pouvoir créer une infinité de variables.

Je crois que ce n'est pas possible avec un vector, étant donné que la méthode size() d'un vector renvoie un "long long", et ça a donc une limite.

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 14:19:50

Tu veux saturer la mémoire ?
  • Partager sur Facebook
  • Partager sur Twitter
...
30 août 2022 à 14:35:40

Yixraie a écrit:

Re bonjour.

En fait, ce qui fait que je ne peux pas créer ces variables dans un tableau dynamique, c'est que j'ai besoin de pouvoir créer une infinité de variables.

Je crois que ce n'est pas possible avec un vector, étant donné que la méthode size() d'un vector renvoie un "long long", et ça a donc une limite.


La méthode size() renvoie un long long (ou un size_t), sur nos processeurs 64 bits, ça a une limite de 2^64 octets -> c'est un nombre à 20 chiffres, qui correspondrait a des milliers de milliards de giga octets. As tu cela de disponible sur ta machine ? 

Tu devrais plutôt nous donner un exemple concret de ce que tu veux faire. mais crois moi, std::vector t'alloueras tout ce que tu voudras... (ta machine plantera avant que size() atteigne sa limite...)

  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

30 août 2022 à 14:41:21

La valeur maximale que peut prendre un long long est bien le cadet de tes soucis ...

long long est codé sur 64bits minimum, sa valeur maximale est 2^63 - 1 et même 2^64 - 1  = 18 446 744 073 709 551 615 si tu prends un unsigned long long. Pourquoi aurais tu besoin d'autant de variables ?

Ton ordinateur va fumer noir (ou ton programme va juste planter par manque de mémoire sur le PC) bien avant que tu ne remplisses ton vector d'autant d'élément

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 14:51:56

Yixraie a écrit:

Re bonjour.

En fait, ce qui fait que je ne peux pas créer ces variables dans un tableau dynamique, c'est que j'ai besoin de pouvoir créer une infinité de variables.

Dans une boucle qui prendra un temps infini ?

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 15:04:56

Tu as besoin de variables de types différents, ou juste de valeurs différentes ?
Dans le premier cas, tu vas te faire des noeuds au cerveau (en admettant que ce soit possible), dans le second cas tu as juste besoin d'un tableau dynamique.
  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

30 août 2022 à 15:13:22

Comme ça déjà été demandé, pourquoi as-tu besoin d'autant de variables?
Apprends le Python, il va te générer le code C++ approprié. :)
nombre = 0
while True:
    print(f"    variable{nombre} = valeur{nombre};")
    nombre += 1
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

30 août 2022 à 15:32:58

En fait, concrètement, j'aimerais faire un type d'entier pouvant monter jusqu'à l'infini, avec lequel je pourrais faire des calculs.

Donc mon idée était de créer une variable par chiffre, et d'en créer une nouvelle quand j'ai besoin d'un nouveau chiffre.

Mais du coup, je ne peut apparemment pas réaliser cela...

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 15:43:31

Après nous avoir demandé de résoudre le problème Y, enfin tu donnes le problème X.

Ce que tu semble expliqué existe déjà. Les chiffres sont en général stockés dans une chaîne de caractère. C'est le cas de la bibliothèque gmp.

Je ne sais pas s'il y a un équivalent en C++.

  • Partager sur Facebook
  • Partager sur Twitter
...
30 août 2022 à 15:53:22

Gmp, depuis 1991, pour les nombres en multiprecision, c++, ....

https://fr.m.wikipedia.org/wiki/GNU_MP

Il ne s'agit donc pas de "créer une infinité de variables", mais de manipuler des nombres arbitrairement grands.

-
Edité par michelbillaud 30 août 2022 à 15:54:36

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 16:15:50

On peut créer des variables et bien plus encore grâce à un metaprogramme, c’est à dire un programme qui génère un programme. Les templates sont une forme limitée de metaprogramme
  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 17:31:02

Un std::vector<char> ferait l'affaire si tu veux coder toi-même les "pseudo"-opérations.
Tu fais les choses à l'envers, le chiffre le moins significatif en position 0.
Tu peux ajouter autant de chiffres que tu veux.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

30 août 2022 à 18:45:35

> Les chiffres sont en général stockés dans une chaîne de caractère.

Nope. On ne stocke pas des chiffres (*) mais des nombres et de préférence avec plein de bits dedans. Genre un std::vector<std::uintmax_t> en interne (quoique que gmp a l'air d'employer juste du `long`...) -> but minimiser les opérations que le proc fera très bien tout seul comme propager des retenues. Si les digits ont 32 à 64 bits au lieu de 10 maigres valeurs possibles, autant dire qu'il y aura moins de manipulations à faire à la main

(*) à part les hurluberlus qui ont pondu le BCD (quelle idée saugrenue!)

PS: il y a sur le forum un vieil exo/défi d’implémenter une classe de nombre entier à précision arbitraire qui date du sdz.

  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
30 août 2022 à 21:33:57

Bonjour.

Merci pour toute vos réponses ! Malheureusement, je ne souhaite pas juste utiliser cela, mais surtout comment ça fonctionne, comment des gens ont ils pu créer cette possibilité de pouvoir étendre un nombre jusqu'à l'infini alors que les langages de programmations ont toujours une limite ?

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2022 à 21:43:14

Yixraie a écrit:

Bonjour.

Merci pour toute vos réponses ! Malheureusement, je ne souhaite pas juste utiliser cela, mais surtout comment ça fonctionne, comment des gens ont ils pu créer cette possibilité de pouvoir étendre un nombre jusqu'à l'infini alors que les langages de programmations ont toujours une limite ?


Alors dans les faits, ça ne va pas jusqu'à l'infini. ça va jusqu'à ... ce qu'il n'y ait plus de mémoire, c'est tout.

La méthode la plus simple (mais pas la plus optimale), c'est que tu te crées une std::string, et dedans tu mets tes chiffres 0,1,2,3 etc... comme on fait à l'école. Si on veut ajouter un chiffre, bah on agrandit la string (il y a la méthode push_back aussi), et ensuite tu recodes les opérations...

Tu pourras obtenir des nombres avec des millions, voir des milliards de chiffres si tu veux. Mais jamais l'infini.

  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

30 août 2022 à 23:34:22

Yixraie a écrit:

Bonjour.

Merci pour toute vos réponses ! Malheureusement, je ne souhaite pas juste utiliser cela, mais surtout comment ça fonctionne, comment des gens ont ils pu créer cette possibilité de pouvoir étendre un nombre jusqu'à l'infini alors que les langages de programmations ont toujours une limite ?


Avec des tableaux...
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
31 août 2022 à 7:31:41

Yixraie a écrit:

Bonjour.

Merci pour toute vos réponses ! Malheureusement, je ne souhaite pas juste utiliser cela, mais surtout comment ça fonctionne, comment des gens ont ils pu créer cette possibilité de pouvoir étendre un nombre jusqu'à l'infini alors que les langages de programmations ont toujours une limite ?

Ça marche avec l'allocation dynamique.  L'espace accordé à une variable "bignum"  pour y stocker un nombre arbitrairement grand n'est pas fixé à la compilation (*), et change en cours d'exécution. Quand l'espace est trop petit pour y mettre un nombre  trop grand, on remplace par un espace plus grand, de taille suffisante

(*) comme il l'est pour des int, des long etc (tous les types de base de C) dont la taille est immuable.

-
Edité par michelbillaud 31 août 2022 à 7:37:41

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2022 à 12:19:55

Fvirtman a écrit:


Alors dans les faits, ça ne va pas jusqu'à l'infini. ça va jusqu'à ... ce qu'il n'y ait plus de mémoire, c'est tout.

La méthode la plus simple (mais pas la plus optimale), c'est que tu te crées une std::string, et dedans tu mets tes chiffres 0,1,2,3 etc... comme on fait à l'école. Si on veut ajouter un chiffre, bah on agrandit la string (il y a la méthode push_back aussi), et ensuite tu recodes les opérations...

Tu pourras obtenir des nombres avec des millions, voir des milliards de chiffres si tu veux. Mais jamais l'infini.


Merci ! Je suppose donc qu'un string n'a pas d'autre limite que la mémoire de l'ordinateur ?
  • Partager sur Facebook
  • Partager sur Twitter
31 août 2022 à 12:33:52

Ça pourrait être plus grand, puisqu'on utilise en realité une mémoire virtuelle qui étend la mémoire physique par de l'espace réservé sur le disque (espace d'echange).

Mais en pratique, que faire d'une chaîne de centaines de giga-octets ?

-
Edité par michelbillaud 31 août 2022 à 12:34:39

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2022 à 14:52:43

michelbillaud a écrit:

Mais en pratique, que faire d'une chaîne de centaines de giga-octets ?

-
Edité par michelbillaud il y a environ 1 heure


Stocker des nombre des millier de fois plus grand que la limite d'un unsigned long long par exemple ? Enfin si j'ai bien compris il me semble que c'est possible.
  • Partager sur Facebook
  • Partager sur Twitter
31 août 2022 à 15:07:10

Il suffit d'une dizaine de bits en plus pour disposer de 1000 fois plus d'entiers. Alors rien qu'avec un std::array<std::uint64_t, 2>, on peut modéliser des nombres à 128 bits, c'est excessivement plus que x1000.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
31 août 2022 à 15:13:13

>Stocker des nombre des millier de fois plus grand que la limite d'un unsigned long long par exemple ?

Stocker un nombre des milliards de fois plus grand que la limite d'un unsigned long long avec le bon formalisme, cela peut prendre que quelques octets en mémoire.

https://www.youtube.com/watch?v=TVJw_pTMxiI&list=PLtzmb84AoqRRgqV5DfE_ykuGQK-vCJ_0t

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
31 août 2022 à 16:10:40

Tu peux utiliser une "map" 

#include <map>

...

while(True) {
	
	std::map<std::String, int> variables;
	variables.insert(std::pair<std::String, int>("nom_de_la_variable", 40));
	
	
}



-
Edité par cepseudoestdejapris 31 août 2022 à 16:13:43

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2022 à 17:00:55

Comme @Yixraie semble assez novice et pour qu'il n'interprète pas de travers "toute la mémoire", il faut savoir que les ordinateurs "modernes" (depuis las années 50, je crois) utilisent "l'architecture" Van Neuman, qui fait que le code et les données partagent l'espace d'adressage d'un processus.

La taille de l'espace d'adressage d'un processus est fonction de l'OS et de divers options d'exécution et/ou de compilations. La répartition entre le code et LES espaces mémoires pour les données sont aussi fonction de l'OS et des modèles mémoire des processus.

Mais rien n'empêche un développeur d'implémenter des niveaux d'indirection d'accès aux données (utilisation d’extensions hardware, de mise en mémoire de masse, etc...) même si ces mécanismes ne sont pas implémentés directement dans le langage de programmation.

Le langage de programmation est un outil, pas un carcan.

Et en C++, le développeur a la possibilité de créer ses propres types, via les classes et donc d'en créer "parfaitement" adaptées à ces besoins.

Mais avec les autres langages, c'est toujours possible, mais c'est pas forcement aussi simple à implémenter.

Après, que des calculs sur ce type de données soient "performants", c'est pas gagner, c'est une question de compromis et d'usage.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.