Здравствуйте, zzealot, Вы писали:
Z>Здравствуйте.
Z>...
Z>Z>// complex scalar type
Z>typedef struct tagCOMPLEXSCALAR {
Z> double real;
Z> double imag;
Z>} COMPLEXSCALAR;
Z>// complex array type
Z>typedef struct tagCOMPLEXARRAY {
Z> unsigned int rows;
Z> unsigned int cols;
Z> double **hReal; // hReal[cols][rows], == NULL when the real part is zero
Z> double **hImag; // hImag[cols][rows], == NULL when the imaginary part is zero
Z>} COMPLEXARRAY;
Z>
Z>...
Z>Однако заметил, что в объявлении типа не указываются размеры массива, а просто :
Z>double **hReal;
Z>Отсюда вопрос — а как же компилятор генерирует код, например такой:
Y->hReal[i][j] = 555;
Z>ведь для этого как минимум надо знать величину второй размерности, т.е. Y->hReal[i][10]
Вот это
double **hReal;
не вытянутый в линию двумерный массив, а массив указателей на линейные массивы из double;
а за этим
Y->hReal[i][j] = Z;
стоит что-то вроде
mov eax,Y
mov edx,[eax+ offset (hReal)]
mov ecx,[i]
mov edx,[edx+ecx*4]
mov ecx,[j]
mov edx,[edx+ecx*8]
lea eax,Z;
mov [edx],[eax]
mov [edx+4],[eax+4]