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

Error: 'system' was not declared in this scope

24.09.2019, 11:47. Показов 10522. Ответов 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
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.09.2019, 16:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз: какая разница, использует ли программа графическую библиотеку? Почему вы вообще в качестве критерия выбрали наличие именно графической библиотеки?
смотрел со своей колокольни.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Передача имени программы в argv[0] - задача операционной системы
именно так

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
нарушают это соглашение крайне редко и по каким-то своим поводам
с этим то же соглашусь.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.09.2019, 18:24
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При типичном использовании такого не наблюдается.
типичное использование программистами - это два основных кейса:
1.
родительский процесс запускает дочерний.
и здесь важно не забывать записывать путь к модулю
в нулевой аргумент дочернего процесса.

2.
дочерний процесс был запущен из под родительского.
и здесь важно понимать:
не факт, что нулевой аргумент хранит путь к модулю.
и что бы не полагаться на корректность вызывающей стороны,
нужно использовать специализированное апи.

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

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но вы пишете в ЕГО тему, а не в свою.
это - публичный форум.
можно писать чушь.
можно акцентрировать на этом внимание.
дабы не ввели ЕГО в заблуждение бесы-балбесы.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну да, фраза "невозможно встретить акулу в Сахаре" тоже не соответствует истине, строго говоря (мало ли кого и куда привезли). Вот только будете ли вы готовиться к нападению акулы в пустыне?
я бы воспользовался специализированным сервисом,
который гарантирует мне безопасность.

а вообще аналогия не уместна.
программный код либо инвариантен,
либо нет.

Добавлено через 22 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть при сильном желании его можно нарушить. Вот только он не уточняет, что нарушают это соглашение крайне редко и по каким-то своим поводам.
Кстати, с ходу даже не могу придумать кому и зачем это может понадобиться...
на самом деле элементарно ничайно допустить такую ошибку.
например, нужно запустить программу.
казалось бы, фигня делов: CreateProcess(path2programm, params, ...);
и всё, приплыли.
все аргументы смещены влево.
нулевой аргумент хранит не путь к модулю,
а первый аргумент командной строки.

в моей практике был один случай,
когда один паренёк будучи ещё новичком,
запустил вот так одну консольную утилиту.
утилита полезла в базу данных,
и слегка набедокурила.
1
123
36 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 215
25.09.2019, 02:34  [ТС]
Ну вот у меня работает только если

C++
1
2
3
    if (argc > 1)
        {
                 if( strcmp( argv[1], "start" )==0 )

Получается в первой строке массива уже чтото есть. Только с начиная с 1.

Все что хотел узнать узнал. Всем спасибо ^^.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
25.09.2019, 10:44
Цитата Сообщение от hoggy Посмотреть сообщение
родительский процесс запускает дочерний.
То есть одна ваша программа запускает другую вашу программу и зачем-то меняет ей argv[0]? Так все-таки - зачем?! И что мешает оформить в виде потоков? Что мешает использовать тот же system? И в любом случае, о соблюдении соглашений вызова должна заботиться вызывающая сторона, так что если вы пишете программу, которая некорректно вызывает сторонние - это исключительно ваша проблема, а не их.
И даже так - это актуально только для многопоточных программ, даже прогопроцессных, что совсем редкость.

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
писать грамотно,
забавно читать такое от человека, разделяющего одну строку на десяток, причем в случайных местах. Да еще и начинать предложение со строчной буквы и допускать ошибки...


Цитата Сообщение от hoggy Посмотреть сообщение
можно писать чушь. можно акцентрировать на этом внимание. дабы не ввели ЕГО в заблуждение бесы-балбесы.
Можно сказать школьнику что на ноль делить нельзя, а потом подвести студента к мысли, что таки иногда можно. Можно учить ньютоновской механике и только потом перейти к релятивистским эффектам. И в отличие от аналогий с самолетом и пустыней, это - корректная аналогия.
Так и тут: сначала надо изучить синтаксис и конструкции языка, и только потом переходить к тонкостям и исключениям. Тем более, что именно та область, в которой подобная экзотика встречается, может никогда и не понадобиться ТСу.
Цитата Сообщение от hoggy Посмотреть сообщение
казалось бы, фигня делов: CreateProcess(path2programm, params, ...); и всё, приплыли. все аргументы смещены влево.
То есть вы неправильно вызываете программу с неправильными аргументами и ожидаете правильного поведения? Я все правильно понял? А, собственно, на каком основании? В лучшем случае программа плюнет ошибкой в stderr+return что ей передали неправильные аргументы. В худшем - будет работать.
Цитата Сообщение от hoggy Посмотреть сообщение
в моей практике был один случай, когда один паренёк будучи ещё новичком, запустил вот так одну консольную утилиту. утилита полезла в базу данных, и слегка набедокурила.
Ну так а чего удивляться, если от нее именно этого и просили. Еще бы system("format C:"); вызвали а потом удивлялись "а чего это все поломалось".
Цитата Сообщение от hoggy Посмотреть сообщение
программный код либо инвариантен, либо нет.
Увы, мы живем не в идеальном мире. Всегда приходится искать баланс между скоростью разработки программы, скоростью работы, занимаемой памяти, надежности, гибкости, функциональности и еще десятком факторов.
Цитата Сообщение от hoggy Посмотреть сообщение
или зависеть от прихоти "маловероятных событий".
Ради интереса посмотрел несколько ваших примеров кода. Что ж вы настаиваете на отлавливании всякой экзотики, которая встречается чуть реже чем никогда, а стандартную проверку опустили? Вот тут, например.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
25.09.2019, 17:34
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а стандартную проверку опустили? Вот тут, например.
"Там" не нужна проверка.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.09.2019, 19:08
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть одна ваша программа запускает другую вашу программу и зачем-то меняет ей argv[0]? Так все-таки - зачем?!
я понимаю, что ты не умеешь в windows,
и не знаком с особенностями winapi.
но скажи, какое именно слово в этом предложении оказалось тебе не понятным?

Цитата Сообщение от hoggy Посмотреть сообщение
реальность такова,
что если программист сам лично не напишет код,
который запишет путь к модулю нулевым аргументом,
то никто за него этого не сделает.
не знаю, откуда ты вообще умыдрился взять своё "то есть".

если мои речи тебе кажутся слишком сложными для понимания,
почитай документацию

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И что мешает оформить в виде потоков? Что мешает использовать тот же system?
"в виде потоков" - это к админам, а не к программистам,
если я тебя правильно понял.
system редко используется,
просто потому, что у неё функционал слишком бедный.
она бесполезна даже для самых типичных задач.

пример типичной задачи:
есть родительский процесс (gui приложение)
из под него нужно запустить дочерний процесс.
какую нибудь консольную утилиту.

при этом утилита запускается без консольного окна.
необходимо дождаться окончания работы утилиты.
получить код возврата,
и заграбастать весь её вывод (stdout/stderr)

теперь покажи, как ты это сможешь оформить "в виде потоков",
или при помощи system.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И в любом случае, о соблюдении соглашений вызова должна заботиться вызывающая сторона,
ты это так пишешь, как будто бы вызываемая сторона не должна проверять,
что ей впаривают.

инвариант? не, не слышал.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В лучшем случае программа плюнет ошибкой в stderr+return что ей передали неправильные аргументы. В худшем - будет работать.
это не "лучший случай".
это - нормальный случай.

худший бывает либо у новичков,
либо у худших программистов.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
забавно читать такое от человека, разделяющего одну строку на десяток, причем в случайных местах. Да еще и начинать предложение со строчной буквы и допускать ошибки...
я разделяю строку только по пробелам (обычно после запятых)
потому что это удобно.

особенно, когда читаешь с телефона.
не нужно скролить влево-вправо.

ты мне картинку одну сейчас напомнил:
"нечего сказать - докалебусь до орфографии"

лично мне всё равно, кто как пишет по-русски:
"докалебаться до орфографии",
"докалебатся до орфографии",
или даже:
"докалебаццо до орфографии".

если при этом не искажается смысл сообщения.

поэтому, если я докалёбывюсь, то докалёбываюсь всегда до смысла.
докалёбываццо до орфографии - это убого.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну так а чего удивляться, если от нее именно этого и просили. Еще бы system("format C:"); вызвали а потом удивлялись
ты вообще понял, для чего я об этом написал?
за нитью беседы следишь?

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

и вот нахера ты теперь начал загонять про удивление?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Увы, мы живем не в идеальном мире. Всегда приходится искать баланс между скоростью разработки программы, скоростью работы, занимаемой памяти, надежности, гибкости, функциональности и еще десятком факторов.
мир не совершенный.
именно поэтому и возникло понятие "инварианта".
только вот сама эта метрика не зависит от скорости разработки.
годный программист успевает решать задачи за поставленное время.
и при этом он выдаёт качество.

плохому программисту яйца мешают вызывающая сторона чего-то там должна.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
стандартную проверку опустили? Вот тут, например.
ты точно знаешь с++?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
26.09.2019, 14:06
Цитата Сообщение от hoggy Посмотреть сообщение
но скажи, какое именно слово в этом предложении оказалось тебе не понятным?
То, где описывается необходимость нарушения соглашения. Вот сколько читаю ваши посты - никак не могу понять. Ну требует CreateProcess указать все аргументы - значит о соблюдении соглашения обязан думать программист, и это должно быть доведено до автоматизма.
Неужели для вас настолько сложна концепция следования стандартам, даже если требует лишних телодвижений?
Цитата Сообщение от hoggy Посмотреть сообщение
"в виде потоков" - это к админам, а не к программистам,
Учитывая, что процесс может запуститься как самой программой, так и сторонними, а поток - только самой программой. Чем админ поможет в запуске потоков внутри программы, если не имеет права лезть в код?
Цитата Сообщение от hoggy Посмотреть сообщение
пример типичной задачи: есть родительский процесс (gui приложение) из под него нужно запустить дочерний процесс. какую нибудь консольную утилиту.
А в чем проблема?
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(){
  FILE *pf = popen("dir", "r");
  if(pf == NULL){fprintf(stderr, "Can not call popen\n"); return -1;}
  char str[1000];
  do{
    fscanf(pf, "%999s", str);
    printf("> %s\n", str);
  }while(!feof(pf));
  fclose(pf);
}
Правда, popen работает только в одну сторону - либо на чтение, либо на запись. Но никто ведь не запрещает использовать каналы.
Цитата Сообщение от hoggy Посмотреть сообщение
ты это так пишешь, как будто бы вызываемая сторона не должна проверять, что ей впаривают.
То есть для тебя будет откровением, что некоторые утилиты принимают просто текст, который физически невозможно проверить на корректность. Простейший пример - конкатенация файлов через cat. Она ждет имена файлов, и не может отследить что первый аргумент ей передают в argv[0].
С чего я и начал: если ты неправильно вызываешь программу, она имеет полное право работать не так как ты ожидаешь.

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
ты мне картинку одну сейчас напомнил: "нечего сказать - докалебусь до орфографии"
Ну если из всего текста для вас кажется ключевым высказыванием выделенная серым фраза "не по теме" то что ж тут сказать... Впрочем, учитывая насколько упорно вы уходите от ответа на ключевой вопрос, обвинение в граммар-нацизме становится понятным


Цитата Сообщение от hoggy Посмотреть сообщение
на самом деле элементарно ничайно допустить такую ошибку.
А еще можно пропустить указатель в scanf или перепутать = и ==. Это ошибка в вашем коде и отвечаете за нее именно вы.
Цитата Сообщение от hoggy Посмотреть сообщение
ты точно знаешь с++?
Нет. А ты можешь гарантировать успешность завершения данной операции? Или предпочитаешь чтобы программа падала с невразумительными кодами возврата вместо осмысленного сообщения?

Добавлено через 4 часа 25 минут
Цитата Сообщение от hoggy Посмотреть сообщение
пример типичной задачи:
Еще решение через system.
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
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
#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);
}
Жду вашего решения. Естественно, оно должно быть максимально кроссплатформенным.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
26.09.2019, 15:35
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот только он не уточняет, что нарушают это соглашение крайне редко и по каким-то своим поводам
Его может нарушить пользователь вашей программы совершенно случайно.
Создаст, например, ссылку для запуска и в argv[0] начнет приходить имя этой ссылки, а не "имя исполняемого файла".

Или, запуская из консоли вашу программу как
Bash
1
./app
или как
Bash
1
app
или как
Bash
1
/some/dir/app
будет получать разные строки в argv[0].

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
hoggy упирает на то, что это лишь соглашение, а не жесткий стандарт.
Мне кажется его мысль была очень простая, а весь ваш диалог был посвящен тому, чтобы ее усложнить, дабы было проще с ней не согласиться. Но если отбросить лишнее, т.е. оставить первоначальное утверждение
Цитата Сообщение от hoggy Посмотреть сообщение
в списке аргументов процесса будет в буквальном смысле то, что туда тупо запихал лаунчер при старте процесса..
то окажется, что Хогги ни на что такое не упирает, а лишь констатирует факт, что строка, содержащаяся в argv[0] зависит от окружения, в котором осуществляется запуск. А это окружение вполне может и пользователь программы поменять без всяких извращений теми способами, которые я продемонстрировал выше.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
26.09.2019, 17:21
hoggy, Есть такая вешь - BusyBox.
Допустим вам надо найти строчку "rm" в "очень_важный_файл"
Вы, описанным вами способом (со съехавшим на одну позицию argv), запускаете "grep rm очень_важный_файл". Что произойдет? И кто в этом виноват - вы или разработчики BusyBox?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
26.09.2019, 17:35
Цитата Сообщение от DrOffset Посмотреть сообщение
Создаст, например, ссылку для запуска и в argv[0] начнет приходить имя этой ссылки, а не "имя исполняемого файла".
Ну и отлично, ведь пользователь именно этого и хотел добиться. Чем вас не устраивает поведение программы, считающей, что у ее исполняемого файла другое корректное имя?
Цитата Сообщение от DrOffset Посмотреть сообщение
А это окружение вполне может и пользователь программы поменять без всяких извращений теми способами, которые я продемонстрировал выше.
Но в вашем примере они все остаются корректными именами той же самой программы, по ним ее можно вызвать. То есть проблему вы пока не продемонстрировали.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
26.09.2019, 19:45
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть проблему вы пока не продемонстрировали.
Я разве говорил о каких-то проблемах?
Речь шла
Цитата Сообщение от _stanislav Посмотреть сообщение
argv[0] всегда содержит имя исполняемого файла
товарищ hoggy возразил, что не всегда. Иногда оно содержит путь, относительный или абсолютный, иногда имя, через которое осуществлялся вызов, а иногда, может и вообще ничего не содержать. Собственно все.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но в вашем примере они все остаются корректными именами той же самой программы, по ним ее можно вызвать.
Речь не о вызове шла ведь, а об имени исполняемого файла. Если ваш файл называется a.exe, то ожидать, что в argv[0] всегда (c) будет приходить a.exe - не верно. Только об этом.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.09.2019, 04:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Иногда оно содержит путь, относительный или абсолютный, иногда имя, через которое осуществлялся вызов, а иногда, может и вообще ничего не содержать.
я перечитал Бьёрна и успокоился https://www.cyberforum.ru/post13850196.html
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
27.09.2019, 10:05
Цитата Сообщение от DrOffset Посмотреть сообщение
товарищ hoggy возразил, что не всегда. Иногда оно содержит путь, относительный или абсолютный, иногда имя, через которое осуществлялся вызов
Так с этим никто не спорит. Но на практике зачем нам может понадобиться имя программы? Скорее всего, чтобы запустить ее еще раз. Хотя я чаще использую для вывода справки, что-то вроде printf("usage: %s [input] -o [output] [flags]\n", argv[0]);, а здесь вообще не важно полный путь, относительный. Даже ошибки hoggy не будут критичными.
Для такого применения argv[0] в виде команды вызова - то что надо.
Цитата Сообщение от DrOffset Посмотреть сообщение
иногда, может и вообще ничего не содержать
по-прежнему не могу придумать ситуацию, где это было бы полезно настолько чтобы нарушать соглашение. Разве что в контроллерах, где в принципе нет вызывающей стороны.
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
27.09.2019, 11:51
Цитата Сообщение от DrOffset Посмотреть сообщение
а иногда, может и вообще ничего не содержать.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
не могу придумать ситуацию, где это было бы полезно настолько чтобы нарушать соглашение.
а где там нарушение ?

есть стандарт языка

http://www.open-std.org/jtc1/s... /n4296.pdf


3.6.1 Main function
and argv[0] shall be the pointer to the initial character of a
ntmbs that represents the name used to invoke the program or ""
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
27.09.2019, 11:59
Цитата Сообщение от QuestionAnd Посмотреть сообщение
а где там нарушение ?
Мы же именно об этом спорим вторую страницу:
Цитата Сообщение от hoggy Посмотреть сообщение
не факт, что нулевой аргумент хранит путь к модулю. и что бы не полагаться на корректность вызывающей стороны, нужно использовать специализированное апи.
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
27.09.2019, 12:06

Не по теме:

тогда вообще не пойму кто тут за красных, а кто за белых


1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.09.2019, 14:11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мы же именно об этом спорим вторую страницу
Т.е. вы не согласны с тем, что
не факт, что нулевой аргумент хранит путь к модулю
Так? Т.е. по-вашему нужны какие-то особые извращения, чтобы так получилось?

Ну так допустим, что путь к модулю лежит в PATH, соответственно вызов может не содержать этот путь.
Или вызов может идти через ссылку, которая лежит в другом месте, относительно самого модуля.
Оба случая не зависят ни от кого, кроме пользователя системы, т.е. извращений программиста как бы и нет.

Если же в программе нужен именно путь или именно оригинальное имя модуля, то расчет на argv[0] можно считать неоправданным. По-моему Хогги именно про это и говорил. Нет?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
27.09.2019, 14:47
argv[0] содержит имя, по которому исполняемый файл вызван. Вызов system(argv[0]); позволяет запустить тот же самый бинарник.
При желании это соглашение можно нарушить и передать в argv[0] произвольную строку - но это будет именно нарушением соглашения и для этого нужны веские причины.
Цитата Сообщение от DrOffset Посмотреть сообщение
Или вызов может идти через ссылку, которая лежит в другом месте, относительно самого модуля.
И в argv[0] попадает имя ссылки, как и должно быть. Какого еще поведения можно ожидать?
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну так допустим, что путь к модулю лежит в PATH, соответственно вызов может не содержать этот путь.
То, что путь может быть относительным как-то мешает им пользоваться?
Цитата Сообщение от DrOffset Посмотреть сообщение
Если же в программе нужно именно оригинальное имя модуля
Что есть оригинальное имя модуля? Например, есть программа с невероятно оригинальным названием prog.
Дальше создаем мягкую ссылку prog_soft. Пока об оригинальном имени говорить еще можно, хотя и со скрипом. С одной стороны очевидно, что мягкая ссылка вторична по отношению к оригиналу, с другой - пользователь сознательно изменил имя программы (полный путь). Наверное, ему это зачем-то надо.
А теперь создем жесткую ссылку prog_hard. Какое из имен теперь "оригинальное"? Жесткая ссылка это просто другое имя того же файла.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если же в программе нужен именно путь
...то она именно его и получает (если не влез какой-то извращенец, затеревший argv[0], конечно). Чем вам относительный путь не путь? Да и realpath никто, вроде, не отменял...
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
27.09.2019, 14:57
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
это соглашение можно нарушить и передать в argv[0] произвольную строку - но это будет именно нарушением соглашения
какого соглашения, если даже в стандарте написано необязательно там имя программы

the name used to invoke the program or ""
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.09.2019, 15:31
COKPOWEHEU, из вашего ответа стало понятно, что вы спорите с вами же самим придуманными утверждениями

Вот например:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
argv[0] содержит имя, по которому исполняемый файл вызван. Вызов system(argv[0]); позволяет запустить тот же самый бинарник.
Никто не утверждал, что имя полученное таким образом, нужно именно для вызова. Может программист его хочет в базу данных сохранить?

Далее:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При желании это соглашение можно нарушить и передать в argv[0] произвольную строку - но это будет именно нарушением соглашения и для этого нужны веские причины.
Ваша цитата тов. Хогги не демонстрирует никакого желания с его стороны передавать туда произвольную строку. Он лишь написал, что строка не обязательно должна содержать оригинальное имя модуля.

Вот опять:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем вам относительный путь не путь?
Никто не говорит, что относительный путь - не путь. Речь шла о том, чего может, а чего не может ожидать программист при анализе argv[0].

И вот снова.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То, что путь может быть относительным как-то мешает им пользоваться?
Где вообще кто-то утверждал, что путем нельзя пользоваться? Вы сами привели цитату:
не факт, что нулевой аргумент хранит путь к модулю
Она, что, разве не верна, раз вы с ней спорите?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что есть оригинальное имя модуля? Например, есть программа с невероятно оригинальным названием
Оригинальное - значит то имя, которое есть у файла исполняемого модуля. Если, например, вы захотите переименовать именно этот файл, а не ссылку, то вам нужно будет знать его оригинальное имя, ну или нужно будет знать, что перед вами ссылка, чтобы через нее получить оригинальное имя или сделать правильный rename, который учитывает то, что перед нами ссылка.
В любом случае здесь надо знать, что в argv[0] может прийти не то имя, которым называется исполняемый файл.

Добавлено через 13 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Да и realpath никто, вроде, не отменял...
Вот допустим ваша программа называется prog и лежит она в каталоге /opt/3rd_party/bin, который юзер добавил в PATH.

Далее он в консоли вызывает вашу программу как
Bash
1
prog
Что он получит в argv[0]? Правильно prog и получит. Что вернет realpath для строки prog? Правильно, NULL вернет. А все потому, что в строке prog нет пути к /opt/3rd_party/bin/prog, ни относительного, ни абсолютного, никакого.

Добавлено через 1 минуту
Теперь возвращаемся к цитате:
не факт, что нулевой аргумент хранит путь к модулю
С учетом вышесказанного, почему вы все еще считаете, что она неверна?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2019, 15:31
Помогаю со студенческими работами здесь

[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...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru