我有一个函数,它从一维向量中获取信息并将其从一个数组中分成8列:
void ochoCanales(unsigned char * data)
{
UINT64 INTEGRATE1 = 0, INTEGRATE2 = 0, P, Q;
P = 0, Q = 0;
double ** adc_val;
adc_val = (double *)malloc(8 * sizeof(double*));
int u;
for (u = 0;u < 8 + 1;u++)
{
adc_val[u] = (double *)malloc(VER_LENGTH*BUFFER_ADC / 8 * sizeof(double *));
}
while (P + 1 <= BULK_BUFFER_SIZE)
{
INTEGRATE1 = data[P + 7];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 6];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 5];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 4];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 3];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 2];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P + 1];
INTEGRATE1 = (INTEGRATE1 << 8) | data[P];
INTEGRATE2 = data[P + 15];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 14];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 13];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 12];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 11];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 10];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 9];
INTEGRATE2 = (INTEGRATE2 << 8) | data[P + 8];
P = P + 16;
adc_val[0][Q] = (INTEGRATE1 & 0x000000000000FFFF);
adc_val[1][Q] = (INTEGRATE1 & 0x00000000FFFF0000) >> 16;
adc_val[2][Q] = (INTEGRATE1 & 0x0000FFFF00000000) >> 32;
adc_val[3][Q] = (INTEGRATE1 & 0xFFFF000000000000) >> 48;
adc_val[4][Q] = (INTEGRATE2 & 0x000000000000FFFF);
adc_val[5][Q] = (INTEGRATE2 & 0x00000000FFFF0000) >> 16;
adc_val[6][Q] = (INTEGRATE2 & 0x0000FFFF00000000) >> 32;
adc_val[7][Q] = (INTEGRATE2 & 0xFFFF000000000000) >> 48;
Q++;
INTEGRATE1 = 0; INTEGRATE2 = 0;
}
return adc_val;
}
在主代码中我有这个静态数组;尺寸与adc_val
相同:
double adc_val1[CAN_CANALES][(VER_LENGTH*BUFFER_ADC)/CAN_CANALES];
在主要代码中,我想做这样的事情:
adc_val1 = ochoCanales(szBufferM);
但我收到错误:
Expression must be modifiable value (adc_val1)
为什么会这样?我怎么解决这个问题?
答案 0 :(得分:0)
这里有几个问题。首先 - 你的函数是void类型,所以它不返回任何东西。如果要返回adcval1 - 您应该更改签名以显示 -
double ** ochoCanales(unsigned char * data)
更重要的是 - 因为在您的主代码中,您已经静态分配了2D数组
double adc_val1[CAN_CANALES][(VER_LENGTH*BUFFER_ADC)/CAN_CANALES];
这意味着:
您无法分配给adc_val1 - 而且您不想这样做。 adc_val1指向一些内存块,如果你要为它分配另一个块 - 第一个就会丢失。
不需要在函数内部分配更多内存 - 您已经为数组预留了内存。所以你不需要:
for (u = 0;u < 8 + 1;u++)
{
adc_val[u] = (double *)malloc(VER_LENGTH*BUFFER_ADC / 8 * sizeof(double *));
}
现在,您实际想要做的是传递您事先分配的adc_val1,并用您的值填充
//replace sizeRow, sizeCol with the actual sizes
void ochoCanales(unsigned char * data, double arr[sizeRow][sizeCow])
{
UINT64 INTEGRATE1 = 0, INTEGRATE2 = 0, P, Q;
P = 0, Q = 0;
int u;
while (P + 1 <= BULK_BUFFER_SIZE)
{
//The rest of your code
}
}