Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
123
36 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 221

Error: 'system' was not declared in this scope

24.09.2019, 11:47. Показов 11004. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как я понял параметры argv[] это консольные команды которые добавляются к имени файла в командой строке.

Можно ли способом описаным у меня ниже назначить команде определенные действия при вызове программы с этой командой?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
 
void text()
{
     cout << "старт" << endl;
}
 
int main(int argc, char* argv[])
{
    if (argc > 0)
        {
                 if (argv[1]="start")
       {
                       text;
       }
        }
       return 0;
system("pause");
}
Да еще ругается на system(pause) в конце главного цикла, что не найден хедер stdafx.h . Код пишу в CodeBlocks и в ней пишет что не знает такого хедера как "stdafx.h". Вообще погуглил и узнал что для этото нужна студия VS. Но в бесплатной версии студии этого хедера (и других связаным с ним) нет.

Мне нужно чтобы программа не выключалась после работы. В делфи для этого использовал read;. А как без system(pause) или каким-то другим способом оставить программу после выполнения?

Если че язык С++ не знаю вобще, только изучаю и многое непонятно -_-.

Добавлено через 6 минут
Проблема с pause решена. Натупил по невнимательности. Там ниже кода вообще бред написан.

Добавлено через 1 минуту
А нет всетаки пишет:
error: 'system' was not declared in this scope
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2019, 11:47
Ответы с готовыми решениями:

'arr' was not declared in this scope 'sum' was not declared in this scope такие вот ошибки.(
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main () { setlocale(LC_ALL, &quot;rus&quot;); ...

Не компилируется приложение: 'system' was not declared in this scope
Привет всем, теперь на форуме на одного глупого первокурсника больше) Немогу откомпилировать, хотя в универе тотже код работает...

error: . was not declared in this scope
Здравстуйте! Недавно начал изучать С++. Нужно написать программу вычисления периметра треугольника через функцию. В коде возникла ошибка:...

68
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.10.2019, 13:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Туда где я "ни бум-бум" я и не лезу, в отличие от тебя.
оно и видно.

ты хотя бы выделение памяти можешь записать без ошибки?

ты зачем ловишь bad_alloc?
с какой целью?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ваш вариант более правильный.
твой вариант вообще не рабочий.


 Комментарий модератора 
Уважаемый, hoggy, убедительная просьба не переходить на личности в споре. Заранее благодарен за понимание и сотрудничество.
0
01.10.2019, 14:06
 Комментарий модератора 
hoggy, COKPOWEHEU, а Вам не кажется, что пора Вашу занимательную беседу закончить? Или может мне помочь Вам это сделать?
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
01.10.2019, 14:12
Цитата Сообщение от hoggy Посмотреть сообщение
ты хотя бы выделение памяти можешь записать без ошибки?
Да, в отличие от тебя. Что и было продемонстрировано.
Цитата Сообщение от hoggy Посмотреть сообщение
ты зачем ловишь bad_alloc?
с какой целью?
А зачем он вообще существует, по-твоему?
Цитата Сообщение от hoggy Посмотреть сообщение
где я утверждал, что он стандартный?
Да как же ты надоел изворачиваться. Ляпнул какую-то чушь, а как ткнули носом что чушь - "я не так говорил, я не то имел в виду". На, держи:
Цитата Сообщение от hoggy Посмотреть сообщение
может быть два варианта:
1.
в нулевом аргументе хранится путь к модулю,
в остальных аргументах - собственно, аргументы команды.
2.
путь к модулю не был передан.
значит все аргументы - собственно, аргументы команды.
итак, ты берешь нулевой аргумент.
нормализуешь его.
запрашивает через системное апи путь к собственному модулю.
и сравниваешь. если равны - значит это первый кейс.
если нет - второй кейс.
дальше валидируешь собственно аргументы.
Цитата Сообщение от hoggy Посмотреть сообщение
реальность такова,
что если программист сам лично не напишет код,
который запишет путь к модулю нулевым аргументом,
то никто за него этого не сделает.
Цитата Сообщение от hoggy Посмотреть сообщение
ты реально задрал своей тупорылой манерой выдумывать за других людей.
Хватит истерить. Если не хочешь чтобы за тебя додумывали, формулируй свои мысли однозначно.
Цитата Сообщение от hoggy Посмотреть сообщение
твой вариант вообще не рабочий, крендель.
"мой вариант" - через malloc. И там есть проверка, и она работает.
А вот твой вариант, через new проверки не содержит вообще, следовательно нерабочий/небезопасный.
.
И еще раз предлагаю от пустопорожних оскорблений перейти к конкретике. Эти вопросы я уже задавал и все еще жду на них ответа:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
я это понимаю так: этот балбес считает,
что argv[0] всегда содержит имя исполняемого файла
как вообще ты мог понять это как то иначе?
А теперь не цепляемся к словам (поскольку ответ был "для новичка" а не ради спора).
Тебя не устраивает что в argv[0] хранится не только имя файла, а еще и путь к нему?
Тебя не устраивает редкое исключение, когда argc=0 и тогда argv[0]=NULL?
Тебя не устраивает существование идиотов, подменяющих argv[0] на свой мусор?
Тебя не устраивает что-то еще?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
код проверки argv[0] ты так и не привел. Получается, ты и сам не знаешь, как он должен выглядеть, раз не скопипастил откуда-нибудь и не написал с нуля. Так какой смысл позориться дальше и утверждать что это вот самая-самая важная проверка, без нее никуда.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Цитата Сообщение от hoggy Посмотреть сообщение
system редко используется,
просто потому, что у неё функционал слишком бедный.
она бесполезна даже для самых типичных задач.
пример типичной задачи:
есть родительский процесс (gui приложение)
из под него нужно запустить дочерний процесс.
какую нибудь консольную утилиту.
при этом утилита запускается без консольного окна.
необходимо дождаться окончания работы утилиты.
получить код возврата,
и заграбастать весь её вывод (stdout/stderr)
теперь покажи, как ты это сможешь оформить "в виде потоков",
или при помощи system.
решение через system.
...
Жду вашего решения. Естественно, оно должно быть максимально кроссплатформенным.
Не постесняюсь напомнить, что на аналогичные вопросы в мой адрес были даны исчерпывающие ответы с рабочими примерами кода.

Добавлено через 5 минут
Lord_Voodoo, Если не возражаете, я бы хотел дождаться ответов на вопросы по существу. Детсадовские выкрики про "неумение читать" не волнуют.
Но hoggy высказал сомнение в возможности перенаправления ввода-вывода через system. Значит он знает более удобный способ. Вот только рассказать про него почему-то не хочет.
И проверка argv[0]. Утверждалось, что сдвиг аргументов на один - типичная ошибка, встречающаяся чаще ошибки выделения памяти, значит ее надо проверять. Опять же, простого кроссплатформенного способа сделать это я не знаю.
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
01.10.2019, 14:20
COKPOWEHEU, если Вы будете вести свои беседы в пределах правил форума, меня тут больше не увидите. И лучше, чтобы я тут больше не появлялся, у меня китайских предупреждений не запасено ни для кого. Без переходов на личности - единственная моя убедительная просьба. hoggy, Вас это касается тоже. В любом споре можно найти более достойную аргументацию для любого оппонента.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.10.2020, 04:42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще решение через system.
твой код не работает.

windows 10, msvc2019-debug-x64-static

зависание на строке:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
res = system(cmd);
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
24.10.2020, 14:00
Ловите некрофила! Он ГОД искал на какой же комбинации условий код сломается.
Поскольку win10 и тем более msvc у меня нет и надеюсь не будет, проверять тебе придется самому. Первое что приходит в голову - команда ждет какого-то ввода. Можно проверить по списку процессов начала ли выполняться вызываемая команда или закончилась. Можно пустить ее в отдельном потоке.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.10.2020, 19:31
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ловите некрофила! Он ГОД искал на какой же комбинации условий код сломается.
ловите бракодела.

у тебя какая то шизоидная манера читать текст,
и видеть в нем что-то своё,
чего в нём на самом деле нет.

фраза:
Цитата Сообщение от hoggy Посмотреть сообщение
твой код не работает.
предполагает твой код, а не какие то неведомые комбинации.
ты запостил код, и он - не работает.

(пример получения stdour/stderr запускаемого процесса)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Первое что приходит в голову - команда ждет какого-то ввода.
первое, что тебе должно было прийти тебе в голову: ты где-то накосячил.

потому что в твоём коде фигурирует команда dir,
которая вообще не использует ввод для своей работы.

ты заявлял, будто бы это - кроссплатформенное решение.

на самом же деле:

1. твой код вообще не взлетает без напильника.
нужно править ошибки компиляции.
причем у gcc вылезли одни ошибки, а у cl - другие.

2.
после исправления ошибок компиляции.

линукс версия:
ошибка в логике работы.
не правильно забирает результирующую информацию.

виндовс версия:
зависание.

итого:
ты выложил непроверенное решение.

ты даже не проверил: а компилируется ли оно вообще?
хотя бы gcc.

про винду я вообще молчу)
ты её похоже, только на картинках видел,
кроссплатформенный ты наш.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
24.10.2020, 21:57
Если код выложен полностью, включая хедеры и прочее, не содержит синтаксических опечаток (логические никто не отменял), значит на момент выкладывания он компилировался и работал.
Будет ли proof-of-concept работать всегда и везде? Ну, думаю, даже ты догадываешься.
Буду ли я поддерживать одноразовую поделку, которая за год никому не пригодилась? Очевидно, нет.
Если хочешь ее для чего-то использовать - допиливай и используй. Я, как автор, великодушно даю тебе согласие на использование данного кода без ограничений и без необходимости упоминания авторства.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
25.10.2020, 01:07
Еще раз посмотрел код: похоже, там действительно есть ошибка: в случае неуспешного копирования stdout, stderr они потом неправильно восстанавливаются. Вот патч исправлений:
Code
1
2
3
4
5
6
34,35c34,35
<   dup2(bkp[1], fileno(stdout));
<   dup2(bkp[2], fileno(stderr));
---
>   dup2(bkp[0], fileno(stdout));
>   dup2(bkp[1], fileno(stderr));
Но, поскольку это нештатная ситуация, на работоспособность программы это никак не влияет:
Кликните здесь для просмотра всего текста

лог снимался до "патча", поэтому компилятор честно показывает сомнительное место
Code
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
$ cat main.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
#ifdef WIN32
  #include <fcntl.h>
  int pipe(int *files){return _pipe(files, 4096, O_BINARY);}
#endif
 
int call(char *cmd, FILE **fout, FILE **ferr){
  int outpipe[2], errpipe[2], bkp[2];
  int res;
  //создаем каналы
  if(pipe(outpipe)!= 0)goto call_err;
  if(pipe(errpipe)!= 0)goto call_err1;
  //бэкапим stdio
  bkp[0] = dup(fileno(stdout));
  bkp[1] = dup(fileno(stderr));
  if((bkp[0]==-1) || (bkp[1]==-1))goto call_err2;
  //отображаем созданные каналы на stdio
  if(dup2(outpipe[1], fileno(stdout))==-1)goto call_err2;
  if(dup2(errpipe[1], fileno(stderr))==-1)goto call_err2;
  
  res = system(cmd);
  
  //восстанавливаем stdio из бэкапа
  dup2(bkp[0], fileno(stdout));
  dup2(bkp[1], fileno(stderr));
  //преобразуем из идентификаторов в FILE
  *fout= fdopen(outpipe[0], "r");
  *ferr= fdopen(errpipe[0], "r");
  return res;
call_err2:
  dup2(bkp[1], fileno(stdout));
  dup2(bkp[2], fileno(stderr));
call_err1:
  close(errpipe[0]);
call_err:
  *fout=NULL; *ferr=NULL;
  return -1;
}
 
int main(){
  char str[100];
  FILE *fout, *ferr;
  
  call("dir", &fout, &ferr);
  
  fgets(str, 99, fout);
  printf("[%s]\n", str);
  
  fclose(fout);
  fclose(ferr);
}
 
$ gcc main.c -Wall -Wextra -Wpedantic -Os -gdwarf
main.c: In function ‘call’:
main.c:35:3: warning: ‘bkp[2]’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   35 |   dup2(bkp[2], fileno(stderr));
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
$ ./a.out 
[1.txt            lua.lua          wine32
]
 
$ i686-w64-mingw32-gcc main.c -Wall -Wextra -Wpedantic -Os -gdwarf 
main.c: In function ‘call’:
main.c:35:3: warning: array subscript 2 is above array bounds of ‘int[2][-Warray-bounds]
   35 |   dup2(bkp[2], fileno(stderr));
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:11:31: note: while referencing ‘bkp’
   11 |   int outpipe[2], errpipe[2], bkp[2];
      |                               ^~~
 
$ wine a.exe 
0016:err:ntoskrnl:ZwLoadDriver failed to create driver L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\NDIS": 00000001
0022:err:ntoskrnl:ZwLoadDriver failed to create driver L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\wineusb": c0000142
wine: Read access denied for device L"\\??\\Z:\\", FS volume label and serial are not available.
[Том на диске Z не имеет метки.
]

Даже запустил на виртуалке win7. Как и следовало ожидать, результат тот же.
Если же какой-то мазохист предпочитает пользоваться компилятором, который плевал на стандарт языка (да, речь именно про msvs), то это его, мазохиста, проблемы. На всякий случай вот собранный экзешник
Вложения
Тип файла: zip a.exe.zip (81.7 Кб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2020, 01:07

[Error] 'm' was not declared in this scope
почему программа не видит m,h??? пишет ошибку 'm' was not declared in this scope 'h' was not declared in this scope #include...

[Error] 'k' was not declared in this scope
#include &lt;iostream&gt; using namespace std; int main() { { int k; char z = { &quot; x x ...

[Error] 'If' was not declared in this scope
Недавно начал изучать Си++. Написал программу почти так же, как в примере из книги. #include &lt;iostream&gt; #include...

Ошибка: [Error] 'x' was not declared in this scope
Не могу понять в чём ошибка. Компилятор пишет что в строке cin&gt;&gt;x.name&gt;&gt;x.surname&gt;&gt;x.number; . Ошибка: 'x' was not declared in this scope....

Error 'setprecision' was not declared in this scope
Глупый скела снова здесь! И так, что я опять сделал не так?)) Ошибка : error 'setprecision' was not declared in this scope #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
69
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru