Почему значение этого члена меняется?

Я создаю объект с именем «ID1000» типа «Карты». Объект содержит член «Platforms [] []». Платформы [] [] — это двумерный массив.

class Maps{
int Platforms[][4]
} ID1000;

ID1000.Platforms[0][0] = 100;

Здесь я установил Platforms [0] [0] на 100.
Тем не менее, когда я выполняю эту строку кода …

al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0, "TargetY: %f", 800 - TargetY);

имя_объекта [0] [0] внезапно изменяется с 100 на 1065353216. Эта строка является просто функцией 2-й графической библиотеки Allegro, которая рисует текст в окне. Я не могу понять, почему это вообще связано с ценностью моего члена.

Пожалуйста, если у вас есть идеи или предложения, я был бы признателен.

Вот полная программа …

#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <math.h>
#include <iostream>

const int WIDTH = 1000;
const int HEIGHT = 800;class Maps {
public:
int NumPlat;
int MapWidth;
int Platforms[][4];
};

int main(int argc, char **argv)
{
Maps ID1000;
ID1000.Platforms[0][0] = 100;

ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_FONT *font18;

float TargetY = 0;

if(!al_init())
return -1;

display = al_create_display(WIDTH, HEIGHT);

if(!display)
return -1;

al_install_keyboard();
al_init_image_addon();
al_init_font_addon();
al_init_ttf_addon();
al_init_primitives_addon();

font18 = al_load_font("BALTH___.ttf", 18, 0);

std::cout << ID1000.Platforms[0][0];
al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0, "TargetY: %f", 800 - TargetY);  //display horizontal position on screen
std::cout << ID1000.Platforms[0][0];

al_destroy_font(font18);

return 0;
}

-1

Решение

Массив int Platforms[][4] является пустой (это массив нулевых строк по 4 дюйма в каждой). Это также недопустимо в программе на C ++. (это действительно C, где он называется «гибкий элемент массива». Предполагаемое использование для вас — перераспределить объект и обратиться к дополнительной памяти после объекта, используя синтаксис доступа к массиву)

Расположение в памяти, к которому вы обращаетесь при доступе ID1000.Platforms[0][0] (первый int в первом ряду) находится вне массива, а на самом деле вне ID1000 объект.

В этот момент вы находитесь в неопределенном поведении, все может происходить. Я предполагаю, что ячейка памяти, к которой вы обращаетесь, указатель, используемый указателем displayгде вы пишете результат al_create_display(),

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]