2014-08-27 5 views
1

Мне нужно определить глобальный массив в моем C++-коде, размер которого должен быть прочитан из файла. Я использую следующий кодОпределить глобальные переменные из ввода файла C++

#include<iostream> 
#include<string> 
#include<fstream> 
using namespace std; 

string inputfile = "input.txt"; 
ifstream infile(inputfile.c_str()); 
infile>>N; // N = size of Array 
int array[N]; 

// ------some code here----- 

int main(){ 
int N; 
cout << N<<endl; 
return 0; 
} 

Но если поместить 3 линии

string inputfile = "input.txt"; 
ifstream infile(inputfile.c_str()); 
infile>>N; // N = size of Array 

внутри основного контура этот код работает. К сожалению, я не могу помещать его в какую-либо функцию, потому что мне нужно инициализировать глобальный массив из переменной N.

Я спросил много людей и искал разные места, но я не могу понять это. Спасибо за вашу помощь.

+0

К сожалению .. какой цикл? Вы в цикле диспетчеризации событий win32 или что? –

+2

В качестве исполняемого кода правила _general_ должно оставаться внутри функции. Вот почему ваш первый код даже не компилируется. Объявите 'int * array' глобальным и распределите память, когда у вас есть значение для' N'. Лучше: вы на C++, затем используйте 'std :: vector'. –

+0

Вы не можете. Заявления должны идти в функции. Лучшее, что вы можете сделать, это использовать какой-то инструмент создания кода во время компиляции. –

ответ

6

Размер массива должен быть постоянным выражением, то есть известным во время компиляции.

Чтение значения из файла по существу является операцией динамической операцией, которая происходит во время выполнения.

Одним из вариантов является использование динамического распределения:

int array_size() 
{ 
    int n; 
    ifstream infile("input.txt"); 
    if (infile>>n) 
    return n; 
    else 
    throw std::runtime_error("Cannot read size from file"); 
} 
int* array = new int[array_size()]; 

Однако было бы лучше заменить массив с std::vector<int>, который может быть изменен динамически.

+1

+1 для вектора, который я также упомянул в комментариях. –

2

Используйте глобальный указатель. Определить

int* array; 

в глобальном пространстве перед основной процедурой. Затем позже, в петле или нет, скажем

array = new int[N]; 

, чтобы выделить ваш массив. Только не забудьте также сказать

delete[] array; 

, прежде чем выйти из вашего main или перераспределить array

1

int array[N]; - N должен быть знать во время компиляции.
Вместо этого используйте int array[]=new int[N]; /*some code using array*/ delete[] array;

int *array; 

int main(){ 
    ifstream infile("input.txt"); 
    unsigned N; 
    infile>>N; 
    array=new int[N]; 

    //using array... 

    delete[] array; //when no longer needed. 
        //don't use array after this line 
        //unless it's array=new int[] instruction 
       //or you know what you're doing. 
} 
+3

'int array [];' не является допустимым определением переменной, вы хотите 'int * array ; вместо этого –