Перейти к содержанию
    

Определение длинны массива.

есть функция в ней вызывается другая функция.

 

unsigned char func(flash unsigned char* comand)

{

unsigned char L;

L=sizeof(comand)

***

***

return L;

}

 

Вызывается так

 

void main

{

func("\1\0\2\0\3\2"); 0x01 0x00 0x02 0x00 0x03 0x02

};

 

В общем размер массива определяет как 4. Хотя должно быть 6. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sizeof в Вашем коде определяет размер указателя, который в Вашем случае равен 4.

Для определения размера содержимого, расположенного по указателю следует использовать другие методы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет такого понятия, как указатель на массив. Вы передается указатель на беззнаковый char, возможно первый элемент массива. Сколько их у вас там непрерывно в памяти записано - компилятор не знает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хм, но передаю то я указатель на массив...

 

А вы передавайте вместе с указателем еще и длину. Все так делают, т.к. вызывающей процедуре лучше известно, что она суёт в вызываемую функцию, а внутри той функции с этим разобраться трудно (практически невозможно).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы передавайте вместе с указателем еще и длину.

Или засуньте в конец массива какое-нибудь значение, которое ни при каких обстоятельствах не может промелькнуть в середине его. И мерьте длину до него. Наподобие сишных строк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет такого понятия, как указатель на массив. Вы передается указатель на беззнаковый char, возможно первый элемент массива. Сколько их у вас там непрерывно в памяти записано - компилятор не знает.

Да, логично. Придётся передавать ещё и длинну.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте так -

unsigned char func(flash unsigned char* comand, size_t length)
{
...
}

#define ARG(array) array,sizeof(array)-1

// Использование -
func(ARG("\1\2\3\4\5\6"));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define ARG(array) array,sizeof(array)-1

 

// Использование -

func(ARG("\1\2\3\4\5\6"));

 

Редкостное извращение, не делайте так. Работает только с аргументами которые константные строки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если не известна длина, то можно ввести "специальный код из 2х байт", который указывает что это конец.

 

т.е. вводим комбинацию 0xAD 0xDF

если встретилась 0xAD и 0xDF, то конец массива и второй 0xDF уже не относиться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...