|
|
  |
Странное поведение EWAVR 4.21A, Возникновение ошибки при объявлении структуры |
|
|
|
Feb 29 2008, 23:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Mar 1 2008, 01:35)  ... похоже наш модератор задавил остальных своим автортиетом  Это не я! Невиноватый я! Честное слово, это не я придумал typedef  !!! Это отцы основатели ввели такую ненужную штуку и так задавили все последующие комитеты по С и С++ своим, понимаешь, авторитетом, что эти комитеты до сих пор этот пережиток прошлого "снижающий читабельность кода" не запретили. Может голосование устроим в поддержку отмены? Нежели еще примеры нужны, то подсказываю - области видимости typedef можно ограничить, а #define - нет - ну не разбирается препроцессор в языковых структурах... А как насчет: typedef unsigned char xbuff_t[X_SIZE]; Цитата(Baser @ Mar 1 2008, 01:35)  Про lint и misra слышал, но не применял, видимо поэтому у меня и возникают все эти вопросы. Хотя, как я понимаю, это больше нужно для переносимости кода а не для контроля типов. Не сколько для портируемости, сколько для много более жесткого контроля исходного текста с точки зрения возможных недопониманий компиляторами. Для серьезных применений достаточно часто требуют, хотя та-же MISRA это полный мрак  . Хотя для общего представления рекомендую разок прогнать. Цитата(Baser @ Mar 1 2008, 01:35)  я говорил только о снижении читабельности кода при сокрытии определений структур за typedef. Ну не скрывает сам typedef никакие определения структур. Совсем не скрывает. Третий раз повторяю - посмотрите второй пример правки Вашего исходника - ну нет там уже никаких typedef, а структуры по Вашему утверждению "cкрыты".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 1 2008, 14:21
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(zltigo @ Mar 1 2008, 01:12)  А как насчет: typedef unsigned char xbuff_t[X_SIZE]; Любите вы загадки задавать! Конечно, такое определение типа при помощи #define не слепить. Но я мыслю попроще, и это как раз тот пример, как я не буду писать, потому что: "снижается читабельность кода при сокрытии определений реальных объектов за typedef" (ИМХО) Я предпочитаю написать в пять раз длиннее, но понятней для меня. А чтобы понять ваш пример, мне пришлось голову поломать. Смысл я понял, но необходимость в такой записи - нет. Тупой прямой код понятней и ошибки точно так же выявляет: Код #define X_SIZE 2 typedef unsigned char xbuff_t[X_SIZE]; xbuff_t bufA[3];
unsigned char bufB[3][X_SIZE];
void foo(void) { bufA[1][1] = 55; bufA[1][2] = 66; // Warning[Pe175]: subscript out of range bufB[1][1] = 77; bufB[1][2] = 88; // Warning[Pe175]: subscript out of range } Удивило, а почему предупреждение, а не ошибка? Впрочем, о чем это я  : "На вкус и цвет товарища нет".
|
|
|
|
|
Mar 1 2008, 17:34
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Mar 1 2008, 17:21)  ... и ошибки точно так же выявляет: Попробуйте под разными компиляторами (и под C++), попробуйте как это будет работать когда все разнесено по разным файлам. Попробуйте оценить "удобство" "прямого" кода, кода в одном файле Вы написали: unsigned char bufB[3]; а в другом соответственно: extern unsigned char bufB[3]; - удобно за собой эту троечку таскать? Даже если она через #define где-то там в третьем месте определена? А ошибиться написав extern unsigned char bufB[5], или bufB[Y_SIZE] вместо X_SIZE? Цитата ..но понятней для меня. Так понятия наши меняются со временем. Полагаю, что Вы не родились с врожденным пониманием арифметики, но абсолютно уверен, что потом "поняли" и на данный момент никаких проблем не испытываете  . P.S. Подкинуть еще "загадок" про typedef? Можно и к понимабельности перейти, например, хотелось-бы увидеть, как выглядит прототип такой функции: Код typedef void (*func)(int); func foo( int data, func a ); в более понятной для Вас форме.
Сообщение отредактировал zltigo - Mar 1 2008, 19:51
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 1 2008, 21:33
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Вы неправильно поняли мои возражения против typedef и проэкстраполировали их на те области, про которые я не говорил. Я уже получаюсь какой-то ярый противник typedef  Если вы вернетесь к началу топика, то там я говорил только о простейших случаях определения структур и юнионов (причем применяющихся однократно). Цитата(zltigo @ Mar 1 2008, 19:34)  Можно и к понимабельности перейти, например, хотелось-бы увидеть, как выглядит прототип такой функции в более понятной для Вас форме. Код typedef void (*func)(int); func foo( int data, func a ); Тут вы вообще подкинули пример из учебников для иллюстрации того, для чего этот оператор именно и нужен. Конечно, можно написать "тупо-прямо" и конечно это будет нечитабельно. Никто и не спорит: Код void (*foo(int data, void(*a)(int)))(int); На тему применения различных приемов программирования можно пофилософствовать. По моему скромному разумению все более-менее сложные приемы можно прочувствовать только на практике. Пока я пишу маленькие проектики не превышающие несколько десятков Кслов кода (в самом крайнем случае), мне особо незачем переходить на высокие уровни абстракции в описаниях объектов. Достаточно примитивного начального уровня. Да и до конца понять и прочувствовать эти "высокие уровни" вряд-ли удасться. Поскольку реальной необходимости нет. А вот когда жизнь заставит, когда будет действительно большой проект, тогда это понимание само и придет (разумеется только при наличии базовых знаний  ).
|
|
|
|
|
Mar 1 2008, 22:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Mar 2 2008, 00:33)  Если вы вернетесь к началу топика, то там я говорил только о простейших случаях определения структур и юнионов (причем применяющихся однократно). Именно использование ранее только самых "простейших случаев" и привело собственно к появлению топика, когда потребовался чуть-чуть более "сложный" вариант. Ну и зачем, плодить сущности отдельно для "простых", отдельно для "сложных"? Цитата Тут вы вообще подкинули пример из учебников... Учебников давно не читал  , все больше "опыт"  , так-что кусочек из реального исходника. Цитата ...тогда это понимание само и придет. И больно стукнет прямо в лоб  . Лучше заранее подготовится  пока все просто  . Да и в простых вещах, например, при дополнении атрибутами const, volatile можно нарваться на совсем ненужные сюрпризы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 2 2008, 12:47
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Да, наверное, вы как всегда правы Цитата(zltigo @ Mar 2 2008, 00:43)  И больно стукнет прямо в лоб  . Лучше заранее подготовится  пока все просто  . Дык я об этом и пишу, только в более мягкой форме. И еще: зачем же я все эти разговоры завел? Получил бы ответ на свой первоначальный вопрос - и шмыг в свою норку - дальше копать, не разбираясь, а может я копаю не так или не туда  Я вот и пытаюсь "заранее подготовится пока все просто" и можно это сделать "мимоходом", с минимумом трудозатрат и максимумом пользы Цитата Да и в простых вещах, например, при дополнении атрибутами const, volatile можно нарваться на совсем ненужные сюрпризы. Если не трудно, не ради "разговор поддержать", а ради "заранее подготовится", можете привести примеры проблем или кратко описать их?
|
|
|
|
|
Mar 2 2008, 13:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Mar 2 2008, 15:47)  Да, наверное, вы как всегда правы  Я не стадаю манией величия, посему прав далеко не всегда, правда "выступать" стараюсь в случаях, когда есть уверенность близкая к абсолютной  . Цитата ..зачем же я все эти разговоры завел? Дык, зачем-же я все эти разговоры продолжаю  - чувствую, что "лед тронулся"  . Есть и еще тайный умысел - может когда поработать вместе придется  . Цитата ..можете привести примеры проблем или кратко описать их? Можно, вот иллюстрация к помянутому: Код typedef unsigned char* bufptr_t; #define bufptr_d char*
const bufptr_b a; bufptr_b const b; const bufptr_t c; bufptr_t const d; Только ведь все эти "семь бед" имеют одно радикальное решение  . Я просто всех гараблей не перечислю - в свое время хватило единожды наступить, дабы перейти раз и навсегда, и выбрость разом все эти проблемы из головы. В чужих исходниках, правда, встречать приходится  , что не дает совсем забыть  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 4 2008, 14:48
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
По ходу вопрос, может я и гоню.... Не получается обьявить тип структуры в которой этот тип и используется. Код typedef struct { blc_t next; int err; int state; }blc_t; Error[Pe020]: identifier "blc_t" is undefined
|
|
|
|
|
Mar 4 2008, 15:09
|

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

|
Так сделать невозможно - какой размер будет иметь структура, если она вмещает саму себя? Рекурсия-с! А если указатель на эту структуру, то так: Код typedef struct blc_t { blc_t *next; int err; int state; }blc_t;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 4 2008, 15:11
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(MALLOY2 @ Mar 4 2008, 16:48)  Не получается обьявить тип структуры в которой этот тип и используется. Ну, во-первых, вы пытаетесь применить тип, который вы еще не объявили (только находитесь в процессе объявления). А во-вторых, даже если бы вам компилятор это разрешил делать, у вас получилась бы рекурсия. Подумайте, что при этом получится: бесконечная вложенность, фракталы. Боюсь, вам памяти не хватит
|
|
|
|
|
Mar 4 2008, 15:13
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Сорри это я опечатался естественно там указатель. Код typedef struct blc_t { blc_t *next; int err; int state; }blc_t; Не работает. Код struct blc_t { struct blc_t *next; int err; int state; }blc_t; так работает
|
|
|
|
|
Mar 4 2008, 16:19
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(MALLOY2 @ Mar 4 2008, 18:13)  Код typedef struct blc_t { blc_t *next; int err; int state; }blc_t; Не работает. Какие проблемы? Естественно нельзя использовать тип, до его определения, но проблем-то и нет: Код typedef struct blc_s { struct blc_s *next; int err; int state; }blc_t;
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|