2017-01-13 5 views
0

I habe eine Funktion, die die Information von einem 1D-Vektor nimmt und spaltete es in 8 Spalten aus einem Array:die Werte aus einem 2D-Array

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; 
} 

Im Hauptcode I diese statische Array; die Abmessungen sind die gleichen wie adc_val:

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

Im Haupt Code würde Ich mag so etwas tun:

adc_val1 = ochoCanales(szBufferM); 

Aber ich bekomme die Fehlermeldung:

Expression must be modifiable value (adc_val1) 

Warum Dies geschieht? Wie kann ich das lösen ??

+0

Sie können‘ t Array-Zuweisung. Du brauchst 'adc_val1' um' double ** 'zu sein, wie' adc_val' in der Funktion. Deine Funktion muss auch 'double **' zurückgeben; Sie haben 'adc_val;' zurückgeben am Ende von dem, was momentan eine Funktion ist, die 'void' zurückgibt, so dass der angezeigte Code nicht deswegen kompiliert werden sollte. Vergessen Sie nicht, das Array freizugeben, nachdem Sie damit fertig sind. –

Antwort

0

Hier gibt es einige Probleme. Um zu beginnen - Ihre Funktion ist vom Typ void, also gibt es nichts zurück. wenn Sie eine adcval1 zurückkehren wollen - sollten Sie die Signatur ändern dass-

double ** ochoCanales(unsigned char * data) 

Mehr zu dem Punkt zu zeigen - da in der Haupt Code, den Sie bereits statisch für ein 2D-Array zugeordnet

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

Das bedeutet:

  1. Sie nicht zu adc_val1 zuweisen können - und Sie wollen nicht. adc_val1 zeigt auf einen Speicherblock und wenn Sie ihm einen anderen Block zuweisen würden, wäre der erste Block verloren.

  2. Es ist nicht notwendig, mehr Speicher innerhalb der Funktion zu reservieren - Sie haben bereits Speicher für das Array reserviert. so dass Sie nicht brauchen:

    for (u = 0;u < 8 + 1;u++) 
    { 
        adc_val[u] = (double *)malloc(VER_LENGTH*BUFFER_ADC/8 * sizeof(double *)); 
    } 
    

Nun, was Sie eigentlich tun wollen, ist in adc_val1 passieren, die Sie vorher zugeteilt, und füllen Sie es mit Ihren Werten

//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 
    } 
} 
Verwandte Themen