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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Странное поведение EWAVR 4.21A, Возникновение ошибки при объявлении структуры
zltigo
сообщение Feb 29 2008, 23:12
Сообщение #16


Гуру
******

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



Цитата(Baser @ Mar 1 2008, 01:35) *
... похоже наш модератор задавил остальных своим автортиетом biggrin.gif beer.gif

Это не я! Невиноватый я! Честное слово, это не я придумал typedef smile.gif!!! Это отцы основатели ввели такую ненужную штуку и так задавили все последующие комитеты по С и С++ своим, понимаешь, авторитетом, что эти комитеты до сих пор этот пережиток прошлого "снижающий читабельность кода" не запретили. Может голосование устроим в поддержку отмены? smile.gif
Нежели еще примеры нужны, то подсказываю - области видимости typedef можно ограничить, а #define - нет - ну не разбирается препроцессор в языковых структурах...
А как насчет:
typedef unsigned char xbuff_t[X_SIZE];

Цитата(Baser @ Mar 1 2008, 01:35) *
Про lint и misra слышал, но не применял, видимо поэтому у меня и возникают все эти вопросы. Хотя, как я понимаю, это больше нужно для переносимости кода а не для контроля типов.

Не сколько для портируемости, сколько для много более жесткого контроля исходного текста с точки зрения возможных недопониманий компиляторами. Для серьезных применений достаточно часто требуют, хотя та-же MISRA это полный мрак sad.gif. Хотя для общего представления рекомендую разок прогнать.

Цитата(Baser @ Mar 1 2008, 01:35) *
я говорил только о снижении читабельности кода при сокрытии определений структур за typedef.

Ну не скрывает сам typedef никакие определения структур. Совсем не скрывает. Третий раз повторяю - посмотрите второй пример правки Вашего исходника - ну нет там уже никаких typedef, а структуры по Вашему утверждению "cкрыты".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 1 2008, 14:21
Сообщение #17


Просто 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
  }
Удивило, а почему предупреждение, а не ошибка?

Впрочем, о чем это я cool.gif : "На вкус и цвет товарища нет".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 1 2008, 17:34
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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?
Цитата
..но понятней для меня.

Так понятия наши меняются со временем. Полагаю, что Вы не родились с врожденным пониманием арифметики, но абсолютно уверен, что потом "поняли" и на данный момент никаких проблем не испытываете smile.gif.

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
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 1 2008, 21:33
Сообщение #19


Просто Che
*****

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



Вы неправильно поняли мои возражения против typedef и проэкстраполировали их на те области, про которые я не говорил. Я уже получаюсь какой-то ярый противник typedef smile.gif Если вы вернетесь к началу топика, то там я говорил только о простейших случаях определения структур и юнионов (причем применяющихся однократно).

Цитата(zltigo @ Mar 1 2008, 19:34) *
Можно и к понимабельности перейти, например, хотелось-бы увидеть, как выглядит прототип такой функции в более понятной для Вас форме.
Код
typedef void (*func)(int);
func foo( int data, func a );

Тут вы вообще подкинули пример из учебников для иллюстрации того, для чего этот оператор именно и нужен. Конечно, можно написать "тупо-прямо" и конечно это будет нечитабельно. Никто и не спорит:
Код
void (*foo(int data, void(*a)(int)))(int);


На тему применения различных приемов программирования можно пофилософствовать. По моему скромному разумению все более-менее сложные приемы можно прочувствовать только на практике. Пока я пишу маленькие проектики не превышающие несколько десятков Кслов кода (в самом крайнем случае), мне особо незачем переходить на высокие уровни абстракции в описаниях объектов. Достаточно примитивного начального уровня. Да и до конца понять и прочувствовать эти "высокие уровни" вряд-ли удасться. Поскольку реальной необходимости нет. А вот когда жизнь заставит, когда будет действительно большой проект, тогда это понимание само и придет (разумеется только при наличии базовых знаний biggrin.gif ).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 1 2008, 22:43
Сообщение #20


Гуру
******

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



Цитата(Baser @ Mar 2 2008, 00:33) *
Если вы вернетесь к началу топика, то там я говорил только о простейших случаях определения структур и юнионов (причем применяющихся однократно).

Именно использование ранее только самых "простейших случаев" и привело собственно к появлению топика, когда потребовался чуть-чуть более "сложный" вариант. Ну и зачем, плодить сущности отдельно для "простых", отдельно для "сложных"?
Цитата
Тут вы вообще подкинули пример из учебников...

Учебников давно не читал sad.gif sad.gif sad.gif, все больше "опыт" sad.gif, так-что кусочек из реального исходника.
Цитата
...тогда это понимание само и придет.

И больно стукнет прямо в лоб sad.gif. Лучше заранее подготовится smile.gif пока все просто smile.gif.
Да и в простых вещах, например, при дополнении атрибутами const, volatile можно нарваться на совсем ненужные сюрпризы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 2 2008, 12:47
Сообщение #21


Просто Che
*****

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



Да, наверное, вы как всегда правы wink.gif

Цитата(zltigo @ Mar 2 2008, 00:43) *
И больно стукнет прямо в лоб sad.gif. Лучше заранее подготовится smile.gif пока все просто smile.gif.

Дык я об этом и пишу, только в более мягкой форме. И еще: зачем же я все эти разговоры завел? Получил бы ответ на свой первоначальный вопрос - и шмыг в свою норку - дальше копать, не разбираясь, а может я копаю не так или не туда biggrin.gif Я вот и пытаюсь "заранее подготовится пока все просто" и можно это сделать "мимоходом", с минимумом трудозатрат и максимумом пользы cool.gif

Цитата
Да и в простых вещах, например, при дополнении атрибутами const, volatile можно нарваться на совсем ненужные сюрпризы.

Если не трудно, не ради "разговор поддержать", а ради "заранее подготовится", можете привести примеры проблем или кратко описать их?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 2 2008, 13:02
Сообщение #22


Гуру
******

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



Цитата(Baser @ Mar 2 2008, 15:47) *
Да, наверное, вы как всегда правы wink.gif

Я не стадаю манией величия, посему прав далеко не всегда, правда "выступать" стараюсь в случаях, когда есть уверенность близкая к абсолютной smile.gif.
Цитата
..зачем же я все эти разговоры завел?

Дык, зачем-же я все эти разговоры продолжаю smile.gif - чувствую, что "лед тронулся" smile.gif. Есть и еще тайный умысел - может когда поработать вместе придется smile.gif.
Цитата
..можете привести примеры проблем или кратко описать их?

Можно, вот иллюстрация к помянутому:
Код
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;

Только ведь все эти "семь бед" имеют одно радикальное решение smile.gif. Я просто всех гараблей не перечислю - в свое время хватило единожды наступить, дабы перейти раз и навсегда, и выбрость разом все эти проблемы из головы. В чужих исходниках, правда, встречать приходится sad.gif, что не дает совсем забыть sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 2 2008, 22:34
Сообщение #23


Просто Che
*****

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



Цитата(zltigo @ Mar 2 2008, 15:02) *
Можно, вот иллюстрация к помянутому:

ОК, понятно. Это когда от перестановки слагаемых начинает меняться сумма sad.gif
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 4 2008, 14:48
Сообщение #24


Знающий
****

Группа: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 4 2008, 15:09
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 4 2008, 15:11
Сообщение #26


Просто Che
*****

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



Цитата(MALLOY2 @ Mar 4 2008, 16:48) *
Не получается обьявить тип структуры в которой этот тип и используется.

Ну, во-первых, вы пытаетесь применить тип, который вы еще не объявили (только находитесь в процессе объявления).

А во-вторых, даже если бы вам компилятор это разрешил делать, у вас получилась бы рекурсия. Подумайте, что при этом получится: бесконечная вложенность, фракталы. Боюсь, вам памяти не хватит biggrin.gif
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 4 2008, 15:13
Сообщение #27


Знающий
****

Группа: 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;


так работает
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 4 2008, 16:19
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 4 2008, 16:27
Сообщение #29


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Спс, помогло smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 4 2008, 16:28
Сообщение #30


Гуру
******

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



Цитата(Baser @ Mar 4 2008, 18:11) *
...бесконечная вложенность, фракталы. Боюсь, вам памяти не хватит biggrin.gif

Совершенно обыденный прием, например, менеджер памяти - Меmory Control Block содержит указатели на аналогичные блоки в цепочке.
Код
// Memory Control Block (MCB)
typedef struct heap_mcb
{
    struct heap_mcb *next;  
    struct heap_mcb *prev;       
    union type_size ts;          
    union mark_owner ow;        
} heap_mcb;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:02
Рейтинг@Mail.ru


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