suigetsu
@suigetsu
ぬるぽちゃん

Как засунуть n — мерный массив в аргумент функции?

Я не знаю как засунуть n - мерный массив в аргумент функции. Пожалуйста, объясните женщине как это сделать. Думала как обычно сделать с одномерным массивом, но компилятор не проглатывает.
  • Вопрос задан
  • 3557 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Ну вот, опять знатоки советуют добавить звёздочек и указателей на указатели ):

Все примеры дальше передают в функцию трёхмерный массив и присваивают v значение его элемента p[1][2][3].

Если функция принимает массив фиксированных размерностей, то прямо так можно и написать:
int f(int p[][20][30])
{
    int i = 1, j = 2, k = 3;
    int v = p[i][j][k];
}
...
int p[10][20][30];
f(p);

Первую размерность (самую старшую) можно опустить.

Если же нет, то перед вами следующий выбор:

- у вас старый стандарт С (до С99) -- передавайте указатель на самый первый элемент и значения размерностей. Внутри функции пересчитывайте набор индексов многомерного массива в линейный индекс:
int f(int *p, int n2, int n3) // p[][n2][n3]
{
    int i = 1, j= 2, k = 3;
    int v = p[(((i * n2) + j) * n3) + k]; // v = p[i][j][k];
}
...
int p[10][20][30];
f(&p[0][0][0], 20, 30);


- у вас С99 или новее: воспользуйтесь поддержкой языка:
int f(int n2, int n3, int p[][n2][n3])
{
    int i = 1, j = 2, k = 3;
    int v = p[i][j][k];
}
...
int p[10][20][30];
f(20, 30, p);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
но компилятор не проглатывает.

хихи

Указатель на указатель... и все пройдет.
Ответ написан
Комментировать
Как-то так:

int function(int [2][3][4][5]); // возможно не все размерности нужно указывать, точно не помню
или
int function(int ******); // количество звёздочек определяет цену коньяка количество измерений массива

Вообще, больше двух звёздочек нежелательно, можно запутаться.
Ответ написан
Комментировать
@mayorovp
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы