Задать вопрос
@evg_96

Почему не работают массивы переменной длины?

Дошел в книге до главы про массивы переменной длины. Ввожу пример, но поступают жалобы якобы параметр не допускается. В чем проблема поясните пожалуйста.

PS. VSC

Upd. Видимо проблема именно в компиляторе... (тут все заработало)

#include <stdio.h>
#include <conio.h>

#define ROWS 3
#define COLS 4

int sum2d(int rows, int cols, int arr[rows][cols]); // Warning

int main(void)
{
    int arr[ROWS][COLS] = {
        { 2, 4, 6, 8 },
        { 3, 5, 7, 9 },
        { 12, 10, 8, 6 }
    };

    int i, j;
    int rs = 3;
    int cs = 10;

    int more_arr[ROWS - 1][COLS + 2] = {
        { 20, 30, 40, 50, 60, 70 },
        { 5, 6, 7, 8, 9, 10 }
    };

    int varr[rs][cs]; // Warning

    for (i = 0; i < rs; i++)
        for (j = 0; j < cs; j++)
            varr[i][j] = i * j + j;

    printf("Tradition array 3x5\n");
    printf("Sum of all items = %d\n", sum2d(ROWS, COLS, arr));

    printf("Tradition array 2x6\n");
    printf("Sum of all items = %d\n", sum2d(ROWS - 1, COLS + 2, arr));

    printf("Not tradition array 3x10\n");
    printf("Sum of all items = %d\n", sum2d(rs, cs, varr));

    _getch();

    return 0;
}

int sum2d(int rows, int cols, int arr[rows][cols]) // Warning
{
    int row, col;
    int total = 0;

    for (row = 0; row < ROWS; row++)
        for (col = 0; col < COLS; col++)
            total += arr[row][col];

    return total;
}
  • Вопрос задан
  • 254 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Поддержка VLA (и вообще всех новых расширений языка), действительно, зависит от компилятора.
Например в MSVC, по моему, до сих пор поддержки VLA нет.
Официально микрософт заявляет о поддержке С90: https://docs.microsoft.com/en-us/cpp/c-language/an...
Но в компиляторе присутствуют расширения языка (по умолчанию включенные), список расширений можно посмотреть в описании опции компилятора /Zc, и VLA там нет.
При том, что присутствуют некоторые расширения из С++17.
Кроме того присутствуют некоторые вещи, которые появились в С99, но их в "расширениях" нет, они уже вошли в компилятор "по умолчанию", например переменное количество аргументов в #define.
Ответ написан
Ваш ответ на вопрос

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

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