Присвоить указатель на двумерный массив void в структуре в C99 - PullRequest
0 голосов
/ 14 марта 2019

У меня есть 2d буфер, который я хотел бы передать потоку вместе с другими значениями, поэтому мне нужно переместить его в структуру. Когда я пытаюсь это сделать, я не могу снова получить доступ к значениям в моей структуре, и мне нужна помощь.

Вот мой буфер:

void* mybuff[8][16384];

Я хотел бы сохранить указатель на этот 2D-массив в структуре, подобной этой:

typedef struct  {
  int i;
  void *mybuff;
} arg_struct_t;

Однако, если я пытаюсь получить доступ к значениям:

    arg_struct_t *args = malloc(sizeof(arg_struct_t));
    args->i = index;
    args->mybuff = mybuff;

    fprintf(stderr, "%p\n", args->mybuff[0][0]);

Я получаю сообщение об ошибке:

main.c:104:47: warning: dereferencing ‘void *’ pointer [enabled by default]
           fprintf(stderr, "%p\n", args->mybuff[0][0]);
                                               ^
main.c:104:50: error: subscripted value is neither array nor pointer nor vector
           fprintf(stderr, "%p\n", args->mybuff[0][0]);
                                                  ^

Я думаю, что мне нужно больше рассказать С99 о форме данных, которые я хочу вставить в свою структуру, но я не могу понять, как это сделать правильно. Я ценю любую помощь или понимание здесь.

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Компилятор не знает, какой адрес в памяти он должен вычислять здесь:

args->mybuff[0][0]

, потому что args->mybuff это просто указатель на void.Для обработки такого выражения компилятору требуется информация о 1) размере элементов массива и 2) хотя бы одном из измерений массива.Следующий код является более правильным:

typedef void* TBuff[8][16834];
TBuff mybuff;

typedef struct  {
  int i;
  TBuff * mybuff;
} arg_struct_t;

arg_struct_t *args = malloc(sizeof(arg_struct_t));
args->i = index;
args->mybuff = &mybuff;
fprintf(stderr, "%p\n", (*args->mybuff)[0][0]);
1 голос
/ 14 марта 2019

Вот как сохранить адрес mybuff и как использовать этот указатель позже для доступа к значениям.

int main()
{
    // Starting array    
    int* mybuff[8][16384];

    // Save the address of mybuff into 'p'. 'p' is a pointer to (int*)'s
    int** p = &mybuff[0][0];

    // Access the location of row=3, col=4 using 'p'
    int r = 3;
    int c = 4;
    *(p + (r*16384 + c)) = (int*) 123; // 123 is the value to assign

    return 0;
}

Так что вам также нужно будет передать размеры строк и столбцов (8 и 16384) в вашей структуре тоже для разыменования значений.Я упустил проверку границ в примере для краткости, но вы должны сделать это в реальном коде.

1 голос
/ 14 марта 2019

С риском получить вас дальше над головой:

typedef struct  {
  int i;
  void* mybuff[8][16384];
} arg_struct_t;

Но общая природа пустоты * - это общая типизация, которая противоречит многомерным массивам. Этот код выглядит странно, как только появляется этот тип, и, возможно, что-то еще не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...