1

Тема: Багатовимірні масиви і покажчики

Хайо. Спершу хочу сказати, що хочу вбити когось. А тепер до діла.
В мене є двовимірний масив, і його треба передати в функцію, аби вона його змінила.
Як то зробит?
Я вже як тільки не пробую, і *, і **, і передаю по-різному, а воно завжди пише про помилку!

2

Re: Багатовимірні масиви і покажчики

Small example

void arrprint(int* arr, int m, int n) {
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            cout << *(arr + i*n + j) << ' ';
        }
        cout << endl;
    }
}

int main() {
    int a[3][6] ={
        {3,7,8,0,1,4},
        {2,9,1,4,7,6},
        {5,2,7,6,1,9}
    };
    arrprint(&a[0][0], 3, 6);
}

3 Востаннє редагувалося Kane (24.12.2014 21:47:57)

Re: Багатовимірні масиви і покажчики

#define one 2
#define two 3

func(int arr[][two], int n) {};
// або
// func(int (*arr)[two], int n) {};

int main() {
    int arr[one][two] = { ... };
    func(arr, one);
}
Подякували: FakiNyan1

4

Re: Багатовимірні масиви і покажчики

а не мона якось так?

void f(int** m);

int[2][2] m;
f(&m);

?

5

Re: Багатовимірні масиви і покажчики

FakiNyan написав:

а не мона якось так?

void f(int** m);

int[2][2] m;
f(&m);

?

Ні, бо компілятор не буде знати розмірності, такий буде працювати лише з динамічними масивами.

Подякували: FakiNyan1

6

Re: Багатовимірні масиви і покажчики

Запам'ятовуємо: в C нема двовимірних масивів, а ім'я масиву - синонім вказівника на нульовий елемент. Тобто
int a[2][3]; - це масив з двох масивів (а не масив 2x3), а a - вказівник на масив з 3-х елементів.
Тому:
- або вказуйте всі розміри, крім першого (бо щоб знайти елемент a[1][0], треба знати розмір sizeof(a[0]) );
- або робіть пилкоподібний масив (масив з int*, кожен з яких посилається на новий масив);
- або робіть єдиний масив a[2*3], і адресуйте його a[ 3 * i + j ] замість a[ i ][ j ].
Останній варіант має підваріант з кастуванням типу, але то вже зовсім закручене.

Подякували: 0x9111A, FakiNyan, Arete4

7

Re: Багатовимірні масиви і покажчики

void f(int **matrix, const int rows, const int cols){
    /* ... */
}

8

Re: Багатовимірні масиви і покажчики

tiktak написав:
void f(int **matrix, const int rows, const int cols){
    /* ... */
}

А "рвані" масиви як фікситимете? :)

9

Re: Багатовимірні масиви і покажчики

Навіщо усі ці збочення з арифметикою, якщо цілком "природно" буде зробити як я запропонував вище?

#include <stdio.h>

#define ROWS 2
#define COLS 3

void print_array(int a[][COLS], int rows) {
    printf("{");
    for (int i = 0; i < rows; i++) {
        printf("[");
        for (int j = 0; j < COLS; j++)
            printf(j != COLS-1 ? "%d, " : "%d", a[i][j]);

        printf(i != rows-1 ? "], " : "]");
    }
    printf("}");
}

int main() {
    int arr[ROWS][COLS] = { { 1111, 2222, 3333 }, { 4444, 5555, 6666 } };
    print_array(arr, ROWS);

    return 0;
}

10

Re: Багатовимірні масиви і покажчики

Kane, а коли масив не статичний то що тоді?

arr = (int*) malloc(ROWS*COLS);

11

Re: Багатовимірні масиви і покажчики

Chemist-i написав:

Kane, а коли масив не статичний то що тоді?

arr = (int*) malloc(ROWS*COLS);

Друга справа. Чомусь, проблему ТС, я зрозумів саме в статичному вигляді.

12

Re: Багатовимірні масиви і покажчики

Chemist-i написав:

Kane, а коли масив не статичний то що тоді?

arr = (int*) malloc(ROWS*COLS);

а там хіба не ROWS*COLS*sizeof(int)?

13

Re: Багатовимірні масиви і покажчики

FakiNyan написав:
Chemist-i написав:

Kane, а коли масив не статичний то що тоді?

arr = (int*) malloc(ROWS*COLS);

а там хіба не ROWS*COLS*sizeof(int)?

Так, правильно.

14

Re: Багатовимірні масиви і покажчики

int **arr = (int**)malloc(ROWS * sizeof(int*));

for (int i = 0; i < ROWS; i++)
    arr[i] = (int*)malloc(COLS * sizeof(int));

15

Re: Багатовимірні масиви і покажчики

І чого вас в ті malloc'и понесло...

16

Re: Багатовимірні масиви і покажчики

Bartash написав:
tiktak написав:
void f(int **matrix, const int rows, const int cols){
    /* ... */
}

А "рвані" масиви як фікситимете? :)

В умові не йдеться про рвані масиви.
А так начебто універсальна функція.

17

Re: Багатовимірні масиви і покажчики

Щоб биттям п’яткою в груди довести знання паном Chemist-i теми динамічної пам’яті.

18

Re: Багатовимірні масиви і покажчики

tiktak написав:
Bartash написав:
tiktak написав:
void f(int **matrix, const int rows, const int cols){
    /* ... */
}

А "рвані" масиви як фікситимете? :)

В умові не йдеться про рвані масиви.
А так начебто універсальна функція.

В умові, мо, й не йдеться, а от передбачати такі "граблі" доцільно. У нас викладач у "ШАГу" мав гарну звичку: тестуючи при нас наші "домашки", він полюбляв ввести яке-небудь значення "з підковиркою". І якщо програма таку (цілком же можливу - мало мавп юзатиме ваш софт? ;) ) бяку пропускала та/чи падала - не допрацювання. :)
Проектуючи будинок, слід враховувати ймовірність землетрусів.