Общая память на C struct не работает правильно - PullRequest
0 голосов
/ 01 октября 2018

Я работаю над небольшой программой, которая имитирует игру-головоломку, в которой я могу напечатать состояние доски или перемещаться вверх, вниз, влево или вправо, но у меня возникла проблема при попытке реализовать ее с общей памятью,У меня есть структура в заголовочном файле, который имеет символ * [4] [4], который используется в обоих других файлах

Настройка выглядит так

// Instance of Board for the current state of the game.
Obj obj; // is initialized but not here for sake of space and post size

struct obj *pobj;

int main()
{
    key_t key = ftok("/afs/x/y/z", 'b');
    //Make shared memory
    size_t BLOCK_SIZE = sizeof(struct Board);
    int shmid = shmget(key, BLOCK_SIZE, 0666 | IPC_CREAT);
    if (shmid == -1)
    {
        fail("Cannot create shared memory");
    }
    pobj = (Obj *) shmat(shmid, 0, 0);
    if (pobj == (struct Board *) -1)
    {
        fail("Can't map shared memory segment into address space");
    }obj
    // setting pobj values to obj values
    for(int i = 0; i < OBJ_ROWS; i++){
        for(int j = 0; j < OBJ_COLS; j++){
            pobj->field[i][j] = obj.field[i][j];
        }
    }

    //Loop through and print the values just put in, I get the correct values I put in

    shmdt( pobj );
    return 0;
}

Я получаюправильные значения, которые я ввел в

, но когда я получаю доступ через это

key_t key = ftok("/afs/x/y/z", 'b');
//Make shared memory
int shmid = shmget( key, BLOCK_SIZE, 0666 | IPC_CREAT );//this IPC_CREAT not needed
if( shmid == -1){
    fail( "Cannot create shared memory" );
}
pobj=  (OBJ *) shmat(shmid, 0, 0);
if(pobj == (struct Obj *) -1){
    fail( "Cannot map shared memory segment into address space" );
}
// loop through and print out values

, я не получаю ничего, кроме значений мусора, таких как

@ @ ▒▒▒▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒
▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒

Что вызывает различия в этихзначения?

Редактировать: Исправлена ​​проблема путем удаления IPC_CREAT из второго файла, который вызывал проблемы, и изменения массива на int [4] [4];

1 Ответ

0 голосов
/ 01 октября 2018

Вы создали новый блок общей памяти в обеих программах.Вы хотите создать память в reset.c и прочитать ее в fifteen.c.Удалите IPC_CREAT в fifteen.c.Вы можете узнать больше здесь , где системный вызов указывает:

IPC_CREAT

Создать новый сегмент.Если этот флаг не используется, то shmget () найдет сегмент, связанный с ключом, и проверит, есть ли у пользователя разрешение на доступ к сегменту.смысл.Строковые литералы являются массивами, то есть указателями, а вы сделали Board просто связкой указателей.Единственными данными, которыми вы поделились в объекте общей памяти, были указатели, которые бесполезны для fifteen.c, fifteen.c для просмотра фактических данных символов.Вместо этого fifteen.c видит группу указателей, которые указывают на строковые литералы в reset.c.Это не особенно полезно, что fifteen.c должен делать с кучей случайных адресов?fifteen.c хочет видеть настоящие буквы - вероятно, нулевые терминированные массивы.Вам нужно сделать так, чтобы ваш объект Board содержал двумерный массив символьных массивов (определенной длины, скажем, 16).Затем вы можете обмениваться данными персонажа взад-вперед в вашем файле.

...