X-PDF

Передача параметров функции main

Поделиться статьей

Функция main, с которой начинается выполнение С++-программы, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, первый параметр служит для передачи числа передаваемых строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой программы (под словом понимается любой текст не содержащий символа пробел). Параметр argv это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.

Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется С++-программа.

Заголовок функции main имеет вид:

int main (int argc, char *argv[], char *argp[])

Если, например, командная строка С++-программы имеет вид:

A:&gt .cprog working C program 1

то аргументы argc, argv, argp представляются в памяти как показано в схеме на рис.1.

argc [ 4 ] argv [ ]—&gt . [ ]—&gt . [A:cprog.exe] [ ]—&gt . [working] [ ]—&gt . [C program] [ ]—&gt . [1] [NULL] argp [ ]—&gt . [ ]—&gt . [path=A: .C:\0] [ ]—&gt . [lib=D:LIB] [ ]—&gt . [include=D:INCLUDE] [ ]—&gt . [conspec=C:COMMAND.COM] [NULL] Рис.1. Схема размещения параметров командной строки

Операционная система поддерживает передачу значений для параметров argc, argv, argp, а на пользователе лежит ответственность за передачу и использование фактических аргументов функции main.

Пример: Необходимо в командной строке ввести целое число, которое будет преобразовано в двоичный, 8-ричный и 16-ричный формат и выведено на экран.

#include&lt .iostream.h&gt .

#include&lt .stdlib.h&gt .

void f_dva(int a) .

int main (int argc, char *argv[])

{ int i .

if(argc!=2)

{ cout&lt .&lt .Введите в командной строке целое число. .

return (0) .}

i=atoi(argv[1]) .

f_dva(i) .

cout&lt .&lt .8-ричная СС: &lt .&lt .oct&lt .&lt .i&lt .&lt .endl .

cout&lt .&lt .16-тиричная СС: &lt .&lt .hex&lt .&lt .i .

return(0) .

}

void f_dva(int a)

Представленная информация была полезной?
ДА
58.69%
НЕТ
41.31%
Проголосовало: 990

{int t=0 .

int c[50] .

while(a!=0)

{

c[t]=(a%2) .

a/=2 .

t++ .

}

t— .

for( .t&gt .=0 .t—)

cout&lt .&lt .2-:&lt .&lt .dec&lt .&lt .c[t] .

cout&lt .&lt .endl .

}

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

Пример: #include&lt .stdio.h&gt . int main (int argc, char *argv[], char *argp[]) { int i=0 . printf (n Имя программы %s, argv[0]) . for (i=1 . i&lt .=argc . i++) printf (n аргумент %d равен %s, argv[i]) . printf (n Параметры операционной системы:) . while (*argp) { printf (n %s,*argp) . argp++ . } return (0) . }

Доступ к параметрам операционной системы можно также получить при помощи библиотечной функции geteuv, ее прототип имеет следующий вид:

char *geteuv (const char *varname) .

Аргумент этой функции задает имя параметра среды, указатель на значение которой выдаст функция geteuv. Если указанный параметр не определен в среде в данный момент, то возвращаемое значение NULL.

Используя указатель, полученный функцией geteuv, можно только прочитать значение параметра операционной системы, но нельзя его изменить. Для изменения значения параметра системы предназначена функция puteuv.

Компилятор языка С++ строит С++-программу таким образом, что вначале работы программы выполняется некоторая инициализация, включающая, кроме всего прочего, обработку аргументов, передаваемых функции main, и передачу ей значений параметров среды. Эти действия выполняются библиотечными функциями _setargv и _seteuv, которые всегда помещаются компилятором перед функцией main.

Если С++-программа не использует передачу аргументов и значений параметров операционной системы, то целесообразно запретить использование библиотечных функций _setargv и _seteuv поместив в С++-программу перед функцией main функции с такими же именами, но не выполняющие никаких действий (заглушки). Начало программы в этом случае будет иметь вид:

_setargv() { return . /* пустая функция */ } -seteuv() { return . /* пустая функция */ } int main() { /* главная функция без аргументов */…… return (0) . }

В приведенной программе при вызове библиотечных функций _setargv и _seteuv будут использованы функции помещенные в программу пользователем и не выполняющие никаких действий. Это заметно снизит размер получаемого exe-файла.


Поделиться статьей
Автор статьи
Анастасия
Анастасия
Задать вопрос
Эксперт
Представленная информация была полезной?
ДА
58.69%
НЕТ
41.31%
Проголосовало: 990

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram

ОБРАЗЦЫ ВОПРОСОВ ДЛЯ ТУРНИРА ЧГК

Поделиться статьей

Поделиться статьей(Выдержка из Чемпионата Днепропетровской области по «Что? Где? Когда?» среди юношей (09.11.2008) Редакторы: Оксана Балазанова, Александр Чижов) [Указания ведущим:


Поделиться статьей

ЛИТЕЙНЫЕ ДЕФЕКТЫ

Поделиться статьей

Поделиться статьейЛитейные дефекты — понятие относительное. Строго говоря, де­фект отливки следует рассматривать лишь как отступление от заданных требований. Например, одни


Поделиться статьей

Введение. Псковская Судная грамота – крупнейший памятник феодального права эпохи феодальной раздробленности на Руси

Поделиться статьей

Поделиться статьей1. Псковская Судная грамота – крупнейший памятник феодального права эпохи феодальной раздробленности на Руси. Специфика периода феодальной раздробленности –


Поделиться статьей

Нравственные проблемы современной биологии

Поделиться статьей

Поделиться статьейЭтические проблемы современной науки являются чрезвычайно актуальными и значимыми. В связи с экспоненциальным ростом той силы, которая попадает в


Поделиться статьей

Семейство Первоцветные — Primulaceae

Поделиться статьей

Поделиться статьейВключает 30 родов, около 1000 видов. Распространение: горные и умеренные области Северного полушария . многие виды произрастают в горах


Поделиться статьей

Вопрос 1. Понятие цены, функции и виды. Порядок ценообразования

Поделиться статьей

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


Поделиться статьей

или напишите нам прямо сейчас:

Написать в WhatsApp Написать в Telegram
Заявка
на расчет