Jump to content

    
Sign in to follow this  
MKdemiurg

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

Recommended Posts

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

 

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:

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
хм, но передаю то я указатель на массив...

 

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

 

Share this post


Link to post
Share on other sites
А вы передавайте вместе с указателем еще и длину.

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

Share this post


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

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

 

 

Share this post


Link to post
Share on other sites
#define ARG(array) array,sizeof(array)-1

 

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

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

 

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

 

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this