Ожидаемый безусловный идентификатор перед '.'токен в сценарии отображения экрана - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь создать базовый экран консоли, используя символы, обозначающие позиции на экране.У меня проблема со строками "char _Screen [screenSize.x] [screenSize.y] = MainDisplay.InitializeScreen (screenSize, defaultIcon);"и "display.DisplayScreen (_Screen);"Они пытаются вызвать функцию из экземпляра объекта «дисплей».Я предполагаю, что не использую правильный синтаксис, в этих строках или при определении классов.Буду очень признателен, если вы скажете мне, что я делаю неправильно и как я могу это исправить

Спасибо.

Вот код:

#include <iostream>

using namespace std;

struct Vector2 {
   static int x;
   static int y;
};

class Object {
     public:

    static Vector2 Size;
    static Vector2 Position;
    static char icon;
};

class display {
    public:

        void DisplayScreen(char Screen[100][100])
        {
            for (int i = 0; i < sizeof(Screen) / sizeof(*Screen);i++)
            {
                for (int j = 0; j < sizeof(Screen[1]) / sizeof(*Screen[1]);j++)
                {
                    cout << Screen[i][j];
                }
                cout << endl;
            }
        }

        char InitializeScreen(Vector2 Size,char icon)
        {
            char Screen[Size.x][Size.y];
            for (int i = 0; i < Size.y;i++)
            {
                for (int j = 0; j < Size.x;j++)
                {
                    Screen[i][j] = icon;
                }
            }
        }
};

int main()
{
    Vector2 screenSize;
    screenSize.x = 100;
    screenSize.y = 100;
    char defaultIcon = '.';

    display MainDisplay;
    char _Screen[screenSize.x][screenSize.y] = MainDisplay.InitializeScreen(screenSize,defaultIcon);
    display.DisplayScreen(_Screen);
}

1 Ответ

0 голосов
/ 24 февраля 2019

Я просто попытаюсь охватить некоторые существенные недоразумения, которые у вас есть в отношении C ++.Приведенный выше код не исправим, вам нужно начать заново.В частности, вам нужно научиться использовать векторы вместо массивов.Массивы имеют все виды причуд в C ++, которые затрудняют их использование, векторы проще.

1) Вы не можете объявлять массивы, если размер массива не равен постоянной времени компиляции ,Так что это недопустимо

char Screen[Size.x][Size.y];

, потому что Size.x и Size.y являются переменными.Это было бы хорошо

char Screen[100][100];

Если вам нужен массив переменного размера, метод должен использовать динамическое распределение .Простой способ сделать динамическое распределение - использовать класс std::vector.Вот двумерный вектор char в C ++

std::vector<std::vector<char>> Screen(Size.x, std::vector<char>(Size.y));

2) Вы не можете вернуть массив из функции, поэтому даже игнорируя точку 1, это недопустимо

char _Screen[screenSize.x][screenSize.y] = MainDisplay.InitializeScreen(screenSize,defaultIcon);

Опять же, обычный ответ на проблемы с массивами - использовать std::vector, который можно вернуть из функции.

3) Вы не можете передать массив функции в C ++.Таким образом, хотя этот код допустим

    void DisplayScreen(char Screen[100][100])

Screen, но не является массивом в этом коде, он является указателем.Любая попытка объявить массив как параметр функции в C ++ вместо этого преобразуется в указатель.Это особенно смущает начинающих.Ответом на эту проблему является использование std::vector вместо массивов.Векторы могут быть переданы в качестве параметров в функции.

4) Вы не можете использовать sizeof, чтобы получить размер массива, на который указывает указатель.Так что этот код допустим, но не работает так, как вы ожидаете

for (int i = 0; i < sizeof(Screen) / sizeof(*Screen);i++)

Этот код будет работать, если Screen был массивом, но, как объяснено в пункте 3, это не так, это указатель.Ответом на эту проблему является использование std::vector вместо массивов, поскольку у векторов есть встроенный метод size, который возвращает размер векторов, например:

for (int i = 0; i < Screen.size(); i++)

5) Наконец, вы объявили свой экран вв двух разных местах, в main и в InitializeScreen.Это разные экраны, что, вероятно, не то, что вы хотели.Глядя на ваш код, я могу догадаться, что правильное место для объявления вашего экрана на самом деле находится в классе отображения, поскольку кажется, что вы хотите, чтобы оба метода класса display ссылались на один и тот же экран.Разработка классов - это еще один аспект программирования, с которым начинающим приходится бороться.

Короче говоря, вернитесь к своей книге и прочитайте главу о векторах или, по крайней мере, прочитайте соответствующий учебник по массивам и указателям, который объясняетмного ограничений использования массивов.

...