#c
#c
Вопрос:
Проблема, с которой я сталкиваюсь, заключается в том, что при компиляции моего кода я получаю сообщение об ошибке (неинициализированная локальная переменная «Используемый номер параметра»
Для этого я использую visual studio 2017 на macbook air.
вот мой код:
#include "pch.h"
#include <iostream>
int runMenu(int optionNumber) {
std::cout << "Choose an option n";
std::cout << "1) Create Array n";
std::cout << "2) View Array n";
std::cout << "3) Add/Delete Values n";
std::cin >> optionNumber;
return(optionNumber);
};
int main()
{
int optionNumber;
int optionNum;
optionNum = runMenu(optionNumber);
std::cout << optionNum;
return(0);
}
Комментарии:
1. Какую часть сообщения компилятора вы не поняли?
2. на моем компьютере она работает нормально. Я запустил ее на терминале с помощью g . Можете ли вы попробовать запустить с помощью своего терминала и проверить, вызвана ли ошибка VS?
3. In
main()
неинициализирован,optionNumber
поэтому доступ к его значению приводит к неопределенному поведению. Затем передается ее значениеrunMenu()
, так что используется неинициализированная переменная (доступ к ее значению). Отсюда предупреждение компилятора. (Формально диагностировать поведение не требуется, поэтому большинство компиляторов все равно будут компилировать код).4. «не удается вернуть строку из функции» — если вы хотите вернуть a
string
, почему ваша функция записывается для возвратаint
, а неstring
для возврата?5. @rhn89 Только потому, что он работает нормально, не означает, что код правильный. Вполне возможно, что программы с неопределенным поведением будут работать должным образом. Также обратите внимание, что компиляторы очень редко ошибаются, особенно с такими базовыми вещами, как это, поэтому не обвиняйте компилятор, если вы не абсолютно уверены, вне всяких разумных сомнений, что ваш код правильный, в идеале после консультаций с другими.
Ответ №1:
int main() { int optionNumber; ^^^^^^^^^^^^^^^^
Здесь вы объявили локальную переменную. Вы не предоставили инициализатор. Поэтому локальное целое число имеет неопределенное значение. Если вы прочитаете неопределенное значение, поведение вашей программы будет неопределенным.
optionNum = runMenu(optionNumber);
^^^^^^^^^^^^
Здесь вы копируете переменную, значение которой не определено, в аргумент. Поэтому поведение программы не определено. К счастью, ваш компилятор заметил эту ошибку и предупредил об этом.
Наиболее тривиальное решение: инициализировать переменную:
int optionNumber = 42;
С другой стороны, вы можете немного подумать о том, что вы написали. Значение, которое вы передаете функции runMenu
, никогда не используется в функции. Любое переданное значение будет перезаписано тем, что извлекается из стандартного ввода. Аргумент совершенно бессмысленный. Вместо аргумента вы можете прочитать входные данные в локальную переменную:
int runMenu() {
// your std::cout stuff
int optionNumber;
std::cin >> optionNumber;