Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="a5021",url="/forum/viewtopic.php?p=3490060#p3490060"]Замаскировали там не "немного", а по самое небалуйся.[/uquote]
Ну да, ну да, ASSERT-логику "замаскировали". Условие (state == CLOSED) обязано выполняться - иначе с воплями на выход. А если пациент не умеет инструментом пользоваться и предполагает в state после этого что-то другое - кто-же ему доктор? Макросы ведь неспроста огромными буквами прописывают - а чтобы клиент понимал что ЭТО_ОПАСТНО! :D Впрочем, вспоминая за многозадачность, я бы не был так уверен в однозначном поведении state ....

Но пример хороший, благодарю! ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3491720#p3491720"]Ну да, ну да, ASSERT-логику "замаскировали". Условие (state == CLOSED) обязано выполняться - иначе с воплями на выход.[/uquote]
Вы только что вляпались самым неприглядным образом. Самое время вернуть вам ваши вопросы: "Проблема-то в чём? Непривычно? Непонятно? Скрытая функциональность? Неочевидные проблемы при выполнении?"

(state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".

Одно хорошо -- утверждая, что сей говнокод замечателен, вы вляпались на одном и том же месте дважды, так до конца и не разглядев проблемы даже после того, как здесь все было разжевано. На вашем личном примере вы показали, что недооценивая свойства говнокогда в одну и ту же какаху можно вступать и дважды и трижды и сколько захочется.
Реклама
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="a5021",url="/forum/viewtopic.php?p=3491754#p3491754"](state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".[/uquote]

хм. текстгов не смотрел :-) но по названию фунции (state == CLOSED) как раз единственоое нормальное "work-flow состояние". если сотсояние, отличное от CLOSED - нафик идем, так как уже используется
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Тут часть участников обсуждения слепые? И код res = ERR_CLSD; тоже характерен для "единственного нормального" ? Ай да говнокодище! Извалялись все.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="a5021",url="/forum/viewtopic.php?p=3491800#p3491800"]Тут часть участников обсуждения слепые? И код res = ERR_CLSD; тоже характерен для "единственного нормального" ? Ай да говнокодище! Извалялись все.[/uquote]

Да, я слепой. На код возврата, даже не обратил внимание. :-( Обычно, код возврата, отличный от "все-хорошо" ни на что не влияет (раззве что, на выдачу логов). Поэтому при беглом просмотре, на "такие мелочи" не сильно обращаю внимание. Несомненно, здесь вместо res = ERR_CLSD должно быть что-то вроеде res = ERR_ALREADY_USED (не смотрел, какие у них коды возврата).

Но по названию функции и логике TCP, данная функция должна переключить состояние CLOSED-->LISTEN, если было !CLOSED - вывалиться с ошибкой. Я бы вообще туда assert врубил бы, нефига уже используемый pcb пытаться перевести в LISTEN состояние, это проблема того кто вызывает данную функцию.

Вы абсолютно правы, это вовсе не "мелочи", а запутывание читателя кода по полной программе. Многовато "плюх" в нескольких строках. Что же там в осталном коде? Говнокод? Может быть.

Но лично я не столь категоричен к этому проекту.
1) Как-то оно, наверное, работает. Я не использовал, точно сказать не могу - иногда вижу (на форумах, ...) что исползуют. Всякие там CubeMX под него генерят, FreeRTOS, вроде, тоже его использует.... Отсюда я делаю вывод, что используют и как-то этот код работает.
Код свободен (у lwIP-а BSD-модифицированная лицензия). Я вообще считаю "чудом", что появляются (и самое главное, работают) подобные открытые проекты. Много ли альтернатив у lwIP-а с BSD-лицензией? А красиво-написанных, не "говнокодов"?
2) Да, в нескольких строках кода две проблемы, но они ни к чему ужасному не приводят (да, "болтается" в коде проверка на LISTEN, которая никогда не сработает; да, не тот код возврата при !CLOSED). Может поэтому и не нашли эти ошибки, что они "почти" никак не проявляются.
3) "Мы рождены, чтоб сказку сделать былью". Если я буду использовать lwIP, попробую commit получить и буду коммитить правки, чтобы проект был лучше. Не дадут коммита - буду тикеты им с патчами присылать. На то он и открытый код, чтобы улучшать его "всем миром" :-) Надеюсь, что так же будут поступать и другие, кто используют свободный код в своих целях :-)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="a5021",url="/forum/viewtopic.php?p=3491754#p3491754"](state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".[/uquote]
Забавное дело, сначала я рассказываю то, что вы уже по-сути разжевали, теперь вы пересказываете то, что я перерассказал. А г-н goldsmith тем временем продолжает в репу гадить.

Добавлено after 11 minutes 9 seconds:
[uquote="viiv",url="/forum/viewtopic.php?p=3492185#p3492185"]FreeRTOS, вроде, тоже его использует....[/uquote]
Они свою FreeRTOS+TCP наконец до stable довели и продвигают.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Отличная иллюстрация того, как ярый поклонник говнокода в говнокоде же и запутался. При этом продолжает пытаться обвинить в этом кого-то еще.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Можно ли на Си делать так:

Код: Выделить всё

void kmp_send(const uint8_t *msg, uint8_t size) {
	uint8_t buf[size + 2];
	
	...
}
и чем это чревато (если учесть что программа для микроконтроллера)?
«И всё-таки она вертится!»
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

На мой взгляд, ни чем.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Лучше поступать так, освобождая оперативку для других функций, или же лучше глобальный буфер "с запасом"? Честно говоря сделал для себя открытие что так можно :oops: , правда выставив стандарт языка C99
«И всё-таки она вертится!»
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

локальный массив будет выделен в области стека, и там может быть максимум 258 байт. если у вас сободно хотя бы 300 байт ОЗУ - никакой принципиальной разницы в работе вы не увидите.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ARV писал(а):если у вас сободно хотя бы 300 байт ОЗУ - никакой принципиальной разницы в работе вы не увидите.
А если эта функция вызвана из 1500 последовательно вызванных функций, в которых в свою очередь тоже выделялись переменные или массивы в стеке? Будет принципиальная разница? :))) :)
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Если памяти для задачи недостаточно, то не принципиально, каким образом она будет исчерпана.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Хотелось бы узнать почему именно 258 при 300 озу, разъясните пожалуйста. Хочется действовать понимая что то, а не просто прописывать цифры потому, что так надо.
«И всё-таки она вертится!»
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Apparatchik писал(а):почему именно 258 при 300 озу
это оценочное мнение. стек в проектах МК расходуется "непредсказуемо" только прерываниями. при входе в обработчик может потребоваться (на глазок) сохранить до 16 рабочих регистров (из практики, на примере AVR), что потребует 34 байта стека. еще немножко в запас - вот и выходит 300.
Мурик писал(а):А если эта функция вызвана из 1500 последовательно вызванных функций, в которых в свою очередь тоже выделялись переменные или массивы в стеке?
дураку стеклянный х#й - не надолго игрушка. такому программисту лучше заняться чем-то другим
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Здравствуйте
Подскажите пожалуйста, как узнать в какой dll находится ф-ция round ?
Пишу скрипт на си в среде WinCC.
В данной среде нету возможности подключать хидеры, вместо этого используются вот такие конструкции

Код: Выделить всё

 #pragma code ("oleaut32.dll")       
  INT SystemTimeToVariantTime(LPSYSTEMTIME  lpSystemTime, DATE *pvtime);
   INT VariantTimeToSystemTime(double vtime, LPSYSTEMTIME IpSystemTime);
  #pragma code () 
Tell Me The Truth
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="FreshMan",url="/forum/viewtopic.php?p=3498476#p3498476"]как узнать в какой dll находится ф-ция round ?[/uquote]Мельком глянул - язычок таксе, канешн :) диалектом C назвать его язык не поворачивается. Из общих соображений функция round должна располагаться в какой-нибудь math.dll (по аналогии с math.h). Если это средство программирования поддерживает макросы и явное приведение типов, можно сделать "функцию" примерно так:

Код: Выделить всё

#define round(x) (int)(x+0.5)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

[uquote="AAX",url="/forum/viewtopic.php?p=3498951#p3498951"]Из общих соображений функция round должна располагаться в какой-нибудь math.dll (по аналогии с math.h).[/uquote]
такой вариант не сработал
если можете, прошу внести ясность, так называемые ф-ции Win API сокрыты в dllках ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Насколько мне известно среди WinAPI нет функции round. Возможно найдется в msvcrt.dll.
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="FreshMan",url="/forum/viewtopic.php?p=3500298#p3500298"]такой вариант не сработал
если можете, прошу внести ясность, так называемые ф-ции Win API сокрыты в dllках ?[/uquote]А вариант с #define? Тоже не работает?
Функции Windows API находятся в dll. На всякий случай - round не имеет отношения к Win API :)
Мурик писал(а):Насколько мне известно среди WinAPI нет функции round. Возможно найдется в msvcrt.dll.
для начала нужно найти msvcrt.dll. Не на каждом компьютере установлена MSVS.
Ответить

Вернуться в «Разные вопросы по МК»