Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h> // malloc free
- #include <string.h> // memset
- //-------------------------------------------------------------------
- // Объект двумерный массив
- struct LONG_2D
- {
- long** array;
- long* buf;
- size_t width; // Ширина
- size_t height; // Высота
- };
- //-------------------------------------------------------------------
- //-------------------------------------------------------------------
- // Прототипы функций
- //-------------------------------------------------------------------
- // Функция создает двумерный массив заданного размера
- // w - ширина
- // h - высота
- // Возвращает указатель на выделенный массив или NULL при неудаче
- long** alloc_2d_array( struct LONG_2D* la, size_t w, size_t h );
- // Функция освободжает память, выделенную под массив
- void free_2d_array( struct LONG_2D* la );
- // Функция выводит содержимое двухмерного массива на экран
- void show_2d_array( struct LONG_2D* la );
- //-------------------------------------------------------------------
- int main( int argc, char* argv[] )
- {
- struct LONG_2D ar_obj;
- long** ar;
- // координаты в массиве
- size_t x;
- size_t y;
- // Размер массива
- size_t width = 3; // Ширина
- size_t height = 4; // Высота
- long count = 0;
- printf( "Динамический двумерный массив размером %lux%lu\n",
- width, height );
- // Породим массив 3 на 4 элемента
- ar = alloc_2d_array( &ar_obj, 3, 4 );
- if( ar )
- {
- // Проинициализируем массив
- for( y = 0; y < height; y++ )
- {
- for( x = 0; x < width; x++ )
- {
- ar[y][x] = count;
- count++;
- }
- }
- // Выведем массив на экран
- show_2d_array( &ar_obj );
- // Освободим выделенную память
- free_2d_array( &ar_obj );
- }
- else
- {
- perror( "malloc" );
- }
- return 0;
- }
- //-------------------------------------------------------------------
- // Функция создает двумерный массив заданного размера
- // w - ширина
- // h - высота
- // Возвращает указатель на выделенный массив или NULL при неудаче
- long** alloc_2d_array( struct LONG_2D* la, size_t w, size_t h )
- {
- size_t col; // Столбец
- // Очистим объект от мусора
- memset( la, 0, sizeof(struct LONG_2D) );
- // Выделим кусок памяти под буфер для массива
- la -> buf = (long*)malloc( w * h * sizeof(long) );
- // Если выделение прошло успешно, то продолжим
- if( la -> buf )
- {
- // Сохраним размер двухмерного массива
- la -> width = w;
- la -> height = h;
- // Очистим буфер от мусора
- memset( la->buf, 0, w * h * sizeof(long ) );
- // Выделим память под массив указателей
- la -> array = (long**)malloc( h * sizeof(long*) );
- // Проинициализируем массив указателями на
- // начало строк в буфере
- if( la -> array )
- {
- for( col = 0; col < h; col++ )
- {
- // Сохраним указатель на столбец
- la->array[ col ] = &la->buf[ col*w ];
- }
- }
- else
- {
- free( la-> buf );
- la -> buf = NULL;
- }
- }
- return la -> array;
- }
- //-------------------------------------------------------------------
- // Функция освободжает память, выделенную под массив
- void free_2d_array( struct LONG_2D* la )
- {
- if( la -> array )
- {
- free( la->array );
- la -> array = NULL;
- }
- if( la->buf )
- {
- free( la->buf );
- la -> buf = NULL;
- }
- }
- //-------------------------------------------------------------------
- // Функция выводит содержимое двухмерного массива на экран
- void show_2d_array( struct LONG_2D* la )
- {
- long row; // Строка
- long col; // Столбец
- for( row = 0; row < la -> height; row++ )
- {
- for( col = 0; col < la -> width; col++ )
- {
- printf( "%ld", la->array[row][col] );
- if( col < la -> width - 1 )
- {
- printf( "\t" );
- }
- else
- {
- printf( "\n" );
- }
- }
- }
- }
- //-------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement