не удается вернуть строку из функции

#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;