2009-07-22 11 views
0

Existe-t-il un moyen de définir une variable globale par entrée utilisateur? Disons que j'utiliseModifier les variables globales en C++

#include... 

#define N 12 
double array[N][N]; 

void main();... 

Mais je voudrais que l'utilisateur soit en mesure de choisir ce que N est. Dois-je avoir N comme variable locale ou y a-t-il un moyen de contourner ce problème (sans macros)? J'ai un assez petit programme mais avec beaucoup de variables différentes qui ont besoin de la valeur N.

Alternativement, est-il un moyen que je pourrais envoyer un groupe de variables dans une fonction sans avoir à les écrire explicitement à chaque fois.

par exemple

myfunction(var1,var2,var3...) 

et au lieu d'écrire quelque chose comme

myfunction(Allvariables) 

Merci beaucoup pour vos réponses! Ceci est un excellent forum.

Répondre

4
int* data; 

int main() 
{ 
    int n; 
    // get n from the user. 

    data = new int[n]; 

    // use data. 

    . 
    . 

    delete[] data; 
} 

ou tout simplement oublier des pointeurs pour toujours et à utiliser vecteur !

std::vector<int> data; 

data.push_back(55); 

// just push_back data! 

=========================================== ============================

EDIT :: Si vous voulez utiliser Edouard façon A. :)

#include <iostream> 
#include <sstream> 
#include <vector> 

int main(int argc, char* argv[]) 
{ 
    std::vector<double>::size_type dataSize = 0; 
    std::stringstream convertor(argv[1]); 
    { 
     if(argc > 1) 
     { 
      convertor >> dataSize; 

      if(convertor.fail() == true) 
      { 
       // do whatever you want here in case 
       // the user didn't input a number. 
      } 
     } 
    } 
    std::vector<double> data(dataSize); 

    // use the vector here. 

    return 0; 
} 

Je préfère utiliser lexical_cast dans ce cas, mais je ne suis pas sûr si vous avez Boost.

#include <iostream> 
#include <vector> 
#include <boost/lexical_cast.hpp> 

int main(int argc, char* argv[]) 
{ 
    typedef std::vector<double>::size_type vectorSize; 

    if(argc < 2) 
    { 
     // err! The user didn't input anything. 
    } 

    vectorSize dataSize = boost::lexical_cast<vectorSize>(argv[1]); 
    std::vector<double> data(dataSize); 

    // use the vector here. 

    return 0; 
} 
+0

Merci l'homme! J'ai fini par utiliser des vecteurs après tout! Et a travaillé comme un charme! –

1

Non, cela ne peut pas être fait de cette façon. Vous devez utiliser l'allocation de mémoire dynamique (runtime) (new []). Pour effectuer une allocation de mémoire statique (à la compilation), le compilateur doit connaître la taille du bloc de mémoire au moment de la compilation.

2

1/Oui mais vous avez besoin d'une allocation de mémoire dynamique. Les paramètres de programme sont transmises en tant que argc et argv à la fonction principale

int main(int argc, char **argv) 

argc est le nombre de paramètres argv est la matrice de null résilié chaînes représentant ces arguments

argv [0] est le programme lui-même .

2/Vous pouvez utiliser la fonction variadique va_start & analogues, ou des fonctions impérieuses ou regrouper vos données dans une structure et passer que la fonction

+0

Merci, je vais vérifier la structure alternative, c'est probablement ce dont j'ai besoin ici! –

1

Je ne suis pas vraiment sûr de ce que vous essayez de faire avec maFonction, mais il semble que vous voulez regarder soit la création a struct ou passer un std::vector

+0

merci pour les liens, ils sont utiles et oui, je veux créer une structure .. –

0

Faire une classe (ou struct) ALLVARIABLES et transmettre cela.

Vous ne dites pas si vous voulez N défini lors de l'exécution ou de la compilation.Si vous voulez le définir au moment de la compilation, vous pouvez définir N comme argument de ligne de commande du compilateur.

Questions connexes