2015-09-13 6 views
0

Я пытаюсь получить пользовательский ввод и установить его как PUZZLESIZE, который используется int peg и row, но я получаю выражение, которое должно иметь постоянное значение.создание значения const на основе ввода пользователя

Как я могу получить ввод пользователя и установить его как глобальную константу, которую узнает структура Board?

int a; 
const int PIECE = a; 
const int PUZZLESIZE = ((PUZZLESIZE *(PUZZLESIZE+1)) /2); 

typedef struct Board { 


    int *row[PUZZLESIZE]; 
    int peg[PIECE]; 

    int lastmove; 
    struct Board *prevBoard; 

    int prow; 
    int pcol; 

} Board; 



int main() 

{ 
    scanf("%d",a); 

} 

Спасибо за любую помощь в пожилом

+3

Вы не можете превратить значение времени выполнения в константу времени компиляции. – chris

+0

Также обратите внимание, что значение 'const' не совпадает с константным выражением. Вам нужен последний для 'PUZZLESIZE', и вы не можете получить его во время выполнения. Но вы можете инициализировать 'const int' во время выполнения. – juanchopanza

+0

Возможный дубликат [C++: создание массива с размером, введенным пользователем] (http://stackoverflow.com/questions/28625465/c-creating-an-array-with-a-size-entered-by-the -user) –

ответ

0

Вы только определенной PIECE как (постоянной переменной) const:

const int PIECE = a; 

Таким образом, вы не можете изменить значение PIECE после запуск программы.

1

Изменение значения переменной const во время выполнения не представляется возможным.

0

Вам нужно немного переосмыслить, как ваша программа будет работать. Кроме того, поскольку вы используете C++, вы можете рассмотреть возможность использования языковых функций и библиотек, чтобы вы могли следовать рекомендациям, рекомендованным @Joren.

У вас есть 2 вариант:

Вариант 1: Убедитесь, PuzzleSize своих большие поддерживаемых головоломок.

Если вы сделаете это, все, что вам нужно сделать, это подтвердить ввод пользователя с этим размером. Кроме того, вам не нужно возиться с распределением памяти.

  • Простое решение
  • Потенциально может иметь большие сегменты неиспользуемой памяти

Вариант 2: Сделайте грести двойной указатель и использовать новый выделить свои ряды.

typedef struct Board 
{ 
    int **row; // int *row[PUZZLESIZE]; 
    .... 
} 

когда пользователь устанавливает вход вы можете подтвердить ввод данных и сделать это

int main() 
{ 
    scanf("%d",a); 
    row = new int*[a]; } 

Не забудьте взглянуть на свой C книги ++ и прочитать на сопзЬ, многомерных массивов, и новый.

Удачи!

+0

Пожалуйста, не рекомендуется использовать 'malloc' в программе на C++. Или 'scanf', или raw указатели, или' typedef struct'. – JorenHeit

+0

@ Joren, спасибо за комментарий. Я изменил с malloc на новый, поскольку вы правы своей не очень хорошей практикой, и это напрямую связано с вопросом. Кроме того, я добавил «отказ от ответственности». Я не пытался защищать или рекомендовать, просто пытаясь показать muffindho с кодом, который он предоставил.Я думаю, что интеллектуальные указатели, библиотеки stl, использование typedef и входных потоков не входят в объем вопроса, поскольку каждый из них является отдельной темой. –

Смежные вопросы