返回2D数组中的值

时间:2017-01-13 03:15:27

标签: c

我有一个函数,它从一维向量中获取信息并将其从一个数组中分成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)

为什么会这样?我怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

这里有几个问题。首先 - 你的函数是void类型,所以它不返回任何东西。如果要返回adcval1 - 您应该更改签名以显示 -

double ** ochoCanales(unsigned char * data)

更重要的是 - 因为在您的主代码中,您已经静态分配了2D数组

double adc_val1[CAN_CANALES][(VER_LENGTH*BUFFER_ADC)/CAN_CANALES];

这意味着:

  1. 您无法分配给adc_val1 - 而且您不想这样做。 adc_val1指向一些内存块,如果你要为它分配另一个块 - 第一个就会丢失。

  2. 不需要在函数内部分配更多内存 - 您已经为数组预留了内存。所以你不需要:

    for (u = 0;u < 8 + 1;u++)
    {
       adc_val[u] = (double *)malloc(VER_LENGTH*BUFFER_ADC / 8 * sizeof(double *));
    }
    
  3. 现在,您实际想要做的是传递您事先分配的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
        }
    }