LINUX.ORG.RU

Сумма чисел двумерного массива во время компиляции

 


0

0

Сяп, лор!

Хочу посчитать сумму элементов в двумерном массиве:

constexpr int sum_2d_array(const int* arr, int n, int m)
{
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            s += arr[i*m + j];
    return s;
}

int main()
{
    constexpr int arr[3][2] = { 1, 2, 3, 4, 5, 6, };
    static_assert(sum_2d_array(&arr[0][0], 3, 2) == 21);
}

Но компилятор не компилирует (https://wandbox.org/permlink/2zCNyzWAT4Txk2uV), говорит, что доступ к элементам просходит за границами массива.

Я вроде нигде за границы не вылазею. В чём проблема?

(Код написан по аналогии с кодом в Страуструпе для печати 2d-массива:

void print_mij(int∗ m, int dim1, int dim2)
{
    for (int i = 0; i!=dim1; i++) {
        for (int j = 0; j!=dim2; j++)
            cout << m[i∗dim2+j] << '\t'; // obscure
        cout << '\n';
    }
}
)

&arr[3][2]

Выход за границы. У тебя самый дальний элемент это [2][1]
Да и вообще тебе нужно передавать массив в функцию просто как

arr

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 2)

cppreference

the function body must be either deleted or defaulted or contain only the following:

null statements (plain semicolons) static_assert declarations typedef declarations and alias declarations that do not define classes or enumerations using declarations using directives exactly one return statement.

Мне кажется, затея изначально была обречена на провал.

anarch
()
Ответ на: комментарий от anarch

Почему?

я много чего делаю в constexpr...

Автору: посмотри, возможно тебе подойдёт такой вариант функции:

https://wandbox.org/permlink/aYQhQIFCNNA4WALL

template<int n, int m>
constexpr int sum_2d_array(const int (&arr)[n][m])
{
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            s += arr[i][j];
    return s;
}

int main()
{
    constexpr int arr[3][2] = { 1, 2, 3, 4, 5, 6, };
    static_assert(sum_2d_array(arr) == 21);
}
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от Aswed

Выход за границы. У тебя самый дальний элемент это [2][1]

Действительно. Глаза замылились. Исправил на [0][0]. Но дело не в этом. Всё равно ошибка.

unskill
() автор топика
Ответ на: комментарий от Aswed

Да и вообще тебе нужно передавать массив в функцию просто как

Не пройдёт по типам.

unskill
() автор топика
Ответ на: комментарий от unskill

Что-за ошибка-то? Если ты все еще пытаешься передать результат функции, выполняемой в рантайме, static_assert-у, то так и задумано :)

anarch
()
Ответ на: комментарий от unskill

Долблюсь в глаза, видимо - там g++2a и сам массив constexpr. Каюсь.

anarch
()

arr[3][2] в терминах С++ это массив размерности 3 содержащий массивы размерности 2.

s += arr[i*m + j];

-- тут происходит доступ более чем ко 2 элементу, должно быть:

constexpr int sum_2d_array(const int **arr, int n, int m)
/* bla-bla */
s += arr[i][j];
/* bla-bla */
sum_2d_array(arr, 3, 2)

Проверять лень.

deadskif
()
Ответ на: комментарий от unskill

Что бы сошлись типы:

template <int n, int m>
constexpr int sum_2d_array(const int arr[n][m])
{
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            s += arr[i][j];
    return s;
}

int main()
{
    constexpr int arr[3][2] = { 1, 2, 3, 4, 5, 6, };
    static_assert(sum_2d_array<3,2>(arr) == 21);
}
Проверил.

deadskif
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.