Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 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. Показов 11456. Ответов 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
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,097
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
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,097
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
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,097
24.10.2020, 21:57
Если код выложен полностью, включая хедеры и прочее, не содержит синтаксических опечаток (логические никто не отменял), значит на момент выкладывания он компилировался и работал.
Будет ли proof-of-concept работать всегда и везде? Ну, думаю, даже ты догадываешься.
Буду ли я поддерживать одноразовую поделку, которая за год никому не пригодилась? Очевидно, нет.
Если хочешь ее для чего-то использовать - допиливай и используй. Я, как автор, великодушно даю тебе согласие на использование данного кода без ограничений и без необходимости упоминания авторства.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,097
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
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru