0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
1

Какие параметры принимает функция main?

30.12.2018, 14:39. Показов 2889. Ответов 72
Метки main (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, какие параметры может принимать функция main() в c++, согласен, много статей на эту тему, но я не могу понять практического применения этих параметров, кому не лень пожалуйста ответьте двумя строчками, что за такие аргументы argc, argv и зачем они нужны???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2018, 14:39
Ответы с готовыми решениями:

Функция не принимает параметры
Есть код: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <locale.h> ...

Функция принимает в параметры массив и сжимает его
Написать функцию которая принимает в параметры массива и сжимает его путем сложения разных соседних...

Функция принимает в параметры коефициенты квадратного уравнения и возращает сумму его корней
Нужно написать функцию которая принимает в параметры коефициенты квадратного уравнения и возращает...

как мне понять что принимает моя функция какие значения?
как мне понять что принимает моя функция какие значения?????????????????????? #pragma comment...

72
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
30.12.2018, 14:51 2
Это токенизированная (разбитая на слова разделяемые пробелами) командная строка, использованная при запуске проограммы. argc это количество слов а argv это массив указателей на сами строки содержащие оные слова. Ну а нужны они для получения параметров командной строки.
0
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
30.12.2018, 16:04 3
Цитата Сообщение от TymurG Посмотреть сообщение
зачем они нужны???
Скажем, вы создаете утилиту, копирующую один файл в другой. Можно, конечно, ввести их имена из cin. Но это не всегда удобно. Иногда удобнее задать имена файлов в командной строке и вызывать утилиту так
cop f1 f2
Внутри программы при таком вызове argc = 3, argv[0] = "cop" (так принято), argv[1]="f1", argv[2]="f2"
И программа может проанализировать количество и значения аргументов, и предпринять соответствующие действия.
Часто в командной строке также передаются флаги, задающие режимы работы программы.
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.01.2019, 14:03 4
Цитата Сообщение от TymurG Посмотреть сообщение
что за такие аргументы argc, argv и зачем они нужны???
Проще всего для меня запомнить было, - принять c -counter и v - value. То есть первый аргумент - количество строк в массиве строк передаваемом 2-м параметром.
Если вы не передаёте ничего явно, то argc=1 и argv[0]="your startup path" (один параметр по умолчанию).
argc нужен потому, что нет способа узнать размер массива типа char*[] (массива с-строк которые представляются указателями сами по себе).
Вы можете передать в командной строке
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
разбитая на слова разделяемые пробелами
cтроку (элементы начиная с 1), чтобы программа её использовала. Как использовала? Лучше не спрашивайте.
1
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
01.01.2019, 15:25 5
Цитата Сообщение от IGPIGP Посмотреть сообщение
argc нужен потому, что нет способа узнать размер массива типа char*[]
Не уверен, но кажется, последний элемент массивы argv равен NULL.
С Новым Годом!
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.01.2019, 15:37 6
Цитата Сообщение от Байт Посмотреть сообщение
Не уверен, но кажется, последний элемент массивы argv равен NULL.
Идея отличная, кстати. В самом деле, почему бы если у с-строки есть терминатор, то не сделать токовой стандартом и для массивов отличных от char и const char. Мне подобная реализация неизвестна.
Цитата Сообщение от Байт Посмотреть сообщение
С Новым Годом!
С Новым Годом!
0
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.01.2019, 16:08 7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мне подобная реализация неизвестна.
Насколько я помню, argv[argc] обязан быть NULL.
Я не знаток стандартов, но за C99 ручаюсь.
0
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.01.2019, 16:55 8
Цитата Сообщение от gng Посмотреть сообщение
за C99 ручаюсь.
Это же не C++...
Цитата Сообщение от gng Посмотреть сообщение
Я не знаток стандартов
Я тоже. Вообще, если есть терминатор, то первый параметр в данном случае лишён смысла. Интересно, что скажут знатоки стандартов.
0
3819 / 2391 / 414
Регистрация: 09.09.2017
Сообщений: 10,369
01.01.2019, 17:26 9
Цитата Сообщение от gng Посмотреть сообщение
Я не знаток стандартов, но за C99 ручаюсь.
В С11 тоже (пункт 5.1.2.2.1)
— The value of argc shall be nonnegative.
— argv[argc] shall be a null pointer.
0
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.01.2019, 21:43 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
если есть терминатор, то первый параметр в данном случае лишён смысла.
Для удобства и для доступа к параметрам за O(1)
0
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
01.01.2019, 23:51 11
Цитата Сообщение от gng Посмотреть сообщение
Для удобства и для доступа к параметрам за O(1)
То есть, хранить сведения о размере двумя независимыми способами это нормально?

Добавлено через 12 минут
Проверил на Qt MinGW и G++ дружно дают 1 если
C++
1
2
3
int main(int argc, char **argv)
{
    cout<<(argv[1]==nullptr)<<endl;//1
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
02.01.2019, 17:41 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, хранить сведения о размере двумя независимыми способами это нормально?
Ну а зачем по вашему плюсовая строка обязана хранить 0 в конце? При последовательном доступе удобнее терминатор. При случайном - количество элементов или границы (указатели) из которых оно вычисляемо.
1
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
02.01.2019, 17:59 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, хранить сведения о размере двумя независимыми способами это нормально?
Имхо, вполне. Тем более в ситуации, когда ты еще не знаешь, как построенная структура данных будет использоваться.
Но по-честному, я не в силах придумать задачу, где список параметров функции main просматривался бы не последовательно. Но это вовсе не значит, что такой задачи нет
1
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
02.01.2019, 18:22 14
Цитата Сообщение от Байт Посмотреть сообщение
Но по-честному, я не в силах придумать задачу, где список параметров функции main просматривался бы не последовательно.
Я тоже. Но если у нас есть длина в явном виде, то проверка на ноль и проверка счетчика на равенство длине (разность длины и счётчика на ноль) отличаются на одну операцию. Я не в силах представить строку такой длины (в количестве ключей-слов), чтобы это сказалось на производительности. Учитывая общие затраты на запуск исполняемого файла.
Может быть есть какие-то исторические причины? Или соображения совместимости? Или их комбинация...
0
Диссидент
Эксперт C
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
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
02.01.2019, 19:34 16
Цитата Сообщение от Байт Посмотреть сообщение
А в случае параметров argv просто придумали альтернативу терминальному нулю.
Это просто? Не знаю... Две логически жестко связанные и совершено лишённые поддержки (независимые в реализации) величины, с моей точки зрения - неразумно.
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
Цитата Сообщение от IGPIGP Посмотреть сообщение
с моей точки зрения - неразумно.
То, что одно и то же можно сделать различными способами - одна из фишек Си, языка совсем не академического, а ориентированного на практику. Точно так же можно сказать - зачем цикл while, если можно написать for( ;a<b; )
1
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
02.01.2019, 20:58 18

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
с моей точки зрения - неразумно.
Слушай, дарагой! Не нравится - не кушай!
"Хинкали не хочешь? - шашлык возьмем!" - это буквальная цитата из моих бестолковых путешествий по Закавказью.
Однако, вот и еще навеяло. Это из тувинского эпоса. Родины нашего доблестного военкома.
Плохо тебе? - в баню сходи!
Плохо после бани? - выпей после бани!
Что, опять плохо? - женщину возьми!
Все равно плохо? - Уезжай из Тувы!



Добавлено через 1 минуту
Цитата Сообщение от gng Посмотреть сообщение
одно и то же можно сделать различными способами - одна из фишек Си,
Имхо, это фишка любого сколь-нибудь разумного проекта.
0
922 / 638 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
02.01.2019, 21:02 19
PS. Нулевой завершающий поинтер пришел с Юниксовых функций семейства exec(). А argc, да, добавили, судя по всему, для удобства.

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Имхо, это фишка любого сколь-нибудь разумного проекта.
Может и так.
Из филовофии Питона (тот, который ЯП):
- Встретив двусмысленность, отбрось искушение угадать.
- Должен существовать один — и, желательно, только один — очевидный способ сделать это.
0
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
02.01.2019, 21:08 20
Цитата Сообщение от gng Посмотреть сообщение
пришел с Юниксовых функций семейства exec().
Тут как бы не очень понятно, кто откудова пришел. Они же одновременно создавались одним коллективом авторов. Впрочем, мы же не историческими исследованиями занимаемся... Хотя, да, прошу прощения, это я - первый, кто в этом топике матушку историю за хвост потянул

Добавлено через 3 минуты
Цитата Сообщение от gng Посмотреть сообщение
Из филовофии Питона
Простите, но мне егойная филовозия сразу не понравилась. Придавать синтаксический смысл невидимому?! Нет, нет, бежим подальше от этого греха!
0
02.01.2019, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2019, 21:08
Помогаю со студенческими работами здесь

Какие параметры принимает функция IntRect
Пример : Sprite sp; sp.setTextureRect(IntRect( что именно мужно здесь написать , чтобы вырезать...

Определить, какие параметры принимает функция
Читаю книгу по C# и БД и не могу понять что эти строчки значят OleDbConnection connection =...

Каково назначение метода Split и какие параметры он принимает?
Обьясните пожалуйста, что делает этот метод для обьекта класс String, какие параметры он принимает...

Где можно посмотреть какие параметры принимает метод RSA
Можете скинуть сайт, на котором можно посмотреть как пользоваться методом RSA библиотеки openssl....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru