Перерахунок індексів вручну

Особливості роботи з двовимірними масивами

Приклад використання динамічної пам'яті

У наступному прикладі динамічна пам'ять використовується для зберігання елементів масиву заздалегідь невизначеного розміру, введення якого припиняється з появою у вхідному потоці числа більше або дорівнює 1e300. При цьому, спочатку під масив виділяється сегмент пам'яті, максимального розміру, потім розмір блоку пам'яті встановлюється відповідним фактичним розміром масиву.

void * Malloc (size_t size)

void * p = malloc (size);

void * Realloc (void * block, size_t size)

void * p = realloc (block, size);

unsigned i, n, maxN, goodIO;

A = (double *) Malloc (maxN = UINT_MAX);

for (goodIO = n = 0; n

printf ( "A [.] =", n); scanf ( "% lf", temp);

A = (double *) Realloc (A, n * sizeof (double));

/ * Обробка масиву. Для прикладу - друк. * /

for (i = 0; i

printf ( "% 10.3lf", A [i]);

if ((i + 6)% 5 == 0) printf ( "\ n");

Максимальний розмір сегмента в байтах завжди дорівнює величині найбільшого беззнакового цілого числа, значення якого визначає константа UINT_MAX з заголовки .

У програмі використовуються допоміжні функції Malloc () і Realloc () для забезпечення контролю виділення пам'яті. У них функція exit () з прототипом в файлі використовується для переривання роботи програми.

При роботі з динамічними двовимірними масивами виникають певні труднощі, пов'язані з тим, що в мові Сі немає вбудованих засобів для обліку довжини рядка при індексації. Тому програміст сам повинен забезпечити можливість індексації двовимірного масиву. Крім того, повинна бути передбачена можливість коректної передачі динамічного масиву в функцію. У наступних розділах на прикладі програми заповнення прямокутний матриці випадковими значеннями розглянемо різні підходи до вирішення цієї проблеми.

У наступному прикладі двовимірний масив представляється у вигляді одновимірного, а розташування кожного елемента двовимірного масиву в одновимірному визначається сумою номера стовпчика і твори номера рядка на довжину рядка. Спосіб індексації однаковий як в викликає функції, так і в викликаються.

#define MAXVAL 1000

void * Malloc (size_t size);

void RandomMatr (double * Matr, int n, int l);

void OutMatr (char * name,

double * Matr, int n, int m);

Схожі статті