Ошибка при обьявлении метода после переноса кода с VS в C++ Builder


0

Подскажите пожалуйста, как исправить ошибку, которая возникла после переноса кода из VS в C++ Builder. Ошибка возникает при передаче статического 2-мерного массива в метод. В чем проблема, не пойму. В VS все работало без проблем. Заранее спасибо за помощь.

Код:

#pragma hdrstop
#pragma argsused

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

#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif

//визначення констант, що визначають розміри матриці

//кількість стовпців
const int WIDTH = 9;
//кількість рядків
const int HEIGHT = 9;
//кількість рядків останньої матриці
const int THIRD_HEIGHT = 3;


//метод для динамічного покрокового виведення матриці до консолі
void update_screen(int arr[WIDTH][HEIGHT], int speed)
{
    system("cls");
    for (int i = 0; i < HEIGHT; i++)
    {
        for (int j = 0; j < WIDTH; j++)
        {
            printf("%12d", arr[i][j]);
        }
        printf("n");
    }
    Sleep(speed);
}

int _tmain(int argc, _TCHAR* argv[]) 
{
    //встановлення локалі для символів кирилиці
    setlocale(LC_ALL, "rus");

    // у змінній s зберігаємо числа, якими будемо заповнювати матрицю
    // ініціалізуємо змінну початковим значенням WIDTH * HEIGHT
    int s = WIDTH * HEIGHT;

    // обявляємо 2-вимірний масив
    int arr[HEIGHT][WIDTH];

    // заповнюємо його початковими значеннями (-1)
    for (int i = 0; i < HEIGHT; i++)
    {
        for (int j = 0; j < WIDTH; j++)
        {
            arr[i][j] = -1;
            update_screen(arr, 200);
        }
    }

    // Заповнюємо периметр матриці за годинниковою стрілкою

    // верх
    for (int y = 0; y < WIDTH; y++)
    {
        arr[0][y] = s;
        s--;
        update_screen(arr, 350);
    }

    // права сторона
    for (int x = 1; x < HEIGHT; x++)
    {
        arr[x][WIDTH - 1] = s;
        s--;
        update_screen(arr, 350);
    }

    // низ
    for (int y = WIDTH - 2; y >= 0; y--)
    {
        arr[HEIGHT - 1][y] = s;
        s--;
        update_screen(arr, 350);
    }

    // ліва сторона
    for (int x = HEIGHT - 2; x > 0; x--)
    {
        arr[x][0] = s;
        s--;
        update_screen(arr, 350);
    }

    //Після заповнення периметру задаємо координати ячейки, яку необхідно заповнити наступною
    int c = 1;
    int d = 1;

    //Заповнюємо середину матриці
    while (s > 1)
    {
        //Наступні цикли почергово відпрацьовують заповнюючи ячейки
        //Кожний цикл заповнює окрему сторону (верх, низ, право, ліво)
        //Внутрішній цикл зупиняється, якщо наступна ячейка має значення, відмінне від -1

        //Рухаємося вправо
        while (arr[c][d + 1] == -1)
        {
            arr[c][d] = s;
            s--;
            d++;
            update_screen(arr, 350);
        }

        //Рухаємося вниз
        while (arr[c + 1][d] == -1)
        {
            arr[c][d] = s;
            s--;
            c++;
            update_screen(arr, 350);
        }

        //Рухаємося вліво
        while (arr[c][d - 1] == -1)
        {
            arr[c][d] = s;
            s--;
            d--;
            update_screen(arr, 350);
        }

        //Рухаємося вгору
        while (arr[c - 1][d] == -1)
        {
            arr[c][d] = s;
            s--;
            c--;
            update_screen(arr, 350);
        }
    }

    // При такому рішенні у центрі матриці завжди залишається незаповнена ячейка
    arr[HEIGHT / 2][WIDTH / 2] = s;
    update_screen(arr, 350);

    printf("Матриця №1nn");

    // Створюємо матрицю адрес елементів першої матриці
    int* address[HEIGHT][WIDTH];
    for (int i = 0; i < HEIGHT; i++)
    {
        for (int j = 0; j < WIDTH; j++)
        {
            address[i][j] = &arr[i][j];
            printf("%15p",address[i][j]);
        }
        printf("n");
    }
    printf("Матриця №2nn");

    int third[THIRD_HEIGHT][WIDTH];

    for (int i = 0; i < THIRD_HEIGHT; i++)
    {
        for (int j = 0; j < WIDTH; j++)
        {
            third[i][j] = *address[j][i];
            printf("%15d",third[i][j]);
        }
        printf("n");
    }
    printf("Матриця №3nn");

    system("pause");
    return 0;
}
Источник
  •  83
  •  1
  • 22 янв 2018 2018-01-22 09:33:50
А ради интереса, С++Буилдер это Борландовский? 199х выпуска? — 23 янв 20182018-01-23 14:37:45.000000
Ошибка [bcc32 Error] File1.c(27): E2313 Constant expression required, возникает в месте void update_screen(int arr[WIDTH][HEIGHT], int speed) 22 янв 20182018-01-22 09:56:55.000000
какая ошибка-то? — 22 янв 20182018-01-22 09:53:24.000000

1 ответ

1

Ширина и высота, теперь нужна constexpr (если в C++11) или

# define WIDTH 9
# define HEIGHT 9

В C должно пахать и так.

  • 22 янв 2018 2018-01-22 11:30:14
Обновите код, может быть любая описка... — 22 янв 20182018-01-22 11:41:42.000000
Спасибо большое, ошибка исчезла, но появилась новая [bcc32 Error] File1.c(27): E2290 Array bounds missing ] в том же месте. Не пойму, что я не так объявляю. — 22 янв 20182018-01-22 11:41:42.000000
Кажется вы путаете constexpr (добавленный в С++11) и constant expression (которые были всегда). С появлением constexpr как раз правила резко расслабились. — 22 янв 20182018-01-22 11:41:42.000000
Все компиляторы видят, что переменную не меняют и автоматически пихают внутрь кода. По сути constexpr. А сейчас, видите, нужно быть правильным. — 22 янв 20182018-01-22 11:41:42.000000
Они всегда должны были быть такими... А проблема из-за кривого билдера. — 22 янв 20182018-01-22 11:41:42.000000