2016-09-07 4 views
-1

Извините за сообщение. Я исследовал это, но ... до сих пор нет радости в том, чтобы заставить это работать. В вопросе также есть две части. Пожалуйста, проигнорируйте код кода TWI в качестве конкретного приложения. Мне нужна помощь по проблемам с гайками и болтами C.Функции C, возвращающие массив

Итак ... чтобы уменьшить использование памяти для проекта, я начал писать свой собственный TWI (wire.h lib) для ATMEL328p. Его не помещали в lib еще как «1», я понятия не имею, как это сделать ... дойдет до этого, и «2» продолжит работу, в которую все добавляется.

Проблема, с которой я столкнулась, заключается в чтении нескольких байтов.

Задача 1 У меня есть функция, которая мне нужно, чтобы вернуть массив

byte *i2cBuff1[16]; 

void setup() { 
    i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16); 
} 

/////////////////////READ BYTES//////////////////// 
byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) { 
    static byte result[i2cNumBytes]; 
    for (byte i = 0; i < i2cNumBytes; i ++) { 
     result[i] += i2cAdd + i2cReg; 
    } 

    return result; 
} 

Что я понимаю: о) Я объявленная Static BYTE массива в функции которой я точки как аргумент возврата функции. Вызов функции запрашивает возврат указателя для байтового массива, который поставляется.

Хорошо ... это не работает .... Я проверил несколько сайтов, и я думаю, что это должно сработать. Сообщение об ошибке я получаю:

MPU6050_I2C_rev1:232: error: incompatible types in assignment of 'byte* {aka unsigned char*}' to 'byte* [16] {aka unsigned char* [16]}' 
i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16); 

Задача 2 Ok говорят IF выше пример кода работал. Я пытаюсь уменьшить объем памяти, который я использую в своем эскизе. Используя любую память в функции, даже несмотря на то, что память (необходимость) освобождается после вызова функции, функция должна каким-то образом зарезервировать количество «пространства», когда вызывается функция. В идеале я бы хотел избежать использования статических переменных внутри функции, которые дублируются в основной программе.

Кто-нибудь знает компромисс с повторным вызовом функции .... i.e зацикливание вызова функции с помощью оператора сдвига битов, поскольку он предназначен для вызова функции один раз, чтобы завершить процесс и вернуть ... массив? Или в этом все дело в том, что C на самом деле не поддерживает возвращение массива в первую очередь.

Надеюсь, что это имело смысл, просто хочу получить лучшее от тех немногих, что у меня есть.

BR Дэнни

+0

Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать минимальный, полный и проверенный пример. – Olaf

+0

@Olaf, вы забыли добавить ссылку на этот раз. Asker, пожалуйста [смотрите здесь!] (Http://stackoverflow.com/help/mcve) –

+0

Спасибо Olaf ..... Я отредактирую вопрос – hoboBob

ответ

1

Эта линия:

byte *i2cBuff1[16]; 

объявляет i2cBuff1 как массив из 16 указателей byte*. Но i2cReadBytes не возвращает массив указателей, он возвращает массив байтов. Декларация должна быть:

byte *i2cBuff1; 

Другая проблема заключается в том, что статический массив не может иметь динамический размер. Массив переменной длины должен быть автоматическим массивом, так что его размер может меняться каждый раз, когда вызывается функция. Вы должны использовать динамическое распределение с malloc() (вместо этого я использовал calloc(), потому что он автоматически обнуляет память).

byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) { 
    byte *result = calloc(i2cNumBytes, sizeof(byte)); 
    for (byte i = 0; i < i2cNumBytes; i ++) { 
     result[i] += i2cAdd + i2cReg; 
    } 

    return result; 
} 
+0

Привет, Barmer, Спасибо за ответ, я попробовал ваше решение, но получил результат ...... MPU6050_I2C_rev1: 361: ошибка: размер хранилища «результата» не является постоянным статический байт result [i2cNumBytes]; ..... Поздно и завтра снова посмотрим спасибо за вход ^ – hoboBob

+0

Добавил исправление для ответа. – Barmar

+0

Ok .... malloc is ... hmm как функция, которая (x, y) m – hoboBob

Смежные вопросы