Изменить массив, который я передаю функции без возврата в C - PullRequest
0 голосов
/ 09 февраля 2020

Это моя функция:

void eeprom_read_page(unsigned int address, unsigned char lengh, unsigned char *data[40])
{
    //unsigned char data[lengh] , i;
    unsigned char  i;
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS_W);
    i2c_write(address>>8);          //high byte address
    i2c_write(address*0xff);        //low byte address
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS_R);
    for(i=0 ; i<(lengh-1) ; i++)
    {
       *data[i+4]=i2c_read(1);
    }
    *data[lengh+3]=i2c_read(0);
    i2c_stop();
}

И вот как я использую это где-то в моем коде:

eeprom_read_page(   ( (rx_buffer1[1]*256)+rx_buffer1[2] ) , rx_buffer1[3] , &tx_buffer1 );

И это мой массив определения:

#define RX_BUFFER_SIZE1 40
char rx_buffer1[RX_BUFFER_SIZE1],tx_buffer1[RX_BUFFER_SIZE1];

, но tx_buffer1 не получает значения, которые я даю в data []. Я хочу изменить tx_buffer1, но не использую return. Любая помощь?

1 Ответ

1 голос
/ 09 февраля 2020

Массив объявлен следующим образом

#define RX_BUFFER_SIZE1 40
char rx_buffer1[RX_BUFFER_SIZE1],tx_buffer1[RX_BUFFER_SIZE1];

, используемым в выражении

&tx_buffer1

, делает тип выражения char ( * )[RX_BUFFER_SIZE1].

В то же время соответствующий параметр функции

unsigned char *data[40]

имеет тип unsigned char **, поскольку компилятор неявно настраивает параметр, имеющий тип массива, на указатель на объект типа элемента массива.

И более того параметр функции использует спецификатор unsigned char, а массив, объявленный со спецификатором char.

Таким образом, вызов функции недопустим. Не существует неявного преобразования между типами указателей.

Нет никакого смысла передавать массив в функцию по ссылке, потому что в любом случае массивы являются неизменяемыми значениями l.

Если вы хотите передать массив по ссылке, чтобы узнать его размер в функции параметр функции должен быть объявлен как

char ( *data )[40]
...