реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Определение длины строкового массива, правильное использование sizeof
Jenya7
сообщение Oct 10 2016, 06:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Код
const CHAR *fna(void);    // Example function prototype

static void process_read(const CHAR *buf)
{
    CHAR *cmdptr;
    UCHAR offset;
    const CHAR *replyptr;
    
    static const CHAR read_str[] =
    "0SV 0SN 0MO 0WF 0MT 0MP 0SW 1SP 1VO 1CC 1CA 1CB
     1ST 1MF 1CL 1SZ 1SS 1AZ 1AS 1BZ 1BS 1VZ 1VS 1MZ
     1MS 2SP 2VO 2CC 2CA 2CB 2ST 2MF 2CL 2SZ 2SS
     2AZ 2AS 2BZ 2BS 2VZ 2VS 2MZ 2MS ";    

    static const CHAR *
        (* const readfns[sizeof(read_str)/4])(void) =
        {
        una, fnb, fnc, ...
        };
    
    cmdptr = strstr(read_str, buf);
    
    if (cmdptr != NULL)
    {    
    /*
         * cmdptr points to the valid command, so compute offset,
     * in order to get entry into function jump table
         */
    offset = (cmdptr - read_str) / 4;  

    /* Call function and get pointer to reply*/
    replyptr = (*readfns[offset])();

    /* rest of the code goes here */
    }
}

Сам код понятен. Есть массив мнемоник read_str. Если в функцю в качестве аргумента передали мнемонику и мы нашли ее в списке cmdptr = strstr(read_str, buf); то вызываем функцию привязанную к мнемонике replyptr = (*readfns[offset])(); . Вопрос почему тут const readfns[sizeof(read_str)/4])(void) деление на 4? убрать пробелы чтоб размер readfns соответсвовал размеру read_str? но деление на 4 не решает этого.

а...понял...мнемоника 3 чара + пробел итого 4. поделили на 4 получили количество мнемоник. иногда я туплю нипадецки.

Сообщение отредактировал Jenya7 - Oct 10 2016, 06:26
Go to the top of the page
 
+Quote Post
Lagman
сообщение Oct 10 2016, 21:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 11 2016, 08:20
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Lagman @ Oct 11 2016, 03:30) *
Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них.

то есть вместо sizeof должен быть strlen?
ну количество байтов это количество чаров. все честно.

Сообщение отредактировал Jenya7 - Oct 11 2016, 08:23
Go to the top of the page
 
+Quote Post
Lagman
сообщение Oct 11 2016, 13:11
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Jenya7 @ Oct 11 2016, 11:20) *
то есть вместо sizeof должен быть strlen?
ну количество байтов это количество чаров. все честно.

в Вашем случае да, а вот если бы был какой нибудь int ...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 13 2016, 07:07
Сообщение #5


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



ну какой же тут strlen()?
Тут мы объявляем массив указателей на функции
Код
static const CHAR *(* const readfns[sizeof(read_str)/4])(void) =
        {
        una, fnb, fnc, ...
        };

Таким образом размер массива мы должны знать на этапе компиляции. Т.е. выражение внутри [] должно быть constant expression, соответственно strlen(), выполняющийся в рантайме, вы туда ну никак не подставите!
По поводу того что мнемоника занимает 4 байта, а sizeof() возвращает кол-во байт вы разобрались уже. sizeof() на этапе компиляции известен.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
_pv
сообщение Oct 13 2016, 09:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Jenya7 @ Oct 11 2016, 14:20) *
ну количество байтов это количество чаров. все честно.

бывают случаи когда это не так.
http://processors.wiki.ti.com/index.php/By...e_C28x_Compiler

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 13 2016, 10:00
Сообщение #7


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
бывают случаи когда это не так.
тем не менее в приведенном выше коде sizeof(read_str)/4 всё равно даст ожидаемый результат wink.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 13 2016, 10:04
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_pv @ Oct 13 2016, 12:54) *
бывают случаи когда это не так.
Почему? Там именно так и сказано:
QUOTE
Since the TMS320C28x char is 16 bits (to make it separately addressable), a byte is also 16 bits.




--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 13 2016, 10:10
Сообщение #9


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Так я ж че и говорю, всё будет работать
http://en.cppreference.com/w/cpp/language/sizeof
Цитата
Notes
Depending on the computer architecture, a byte may consist of 8 or more bits, the exact number being recorded in CHAR_BIT.
sizeof(char), sizeof(signed char), and sizeof(unsigned char) always return 1.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 16:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016