Решено. Не определяется ранее объявленная локальная переменная (C++)
Делаю простой калькулятор на C++, который будет складывать числа, который ввод пользователь. При компиляции программы в главном файле вызываются ошибки: "x: необъявленный идентификатор", "y: необъявленный идентификатор"
Вот код:
Главный файл (Calculator.cpp):
#include <iostream>
#include "enterx.h"
#include "entery.h"
#include "add.h"
int main()
{
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
return 0;
}
Первое слагаемое (X) (enterx.cpp):
#include <iostream>
int enterx(int x)
{
std::cout << "Enter X" << std::endl;
x = 0;
std::cin >> x;
std::cout << "X = " << x << std::endl;
return x;
}
enterx.h :
#ifndef ENTERX_H
#define ENTERX_H
int enterx(int x);
#endif
Со вторым слагаемым тоже самое, но x заменен на y
Код на складывание (add.cpp):
#include <iostream>
int add
{
#include "enterx.h"
#include "entery.h"
return x + y;
}
add.h :
#ifndef ADD_H
#define ADD_H
int add(int a, int b)
#endif
Ответы (2 шт):
Выполним ваши подстановки файлов...
CALCULATOR.CPP
int enterx(int x);
int entery(int y);
int add(int a, int b)
int main()
{
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
return 0;
}
ADD.CPP
int add(int a, int b)
{
int enterx(int x);
int entery(int y);
return x + y;
}
ENTERX.CPP
int enterx(int x)
{
std::cout << "Enter X" << std::endl;
x = 0;
std::cin >> x;
std::cout << "X = " << x << std::endl;
return x;
}
А теперь посмотрите сами и скажите - такой код можно скомпилировать?
Еще куда ни шло компилируем enterx.cpp, но add.cpp? Где не объявлены никакие переменные x или y, но вы их суммируете? Или calculator.cpp? В котором вообще непонятно что...
Нет-нет, что Вы, это не так работает... #include это директива препроцессора. Простыми словами это значит, что на момент исполнения программы этой фигни с решоткой не будет существовать. Перед тем как начать компилировать Вашу программу, специальная штуковина посмотрит на такие штуковины и изменит Ваш код. В данной ситуации вместо этой штуковины будут все остальные штуковины из файла. То есть он как будто возьмет код оттуда и вставит вместо этой штуковины. Как то так...
int add(int a, int b)
{
#include "enterx.h"
#include "entery.h"
return x + y;
}
Давайте взглягем не Вашу программу так, будто вы хотите ее скомпилировать... Нет, испольнить!
int main()
{
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
return 0;
}
Ничего необычного, мы как всегда начинаем исполнение любой программы с этой проклятой функции, идем дальше...
int main()
{
Ого, надо разобрать по подробней...
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
std::cout- Да, знаем мы таких,iostreamчто-то про него говорил<<- Ну тут понятно"The sum of your numbers is "- Строка как строка...add(x, y)- А вот тут давайте еще подробней...add- Была такая, подключалась вadd.hx, y- Вот про этих пасажиров я ничего не знаю... С меня хватит!
Примерно так же работает Ваш компилятор. Где вы объявили x и y? Правильно, нигде.
Рабочий пример:
#include <iostream>
int enter(char c)
{
std::cout << "Enter " << c << std::endl;
int x;
std::cin >> x;
std::cout << c << " = " << x << std::endl;
return x;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
int x = enter('X');
int y = enter('Y');
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
system("pause");
return 0;
}
Давайте разберемся какого черта:
Ну ладно, это мы уже видели
int main()
{
int x = enter('X');
- Создадим переменную типа
intс именемxи сразу же зададим ей значение... - Из функции
enter... еще и передадим туда 'X'... Ну ладно...
Вроде бы все складывается, функция ждет, чтобы ей передали символ c, как мы знаем передали туда 'X'
int enter(char c)
{
Окей, ничего странного, выводим "Enter " и значение c(в нашем случае 'X')
std::cout << "Enter " << c << std::endl;
Создадим числовую переменную x, окей
int x;
Подождем пока юзер чет нам сбросит и попробуем записать это в x.
std::cin >> x;
Покажем чего мы там наполучали от него
std::cout << c << " = " << x << std::endl;
И соответственно вернем результат.
return x;
И так, добро пожаловать в прошлое, пройдя целый путь по огромной функции enter мы смогли ее выполнить и узнали, что она вернет нам значение, которое отправит пользователь, теперь в переменной x будет то самое значение...
int x = enter('X');
- Создадим переменную типа
intс именем... Стоп, это уже было, просто параметр поменялся. Произойдет все тоже самое, что и в прошлой строчке, просто во время ввода пользователя он увидит на экране буквуYвместоXи результат вернется в переменнуюy
int y = enter('Y');
В прошлый раз мы психонули именно на этой строчке, в этот раз у нас уже существуют и x и y, так что можем ее выполнить и увидеть то, что вы хотели увидеть в самом начале.
std::cout << "The sum of your numbers is " << add(x, y) << std::endl;
Просто не будет завершать программу, пока пользователь не нажмет любую кнопку, чтобы консоль/терминал не закрывались сразу, а вы могли насладиться своей программой. Вы сможете любоваться ей пока продумываете свой план по продаже Вашей программы в AppStore, GooglePlay, Steam и т.д. Мелочь, а приятно :)
system("pause");