Как я могу записать переменные в общую память или прочитать их? - PullRequest
0 голосов
/ 17 января 2019

Моя программа запускает дочерние процессы с fork, чтобы запросить родительский процесс о времени UNIX. Я сделал функцию с общей памятью для записи тиков (UNIX-Time) и номера клиента в struct Array с MAXENTRIES индексов. Я не могу понять, почему значения, переданные в функцию f_timeLog (int, int), не отображаются в массиве.

Если я печатаю с

printf("From: %d\tTICKS: %d\n", logSM[*counter]->vonWem, logSM[*counter]->ticks);

Значения говорят всегда: 0. Если я отлаживаю программу, она записывает первое значение logSM [0] правильно, но далее нет.

Спасибо за помощь!

typedef struct
{
    int vonWem;
    int ticks;
}timeLog [MAXENTRIES];

void f_timeLog(int who, int ticks)
{
    int *counter;
    timeLog *logSM;
    logSM = (timeLog*) shmat(TimeLog, NULL, (SHM_R|SHM_W));
    counter = (int*) shmat(IDCounter, NULL, (SHM_R|SHM_W));
    P(SemWriteLog);
    logSM[*counter]->vonWem = who;
    logSM[*counter]->ticks = ticks;
    *counter= *counter+1;
    if(*counter >= MAXENTRIES) *counter= *counter - MAXENTRIES;
    V(SemWriteLog);
}

Вывод: logSM [0] vonWem = X, ticks = xxxxxxxx и logSM [1] и далее: vonWem = 0, ticks = 0;

1 Ответ

0 голосов
/ 17 января 2019

logSM - это указатель на массив, а не массив указателей.

Поскольку logSM является указателем, мы должны разыменовать его. И поскольку он указывает на массив объекта структуры (экземпляра), мы не можем использовать оператор «стрелка».

Так что использование должно быть как

(*logSM)[*counter].ticks = ticks;

Более "естественным" решением является переопределение псевдонима типа timeLog, которое будет просто самой структурой.

Так что-то вроде

typedef struct
{
    int vonWem;
    int ticks;
} timeLog;

Тогда вы можете использовать logSM, как и любой другой указатель или массив:

logSM[*counter].ticks = ticks;
...