Ошибка exit was not declared in this scope

Насчёт гугла я не стал бы рекомендовать. За то, что там выдаст гугл — не отвечает никто. Но есть официальный источник информации — man система.

По первому вопросу. Смотрим man 3 exit. Там в третьей строке написано:

#include <stdlib.h>

И не надо ни у какого гугла спрашивать — там, зачастую,содержатся совершенно противоречивые советы. Подсказка: в команде man второй парамерт означает:

  1. Команда Shell
  2. Системный вызов (обращение к ядру ОС)
  3. Вызов функции из стандартной библиотеки.

По второму вопросу: «что вернёт stat() на каталог?». С точки зрения ФС наиболее распространённых типов (EXT3, EXT4), каталог — это самый обычный файл, в котором содержатся записи определённой структуры. Что бы понять, как отличить регулярный файл от каталога, опять таки смотрим man 2 stat. Там даже пример приведён:

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
     /* Handle regular file */
}

Ну и третий вопрос — про ‘.’ и ‘..’. С точки зрения ФС это просто обозначения (синонимы) для реальных каталогов — текущего и родительского. Поэтому их обработка ничем не отличается от обработки каталогов, заданных явно.

Are you trying to exit a program but getting a annoying «Error Exit Was Not Declared in This Scope» every time? You’ve come to the right place! In this document, you’ll find instructions for resolving this error.

This error message appears when a program attempts to exit but it was not declared earlier in the program. When this happens, the compiler cannot find the name «exit», and so it returns the error.

How To Resolve «Error Exit Was Not Declared in This Scope»

Step 1

The first step to resolving this error is to make sure that you have declared the name «exit» in your program. To do this, add the following line of code to your program:

int exit();

Step 2

The next step is to call the «exit» function in your program. This should be done just before your program ends. The syntax for calling this function is as follows:

exit(0);

Step 3

Finally, make sure you are linking the «exit» function to your program. This can be done by adding the following line of code:

#include <stdlib.h>

If you have completed all of the above steps, you should no longer be getting the «Error Exit Was Not Declared in This Scope» error message.

FAQ

Q: How do I know if I have declared the name «exit» in my program?

A: You can check whether or not the name «exit» has been declared in your program by looking for the line of code that reads int exit();. If you cannot find this line, then you will need to add it in order to declare the name.

Q: Do I need to link the «exit» function in order to use it?

A: Yes. You must link the «exit» function to your program by adding the line of code #include <stdlib.h> in order to use the «exit» function.

Sources

  • Error: exit was not declared in this scope
  • How to Handle exit() Declarations

Forum

  • Beginners
  • Windows Programming
  • UNIX/Linux Programming
  • General C++ Programming
  • Lounge
  • Jobs
  • Forum
  • General C++ Programming
  • Stacks: [Error] ‘exit’ was not declared

Stacks: [Error] ‘exit’ was not declared in this scope.

So our professor asked us to make a project where we will need three files (two .cpp files and one .h file) This is regarding our topic about Stacks. When I compile the project in Dev C++, I only get one error which is the [Error] ‘exit’ was not declared in this scope. Can anyone please tell me how to solve this? I’m really close letting this program run. Only the exit isn’t working. Would appreciate your help. Thank you!

Here’s the code for Stacks.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
#ifndef STACK 
#define STACK

const int STACK_CAPACITY = 128;
typedef int StackElement;

class Stack 
{
	public: 
	Stack(); 
	bool empty() const; 
	void push(const StackElement &value);
	void display(ostream &out) const; 
	StackElement top() const; 
	void pop();
	
	private: 
	StackElement myArray[STACK_CAPACITY]; 
	int myTop;

};

#endif 

Here’s the code for Stacks.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream> 
using namespace std;

#include "Stack.h"

Stack::Stack(){
	myTop--; 
}

bool Stack::empty() const 
{
	return (myTop == -1);
}

void Stack::push(const StackElement &value) 
{
		if (myTop < STACK_CAPACITY - 1)	
		{
			++myTop;
			myArray[myTop] - value;
		}
		else
		{
			cerr << "*** Stack full -- can't add new value ***n"
				    "Must increase value of STACK_CAPACITY in Stack.hn";
			exit(1);
		}
}

void Stack::display(ostream &out) const 
{
	for (int i = myTop; i >= 0; i--) 
		cout << myArray[i] << endl;
}

StackElement Stack::top() const 
{
	if ( !empty() )
		return (myArray[myTop]); 
	else
	{
		cerr << "*** Stack is empty -- returning garbage value ***n"; 
		StackElement garbage; return garbage;

	}
}

void Stack::pop() 
{
	if ( !empty() )
		myTop--; 
	else
		cerr << "*** Stack is empty -- can't remove a value ***n";		
}

Here’s the code for Driver.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream> 
using namespace std;

#include "Stack.h"

int main()
{
	Stack s; 
	cout « "Stack created. Empty?"« boolalpha « s.empty() « endl;
	
	cout « "How many elements to add to the stack? "; 
	int numItems; 
	cin » numItems;
	for (int i = 1; <=numItems; i++) 
		s.push(i);
	
	cout « "Stack contents:n"; 
	s.display(cout);
	
	cout « "Stack empty? " « s.empty() « endl;
	
	cout « "Top value: " « s.top() « endl;

	while (!s.empty()) 
	{
		cout « "Popping " « s.top() « endl; 
		s.pop();
	}

	cout « "Stack empty? " « s.empty() « endl; 
	cout « "Top value: " « s.top() « endl; 
	cout « "Trying to pop:" « endl; 
	s.pop();
}

exit() is declared in the header <cstdlib> (or <stdlib.h> for C programs). You just need #include <cstdlib> in Stacks.cpp.

Also, If you use Dev-C++, please make sure it is the Orwell version. Earlier versions are considered obsolete. http://orwelldevcpp.blogspot.com/

Topic archived. No new replies allowed.

Member Avatar

13 Years Ago

The cstdlib header contains the definition for the exit function as csurfer said, however up until recently this header was generally included by dependency — often unnecessarily — by other headers. So you are likely to see tutorials and books that rely on this — and other — header dependencies that have now been cleaned up.

For example you may just #include <iostream> to use the exit function in gcc 3.4 because iostream includes cstdlib however in gcc 4.3 this dependency has been removed so you need to #include <cstdlib> to utilise it.

SergeyKagen

4 / 5 / 2

Регистрация: 02.04.2018

Сообщений: 409

1

19.04.2019, 22:16. Показов 144073. Ответов 14

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Простой код, но Arduino IDE напрочь отказывается принимать переменные. Что за глюк или я что-то неправильно делаю?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup() {
  
  Serial.begin(9600);
  int count = 0;
  pinMode(7, INPUT);
  pinMode(13, OUTPUT);
 
}
 
void loop() {
 
  if( digitalRead(7) == HIGH ){ 
    
    while(1){ 
      delayMicroseconds(2); 
      count++;  
      if( digitalRead(7) == LOW ){ Serial.println(count); count = 0; break; }
      }
    }  
}

ошибка при компиляции «‘count’ was not declared in this scope», что не так?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

19.04.2019, 22:16

14

marat_miaki

513 / 405 / 188

Регистрация: 08.04.2013

Сообщений: 1,731

19.04.2019, 23:26

2

Лучший ответ Сообщение было отмечено SergeyKagen как решение

Решение

C++
1
2
3
4
5
6
7
8
  int count = 0; //глобальная переменная
 
  void setup() {
   Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(13, OUTPUT);
 
}



1



Lavad

0 / 0 / 0

Регистрация: 03.10.2015

Сообщений: 25

14.09.2019, 22:33

3

Доброго времени суток!
У меня то же сообщение, но на функцию :-(
Создал функцию (за пределами setup и loop), которая только принимает вызов, ничего не возвращает:

C++
1
2
3
4
5
void myDispay(byte x, byte y, char str) {
  lcd.setCursor(x, y);
  lcd.print(temp, 1);   // выводим данные, с точностью до 1 знака после запятой
  lcd.print(str);   // выводим писанину
  }

В loop() делаю вызов:

C++
1
myDisplay(0,0,"C");

При компиляции выделяется этот вызов, с сообщением:

‘myDisplay’ was not declared in this scope

Замучился искать инфу о декларации/обьявлении функции. Везде, что находил, понимал одно: если ты вызываешь функцию, это и есть обьявление функции
Что делаю не так? В чем моя ошибка? Помогите, пожалуйста.

P.S. Код, что использовал в качестве функции, работоспособен. Раньше находился в loop(). Скетч постепенно разрастается, много однотипных обращений к дисплею…



0



Эксперт С++

8385 / 6147 / 615

Регистрация: 10.12.2010

Сообщений: 28,683

Записей в блоге: 30

14.09.2019, 23:57

4

Цитата
Сообщение от Lavad
Посмотреть сообщение

Создал функцию (за пределами setup и loop),

Перевидите на нормальный язык.
Какие еще пределы?

В другом файле что ли?

Добавлено через 1 минуту

Цитата
Сообщение от Lavad
Посмотреть сообщение

Замучился искать инфу о декларации/обьявлении функции. Везде, что находил, понимал одно: если ты вызываешь функцию, это и есть обьявление функции
Что делаю не так? В чем моя ошибка? Помогите, пожалуйста

Читать учебники по С++ не пробовали?

https://metanit.com/cpp/tutorial/3.1.php
http://cppstudio.com/post/5291/

Специфика Arduino лишь отличается тем что пред объявления не всегда нужны.

Добавлено через 7 минут
Кроме того иногда потеряй скобок {} приводят к таким ошибкам.



0



ValeryS

Модератор

Эксперт по электронике

8811 / 6593 / 896

Регистрация: 14.02.2011

Сообщений: 23,188

15.09.2019, 00:09

5

Цитата
Сообщение от Lavad
Посмотреть сообщение

Везде, что находил, понимал одно: если ты вызываешь функцию, это и есть обьявление функции

это где ж такое написано?
функцию нужно объявить перед первым вызовом, сиречь сверху
можно и просто декларировать сверху

C++
1
void myDispay(byte x, byte y, char str);

а объявить уже в удобном месте



0



0 / 0 / 0

Регистрация: 03.10.2015

Сообщений: 25

15.09.2019, 00:48

6

Неделю назад ВПЕРВЫЕ включил Arduino Uno.
Задолго до этого писал программы под Windows (БейсикВизуал) и AVR (Basic, немного Assembler). Т.е. имеется некоторое представление об объявлении переменных, функций,… От Си всегда держался как можно дальше. Это первая и последняя причина «нечитания» книг по Си. За неделю экспериментов на Arduino мнение об этом пока не изменилось — легче вернуться к Ассму, чем копаться в Си.

Написал на том же языке, что и читал на всяких форумах и справочниках по Arduino :-). За пределами этих функций — значит не внутри них.

Обе приведенных Вами ссылок просмотрел, проверил в скетче… В итоге вылезла другая ошибка:
function ‘void myDisplay(byte, byte, char)’ is initialized like a variable

void myDisplay(byte x, byte y, char str) тоже пробовал. Та же ошибка.

Что не так на этот раз? :-(



0



Модератор

Эксперт по электронике

8811 / 6593 / 896

Регистрация: 14.02.2011

Сообщений: 23,188

15.09.2019, 01:26

7

Цитата
Сообщение от Lavad
Посмотреть сообщение

В итоге вылезла другая ошибка:
function ‘void myDisplay(byte, byte, char)’ is initialized like a variable

точку с запятой в конце поставил?



1



Lavad

0 / 0 / 0

Регистрация: 03.10.2015

Сообщений: 25

15.09.2019, 08:46

8

Вот скетч. Проще некуда.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <PCD8544.h>
 
float temp = 0;
static PCD8544 lcd;   // даем имя подключенному дисплею (lcd)
static const byte Lm35Pin = 14;   // аналоговый пин (A0) Arduino, к которому подключен LM35
 
//void myDisplay() = 0;
//void myDisplay(byte, byte, char, float) = 0;
//void myDisplay(byte x, byte y, char str, float temp) = 0;
 
void myDispay(byte x, byte y, char str, float temp) {
  lcd.setCursor(x, y);   // начиная с (x,y)...
  lcd.print(temp, 1);   // выводим temp
  lcd.print(str);   // выводим писанину
}
 
void setup() {
  lcd.begin(84, 48);   // инициализируем дисплей
  analogReference(INTERNAL);   // подключаем внутренний ИОН на 1.1V
}
 
void loop() {
  float temp = analogRead(Lm35Pin) / 9.31;  // подсчитываем температуру (в Цельсиях)...
  myDisplay(0, 0, "C", temp);   // отправляем данные на экран
  delay(500);   // ждем 500 мсек
}

Любое из трех так называемых «объявлений» (строки 7…9) выдает одну и ту же ошибку — я пытаюсь объявить функцию как переменную.

Добавлено через 9 минут
Попробовал так:

C++
1
void myDisplay(byte x, byte y, char str, float temp);

Компилятор задумался (я успел обрадоваться), но, зараза :-), он снова поставил свой автограф :-)

undefined reference to `myDisplay(unsigned char, unsigned char, char, float)

На этот раз он пожаловался на строку вызова функции.

Добавлено через 34 минуты
Когда что-то новое затягивает, забываешь о нормальном отдыхе, теряешь концентрацию…
Нашел ошибку. Чистейшая грамматика

C++
1
void myDispay(byte x,...

Dispay вместо Display

Добавлено через 8 минут
ValeryS, благодарю за попытку помощи!



0



ValeryS

Модератор

Эксперт по электронике

8811 / 6593 / 896

Регистрация: 14.02.2011

Сообщений: 23,188

15.09.2019, 10:36

9

Цитата
Сообщение от Lavad
Посмотреть сообщение

void myDisplay(byte, byte, char, float) = 0;

вот так не надо делать(приравнивать функцию к нулю)
так в классическом С++ объявляют чисто виртуальные функции, и класс в котором объявлена чисто виртуальная функция становится абстрактным. Означает что у функции нет реализации и в дочернем классе нужно обязательно реализовать функцию. А из абстрактного класса нельзя создать объект

Добавлено через 5 минут

Цитата
Сообщение от Lavad
Посмотреть сообщение

void myDispay(byte x, byte y, char str, float temp)

Цитата
Сообщение от Lavad
Посмотреть сообщение

myDisplay(0, 0, «C», temp);

просишь чтобы функция принимала символ char str, а передаешь строку "C"
или передавай символ

C++
1
myDisplay(0, 0, 'C', temp);

или проси передавать строку, например так

C++
1
void myDispay(byte x, byte y, char * str, float temp);



1



Avazart

Эксперт С++

8385 / 6147 / 615

Регистрация: 10.12.2010

Сообщений: 28,683

Записей в блоге: 30

15.09.2019, 12:02

10

Кроме того наверное лучше так:

C++
1
2
3
4
5
6
7
8
void myDispay(PCD8544& lcd,byte x, byte y, char str, float temp) 
{
  lcd.setCursor(x, y);   // начиная с (x,y)...
  lcd.print(temp, 1);   // выводим temp
  lcd.print(str);   // выводим писанину
}
 
myDisplay(lcd,0, 0, 'C', temp);

Тогда можно будет вынести ф-цию в отдельный файл/модуль.



1



locm

15.09.2019, 21:07

Не по теме:

Цитата
Сообщение от Lavad
Посмотреть сообщение

Arduino Uno.

Цитата
Сообщение от Lavad
Посмотреть сообщение

AVR (Basic, немного Assembler).

Arduino Uno это AVR, для которого можете писать на бейсике или ассемблере.



0



Avazart

15.09.2019, 21:21

Не по теме:

Цитата
Сообщение от locm
Посмотреть сообщение

Arduino Uno это AVR, для которого можете писать на бейсике или ассемблере.

Но лучше не надо …



0



Lavad

0 / 0 / 0

Регистрация: 03.10.2015

Сообщений: 25

16.09.2019, 12:12

13

Цитата
Сообщение от ValeryS
Посмотреть сообщение

это где ж такое написано?
функцию нужно объявить перед первым вызовом, сиречь сверху
можно и просто декларировать сверху
а объявить уже в удобном месте

Оказалось, что я верно понял чтиво по справочникам: если ты вызываешь функцию, это и есть обьявление функции. А сама функция может располагаться по скетчу в ЛЮБОМ месте (но за пределами setup, loop и любых других функций). И больше никаких специфических строк.

Цитата
Сообщение от ValeryS
Посмотреть сообщение

вот так не надо делать(приравнивать функцию к нулю)…

Методом проб и ошибок уже понял :-).

Цитата
Сообщение от ValeryS
Посмотреть сообщение

или передавай символ… 'C'

Если передаю в одинарных кавычках

более одного

символа, а функция ждет как char str, то выводятся на экран только самый правый из отправленных символов. Отправил «абв», а выводится «в».
Выкрутился, прописав в функции char str[], а символы отправляю через двойные кавычки.

Цитата
Сообщение от ValeryS
Посмотреть сообщение

или проси передавать строку, например так… char * str

Буквально вчера попалось это в справочнике, но как-то не дошло, что тоже мой вариант :-).

Цитата
Сообщение от Avazart
Посмотреть сообщение

Кроме того наверное лучше так:

C++
1
void myDispay(PCD8544& lcd,byte x, byte y, char str, float temp) {...}

Тогда можно будет вынести ф-цию в отдельный файл/модуль.

Благодарю за совет! Как-нибудь проверю…



0



Эксперт С++

8385 / 6147 / 615

Регистрация: 10.12.2010

Сообщений: 28,683

Записей в блоге: 30

16.09.2019, 12:54

14

Цитата
Сообщение от Lavad
Посмотреть сообщение

Оказалось, что я верно понял чтиво по справочникам: если ты вызываешь функцию, это и есть обьявление функции

Нафиг выкиньте эти справочники.
Почитайте мои ссылки.



0



0 / 0 / 0

Регистрация: 03.10.2015

Сообщений: 25

16.09.2019, 13:00

15

Ссылки Ваши добавлены в закладки. Время от времени заглядываю.
Но теория для меня — всего лишь набор понятий. Я же высказался после практической проверки. А как я понял, так оно и работает :-)



0



Возможно, вам также будет интересно:

  • Ошибка ets мерседес что это
  • Ошибка exit status 1 при компиляции для плат uno
  • Ошибка ethernet контроллера windows 10
  • Ошибка exit fatal error cannot initialize
  • Ошибка eth на частотнике ig5a

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии