-1

「マップ」タイプの「ID1000」というオブジェクトを作成しています。このオブジェクトには、メンバー「Platforms[][]」が含まれています。Platforms[][] は 2 次元配列です。

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);

object_name[0][0] が 100 から 1065353216 に突然変更されます。この行は、テキストをウィンドウに描画する 2D グラフィックス ライブラリ 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;
}
4

1 に答える 1

2

配列int Platforms[][4]空です(行が 0 で、それぞれ 4 つの整数の配列です)。C++ プログラムでも無効です。(ただし、これは「柔軟な配列要素」と呼ばれる有効な C です。使用目的は、オブジェクトを過剰に割り当て、配列アクセス構文を使用してオブジェクトの後に余分なメモリをアドレス指定することです)

アクセスするときにアクセスするメモリの場所ID1000.Platforms[0][0](最初の行の最初の int) は、配列の外側にあり、実際にはID1000オブジェクトの外側にあります。

この時点で、未定義の動作になり、何かが発生する可能性があります。あなたがアクセスしているメモリの場所はdisplay、 の結果を書き込むポインタによって使用される場所であると思いますal_create_display()

于 2012-12-22T03:36:46.443 に答える