jenya7 0 10 октября, 2016 Опубликовано 10 октября, 2016 (изменено) · Жалоба 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 получили количество мнемоник. иногда я туплю нипадецки. Изменено 10 октября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 10 октября, 2016 Опубликовано 10 октября, 2016 · Жалоба Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 октября, 2016 Опубликовано 11 октября, 2016 (изменено) · Жалоба Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них. то есть вместо sizeof должен быть strlen? ну количество байтов это количество чаров. все честно. Изменено 11 октября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 11 октября, 2016 Опубликовано 11 октября, 2016 · Жалоба то есть вместо sizeof должен быть strlen? ну количество байтов это количество чаров. все честно. в Вашем случае да, а вот если бы был какой нибудь int ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба ну какой же тут strlen()? Тут мы объявляем массив указателей на функции static const CHAR *(* const readfns[sizeof(read_str)/4])(void) = { una, fnb, fnc, ... }; Таким образом размер массива мы должны знать на этапе компиляции. Т.е. выражение внутри [] должно быть constant expression, соответственно strlen(), выполняющийся в рантайме, вы туда ну никак не подставите! По поводу того что мнемоника занимает 4 байта, а sizeof() возвращает кол-во байт вы разобрались уже. sizeof() на этапе компиляции известен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба ну количество байтов это количество чаров. все честно. бывают случаи когда это не так. http://processors.wiki.ti.com/index.php/By...e_C28x_Compiler Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба бывают случаи когда это не так. тем не менее в приведенном выше коде sizeof(read_str)/4 всё равно даст ожидаемый результат ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба бывают случаи когда это не так.Почему? Там именно так и сказано:Since the TMS320C28x char is 16 bits (to make it separately addressable), a byte is also 16 bits. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 октября, 2016 Опубликовано 13 октября, 2016 · Жалоба Так я ж че и говорю, всё будет работать 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться