0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
|
|
1 | |
Какие параметры принимает функция main?30.12.2018, 14:39. Показов 2889. Ответов 72
Всем привет, какие параметры может принимать функция main() в c++, согласен, много статей на эту тему, но я не могу понять практического применения этих параметров, кому не лень пожалуйста ответьте двумя строчками, что за такие аргументы argc, argv и зачем они нужны???
0
|
|
30.12.2018, 14:39 | |
Ответы с готовыми решениями:
72
Функция не принимает параметры
как мне понять что принимает моя функция какие значения? |
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
30.12.2018, 14:51 | 2 |
Это токенизированная (разбитая на слова разделяемые пробелами) командная строка, использованная при запуске проограммы. argc это количество слов а argv это массив указателей на сами строки содержащие оные слова. Ну а нужны они для получения параметров командной строки.
0
|
Диссидент
![]() 27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
30.12.2018, 16:04 | 3 |
Скажем, вы создаете утилиту, копирующую один файл в другой. Можно, конечно, ввести их имена из cin. Но это не всегда удобно. Иногда удобнее задать имена файлов в командной строке и вызывать утилиту так
cop f1 f2 Внутри программы при таком вызове argc = 3, argv[0] = "cop" (так принято), argv[1]="f1", argv[2]="f2" И программа может проанализировать количество и значения аргументов, и предпринять соответствующие действия. Часто в командной строке также передаются флаги, задающие режимы работы программы.
1
|
Комп_Оратор)
![]() |
|
01.01.2019, 14:03 | 4 |
Проще всего для меня запомнить было, - принять c -counter и v - value. То есть первый аргумент - количество строк в массиве строк передаваемом 2-м параметром.
Если вы не передаёте ничего явно, то argc=1 и argv[0]="your startup path" (один параметр по умолчанию). argc нужен потому, что нет способа узнать размер массива типа char*[] (массива с-строк которые представляются указателями сами по себе). Вы можете передать в командной строке cтроку (элементы начиная с 1), чтобы программа её использовала. Как использовала? Лучше не спрашивайте. ![]()
1
|
Комп_Оратор)
![]() |
|
01.01.2019, 15:37 | 6 |
Идея отличная, кстати. В самом деле, почему бы если у с-строки есть терминатор, то не сделать токовой стандартом и для массивов отличных от
char и const char . Мне подобная реализация неизвестна.С Новым Годом! ![]()
0
|
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
01.01.2019, 16:08 | 7 |
Насколько я помню, argv[argc] обязан быть NULL.
Я не знаток стандартов, но за C99 ручаюсь.
0
|
Комп_Оратор)
![]() |
|
01.01.2019, 16:55 | 8 |
Это же не C++...
Я тоже. Вообще, если есть терминатор, то первый параметр в данном случае лишён смысла. Интересно, что скажут знатоки стандартов. ![]()
0
|
3819 / 2391 / 414
Регистрация: 09.09.2017
Сообщений: 10,369
|
|
01.01.2019, 17:26 | 9 |
0
|
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
01.01.2019, 21:43 | 10 |
0
|
Комп_Оратор)
![]() |
||||||
01.01.2019, 23:51 | 11 | |||||
То есть, хранить сведения о размере двумя независимыми способами это нормально?
Добавлено через 12 минут Проверил на Qt MinGW и G++ дружно дают 1 если
![]()
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
02.01.2019, 17:41 | 12 |
Ну а зачем по вашему плюсовая строка обязана хранить 0 в конце? При последовательном доступе удобнее терминатор. При случайном - количество элементов или границы (указатели) из которых оно вычисляемо.
1
|
Диссидент
![]() 27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
02.01.2019, 17:59 | 13 |
Имхо, вполне. Тем более в ситуации, когда ты еще не знаешь, как построенная структура данных будет использоваться.
Но по-честному, я не в силах придумать задачу, где список параметров функции main просматривался бы не последовательно. Но это вовсе не значит, что такой задачи нет ![]()
1
|
Комп_Оратор)
![]() |
|
02.01.2019, 18:22 | 14 |
Я тоже. Но если у нас есть длина в явном виде, то проверка на ноль и проверка счетчика на равенство длине (разность длины и счётчика на ноль) отличаются на одну операцию. Я не в силах представить строку такой длины (в количестве ключей-слов), чтобы это сказалось на производительности. Учитывая общие затраты на запуск исполняемого файла.
Может быть есть какие-то исторические причины? Или соображения совместимости? Или их комбинация...
0
|
Диссидент
![]() 27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
02.01.2019, 19:21 | 15 |
IGPIGP, кажется, мы идем не с того конца. Вот смотри. Где-то в восьмидесятых (семидесятых?) годах ребята, собравшись на троих, придумывают язык. Вокруг чудовищные скалы типа Фортрана, Кобола и ПЛ-1. И то, что они придумывают (сами того еще не зная), этому суждено было полностью перевернуть компьютерный мир. Поставить с головы на ноги. А они -минималисты. Я представляю себе, сколь трудно было им ввести структуру типа FILE. Не потому что это сложно было для них. Но тут никуда не деться. Иначе просто ничего не получится. А простое должно быть просто. Максимально просто. Вот оттуда-то и пошел char с терминальным нулем. Но и ежу понятно, что строка должна быть представлена структурой. Длина, доступное место, занятое место, содержимое. А они старались без большой нужды структур не вводить. О! если бы они это сделали! Не было бы бесконечных вариаций на тему string...
Но то, что они чувствовали недостаточность своего решения - для меня это очевидно. А в случае параметров argv просто придумали альтернативу терминальному нулю. Ибо это и новых сущностей не вводило, и нисколь не дорого. ЗЫ. Даже прекрасно зная о терминальном нуле списка параметров, я всегда для их просмотра использовал for(i=1; i < argc;... ![]()
1
|
Комп_Оратор)
![]() |
|
02.01.2019, 19:34 | 16 |
Это просто? Не знаю... Две логически жестко связанные и совершено лишённые поддержки (независимые в реализации) величины, с моей точки зрения - неразумно.
for(i=1; i < argc;... это требует переменной i. do{}while(argv!=0); в ней не нуждается. Бог его знает. В конце концоввынуждены были писать первый С компилятор на ассемблере (bootstrup). Созвучные слова - Битструп, Страуструп (не имеют отношения к Ритчи и Кернигану. Кто же, по Вашему, 3-й - Томпсон?). Потом плюсы были вынуждены для совместимости повторять и разумное и... как тут говорили "удобное". ![]()
0
|
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
02.01.2019, 20:32 | 17 |
То, что одно и то же можно сделать различными способами - одна из фишек Си, языка совсем не академического, а ориентированного на практику. Точно так же можно сказать - зачем цикл while, если можно написать for( ;a<b; )
1
|
Диссидент
![]() 27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
02.01.2019, 20:58 | 18 |
Не по теме: Слушай, дарагой! Не нравится - не кушай! "Хинкали не хочешь? - шашлык возьмем!" - это буквальная цитата из моих бестолковых путешествий по Закавказью. Однако, вот и еще навеяло. Это из тувинского эпоса. Родины нашего доблестного военкома. Добавлено через 1 минуту Имхо, это фишка любого сколь-нибудь разумного проекта.
0
|
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
02.01.2019, 21:02 | 19 |
PS. Нулевой завершающий поинтер пришел с Юниксовых функций семейства exec(). А argc, да, добавили, судя по всему, для удобства.
Добавлено через 3 минуты Может и так. Из филовофии Питона (тот, который ЯП): - Встретив двусмысленность, отбрось искушение угадать. - Должен существовать один — и, желательно, только один — очевидный способ сделать это.
0
|
Диссидент
![]() 27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
02.01.2019, 21:08 | 20 |
Тут как бы не очень понятно, кто откудова пришел. Они же одновременно создавались одним коллективом авторов. Впрочем, мы же не историческими исследованиями занимаемся... Хотя, да, прошу прощения, это я - первый, кто в этом топике матушку историю за хвост потянул
![]() Добавлено через 3 минуты Простите, но мне егойная филовозия сразу не понравилась. Придавать синтаксический смысл невидимому?! Нет, нет, бежим подальше от этого греха! ![]()
0
|
02.01.2019, 21:08 | |
02.01.2019, 21:08 | |
Помогаю со студенческими работами здесь
20
Какие параметры принимает функция IntRect Определить, какие параметры принимает функция
Где можно посмотреть какие параметры принимает метод RSA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |