4871

Функции и массивы. Аргументы командной строки.

Лекция

Информатика, кибернетика и программирование

Функции и массивы. Аргументы командной строки. Массив в С++ никогда не передается по значению, а только как указатель на его первый (т.е. имеющий индекс 0) элемент. Все три следующие объявления функций эквивалентны: void sort( int ) void sort( in...

Русский

2012-11-28

52.5 KB

3 чел.

Функции и массивы. Аргументы командной строки.

Массив в С++ никогда не передается по значению, а только как указатель на его первый (т.е. имеющий индекс 0) элемент. Все три следующие объявления функций эквивалентны:

void sort( int * );

void sort( int[] );

void sort( int[10] );

Таким образом, передача массивов имеет следующие особенности:

При изменении значения аргумента внутри функции будет изменен сам переданный массив, а не его локальная копия. Если это не желательно, то можно явным образом при объявлении функции указать, что она не должна менять значение аргумента, объявив его константным:

int sum( const int[] );

Размер массива не является частью типа параметра, поэтому функция «не знает» реального размера переданного ей массива. Передавать размер массива необходимо явным образом, например:

int sum( const int A[], unsigned int size );

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

Другой способ явно сообщить функции размер массива-параметра – объявить его как ссылку. В этом случае, размер становится частью типа, и компилятор сможет проверить аргумент полностью. Само собой, такая реализация существенно ограничивает область применения функции только массивами заранее заданного размера:

const int A_SIZE = 10;

int sum( const int ( & A ) [ A_SIZE ] )

{

  int s = 0;

  for ( int i = 0; i < A_SIZE; ++i )

     s += A[i];

  return s;

}

void main()

{

  int A[ 10 ] = {1,2,3,4,5,6,7,8,9,0};

  cout << sum( A ) << endl; // допустимо, размер совпадает с A_SIZE

 

  int B[ 5 ] = {1,2,3,4,5};

  sum(B); // ошибка, размер неверный

}

Для параметров-многомерных массивов должны быть заданы правые границы всех его измерений, кроме первого:

int sum( int M[][10], int rows );

Здесь M объявлен как двумерный массив, содержащий десять столбцов и неизвечтное число строк. Эквивалентное объявление:

int sum( int ( * M )[10], int rows );

В этом случае скобки вокруг * M необходимы из-за более высокого приоритета операции взятия индекса.

Многомерный массив передается как указатель на его нулевой элемент. В нашем случае тип M – указатель на массив из десяти элементов типа int. Как и для одномерного массива, граница первого измерения не учитывается при проверке типов. Если параметры являются многомерными массивами, то  контролируются все измерения, кроме первого.

Многомерные массивы в динамической памяти представлят собой иерархию типа «массив указателей на указатели...», поэтому для передачи их в функцию используются двойные (тройные и т.п.) указатели. Следующий пример реализует набор простых функций для работы с квадратными матрицами:

// Функция выделяет память под квадратную матрицу

// требуемого размера и возвращает указатель

int ** allocateMatrix( int size )

{

 int ** M = new int * [ size ];

 for ( int i = 0; i < size; ++i )

 {

    M[i] = new int[ size ];

 }

  

 return M;

}

// Функция освобождает память, занимаемую

// квадратной матрицей заданного размера

void freeMatrix( int ** M, int size )

{

  for ( int i = 0; i < size; ++i )

    delete[] M[i];

  delete[] M;

}

// Функция заполняет квадратную матрицу

// случайными числами (0~100)

void fillMatrix( int ** M, int size )

{

  for ( int i = 0; i < size; ++i )

  {

     for ( int j = 0; j < size; ++j )

     {

        M[i][j] = rand() % 100;

     }

  }

}

// Функция транспонирует квадратную матрицу

void transposeMatrix( int ** M, int size )

{

  for ( int i = 0; i < size; ++i )

  {

     for ( int j = 0; j < i; j++ )

     {

        int tmp = M[i][j];

        M[i][j] = M[j][i];

        M[j][i] = tmp;

     }

  }

}

// Функция выводит матрицу на экран

void displayMatrix( const int ** M, int size, char * prefix = NULL )

{

  if ( prefix )

     std::cout << prefix << std::endl;

  for ( int i = 0; i < size; ++i )

  {

     for ( int j = 0; j < size; ++j )

        std::cout << M[i][j] << " ";

      

     std::cout << std::endl;

  }

}

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

{

  // Задали размер

  int size = 5;

  // Выделили память

  int ** M = allocateMatrix( size );

  // Заполнили матрицу случаными числами

  fillMatrix( M, size );

  // Выводим исходную матрицу

  displayMatrix( M, size, "Initial:" );

  // Транспонируем матрицу

  transposeMatrix( M, size );

  // Выводим транспонированную матрицу

  displayMatrix( M, size, "Transposed:" );

  // Освобождаем память

  freeMatrix( M, size );

  system( "pause" );

}

Аргументы командной строки.

При запуске консольной программы, как правило, информация ей передается в командной строке в виде строки параметров. Например, для копирования файлов стандартной программой copy нужно в качестве параметров передать имена файлов:

 

copy c:\1.txt d:\2.txt

Указанные параметры командной строки передаются в основную функцию main и могут быть получены из массива С-строк с именем argv. Количество параметров передается через аргумент argc. Развернутый прототип функции main будет выглядеть следующим образом:

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

В первом элементе массива строк argv (с индексом 0) всегда будет передаваться имя исполняемого файла, а все остальные элементы (с индексами от 1 до argc-1) будут содержать параметры (в командной строке они разделяются пробелами). Следующий пример иллюстрирует работу с параметрами командной строки. Программа создает файл с указанным именем и заполняет его заданным символом в заданном количестве:

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

{

  // В командной строке не передали имя файла

  if ( argc < 2 )

  {

     std::cout << "Необходимо указать имя файла!" << std::endl;

     return 0;

  }

  // Имя файла

  char * fname = argv[1];

  

  // Используемый символ, по умолчанию - 'A'

  char symbol = 'A';

  // Ограничение на максимально допустимое число символов

  const int MAX_COUNT = 256;

  // Требуемое количество символов, по умолчанию - максимум

  int count = MAX_COUNT;

  // Если в командной строке передали символ - используем его

  if ( argc >= 3 )

     symbol = argv[2][0];

  // Если в командной строке передали количество - используем его

  if ( argc >= 4 )

     count = std::min( atoi( argv[3] ), MAX_COUNT );

  if ( count < 0 )

  {

     cout << "Ошибка, недопустимое количество символов!" << endl;

     return 0;

  }

  ofstream f( fname );

  if ( ! f )

  {

     cout << "Ошибка создания файла!" << endl;

     return 0;

  }

  cout << "Заполняем файл " << fname << " " << count << " символами " << symbol << endl;

  for ( int i = 0; i < count; ++i )

     f << symbol << " ";

  f.close();

  cout << "Готово!" << endl;

}


 

А также другие работы, которые могут Вас заинтересовать

39937. Общая характеристика и боевое применение проводной связи 40.18 KB
  При организации проводной связи необходимо учитывать: возможность обеспечения связи только между неподвижными пунктами; большую уязвимость кабельных линий от ядерных взрывов ударов авиации огня артиллерии противника от танков бронетранспортеров и автомашин; сложность прокладки и снятия на зараженной и труднопроходимой местности громоздкость материальной части и сравнительно малую скорость работ по прокладке и снятию линий связи; потребность в большом количестве сил и средств для перевозки прокладки эксплуатационного...
39938. Общая характеристика, способы организации ФПС 44.27 KB
  Подвижные средства применяются для обеспечения фельдъегерскопочтовой связи с вышестоящим штабом между пунктами управления подчиненных частей подразделений во всех видах боевых действий при передвижении и расположении войск на месте. При организации фельдъегерскопочтовой связи следует учитывать: характер местности; состояние и загруженность маршрутов скорость и проходимость подвижных средств; местонахождения пунктов управления и посадочных площадок; необходимость охраны фельдъегерей доставляющих секретные документы и воинских...
39939. Общая характеристика и боевое применение радиорелейной связи 52.82 KB
  В тоже время при организации радиорелейной связи необходимо учитывать зависимость ее от рельефа местности что вызывает необходимость тщательного выбора трассы линии связи невозможность работы или значительное уменьшение дальности действия радиорелейных станций в движении возможность перехвата передач и создания радиопомех противником. Способы организации радиорелейной связи Радиорелейная связь может быть организована по направлению по сети и по оси. Применение того или иного способа в каждом отдельном случае зависит от конкретных условий...
39940. Тропосферная связь 15.2 KB
  Тропосферные станции предназначаются для строительства прямых многоканальных линий связи большой протяженности. Дальность связи на одном интервале тропосферной линии может составлять 120–250 километров.
39941. Понятие о системе связи 23.76 KB
  В связи с этим можно дать следующее определение. Система военной связи – подсистема системы управления войсками силами и оружием обеспечивающая обмен информацией и автоматизацию управления. Оно отражает функциональное предназначение системы военной связи – обеспечение обмена информацией и автоматизацию управления.
39942. Требования к системе связи 39.5 KB
  По перечисленным свойствам к системе военной связи предъявляются требования: высокая боевая готовность; устойчивость; пропускная способность; мобильность; разведзащищенность; доступность; управляемость. Высокая боевая готовность системы военной связи Высокая боевая готовность системы военной связи – ее способность в любое время и в различных условиях обстановки выполнять задачи по обеспечению управления войсками. Требование высокой боевой готовности относится прежде всего к стационарным системам связи мирного времени и полевым системам...
39943. Войска связи Сухопутных войск, их назначение и состав 30 KB
  Соединения части и подразделения связи или в дальнейшем коротко войска связи являются специальными войсками и входят в состав всех видов Вооруженных сил РФ. Эти войска предназначены для развертвования и эксплуатации систем связи и обеспечения управления войсками силами во всех видах их боевой деятельности. На них также возлагаются задачи по развертвованнию и эксплуатации средств автоматизации управления проведению и организации технических мероприятиях по обеспечению связи и АСУ мероприятий по обеспечению безопасности связи Войска...
39944. Условия, влияющие на организацию и обеспечение связи в мотострелковом (танковом) батальоне в бою и специальной войсковой операции 24.5 KB
  Кроме этого на организацию связи в батальоне существенное влияние оказывает наличие сил и средств связи.
39945. Организация связи в мсб (тб) 25.5 KB
  Организация связи в бою в мсбтб зависит от многих факторов: условия перехода к обороне в наступление; роль и место батальона в боевом порядке полка боевой порядок и задачи батальона; принятая система управления; организация взаимодействия; наличие и состояние сил и средств связи; построение обороны средства усиления; характер местности и т. Основным способом организации проводной связи в мсб является направление проводной связи. Связь с командиром и штабом полка обеспечивается силами и средствами роты связи полка кабелем П274М согласно...