2016-11-05 9 views
0

матрица 10х10 создается следующим образом:Как передать/получить двойной указатель на/из структуры?

double **c = (double **)pvPortMalloc(ROW * sizeof(double*)); 
for (i = 0; i < ROW; i++) 
    c[i] = (double *)pvPortMalloc(COL * sizeof(double)); 

Я хотел бы передать double **c к struct:

struct AMessage { 
    char cMessageID; 
    double (**doublePtr); 
} xMessage; 

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

+1

Вы попробовали 'xMessage.doublePtr = c;'? – mch

ответ

1

Во-первых, прямо в ответ на ваш вопрос, если вы так определяете матрицу и хотите сохранить ее указатель в строчке ct, вы можете сделать это через прямое назначение. Ведя из вашего примера, вы могли бы сделать doublePointer члена в struct AMessage точки в память вы выделяемая на c просто через что-то вроде этого:

struct AMessage am; 
am.doublePtr = c; 

Но если Вы желаете создать матрицу, где каждая строка, как гарантируется, имеет такое же количество элементов, как и любая другая строка, лучше подходящая для представления этого, представляет собой 2D-массив, а не массив указателей на другие массивы.

2D-массив в C может быть объявлена ​​следующим образом:

double matrix[ROW][COL]; 

это объявляет переменную с именем matrix, с ROW строк и столбцов COL.

Там нет ничего, чтобы остановить вас в том числе это определение прямо в определении вашего struct, что делает определение вашей структуры, как это:

struct AMessage 
{ 
    char MessageId; 
    double matrix[ROW][COL]; 
}; 

(Благодаря chqrlie предложившего это)

Если вы определенно хотите, чтобы указатель на 2D-массив находился в вашем struct (например, вы можете захотеть иметь один большой массив, на который ссылаются два из ваших struct), вам нужно знать, что 2D-массив в C действительно является 1D-массивом, только адресованные определенным образом.

Вы можете динамически выделить память для использования матрицы с одним вызовом таНоса:

double *c = malloc(ROW * COL * sizeof(*c)); 

Одним из вариантов для получения доступа к элементу элемента в столбце j, строка i является:

double a = c[ROW * j + i]; 

, но это, очевидно, немного неуклюжий, действительно, удобнее получить элемент i, j примерно таким:

double a = d[j][i]; 

Чтобы определить указатель d, что мы можем разыменовать это, нам нужно подумать о том, какой тип d[j] есть. Это не так, как многие думают, double *, скорее это указатель на массив ROWdouble s.В синтаксисе C вы бы объявить d так:

double (*d)[ROW]; 

Наконец решения вашего вопроса, я бы определил свой-структуру, как это:

struct AMessage 
{ 
    char MessageId; 
    double (*matrix)[ROW]; 
} 

Присвоение этой struct будет выглядеть примерно так:

struct AMessage am; 
am.matrix = malloc(ROW * COL * sizeof(*am.matrix)); 
am.matrix[j][i] = 42; // Assigns 42 to row j, column i 
+0

Вы также можете записать, что член 'matrix' структуры может быть определен как' double matrix [ROW] [COL]; 'и использоваться непосредственно с тем же синтаксисом. – chqrlie

+0

Это хорошая идея и, вероятно, самый приятный способ сделать это в большинстве случаев. Я вложил его, спасибо! –

+0

Также дайте прямой ответ на вопрос OP: сохранение 'c' в struct просто определяет член как' double ** matrix', а простое присваивание указателя выполняет задание. 3 различных способа обработки 2-мерных матриц. – chqrlie