Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. За эту неделю я подробно разобрал главы Спинеллиса 2.2.-2.8, и у меня возникли вопросы по ней. Подскажите пожалуйста, если они не слишком тривиальны. 1. ex 2.12В языке Perl круглые скобки обязательны во всех управляющих операторах. Изложите ваше мнение по поводу того как это влияет на удобство чтение программ, написанных на Perl Как я понял, имеют ввиду возможность на Си написать так Код: plaintext 1. 2. а на условном Perl с синтаксимом Си, можно было бы только так Код: plaintext 1. 2. 3. 4. Мне кажется что влияет положительно. Раз меньше вариаций для возможности написать конструкцию, значит её проще прочитать. Но мне кажется данный ответ слишком прост. Должна быть какая-то подковырка. Или нет ? 2. Если в среде в VS E 2013 программа или функция компилятора для обнаружения пропущенных операторов break в сблоках switch ? 3. Приведён пример такого кода Код: plaintext 1. 2. 3. 4. Разве это не аналогично Код: plaintext 1. 2. 3. 4. Зачем так усложнять ? 4. Далее идёт такой участок кода Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 4.1 Почему для преобразования строки в число не используют стандартную функцию atoi ? Ведь вы меня сами учите пользоваться стандартными функциями . 4.2 atoi расшифровывается как ascii to int ? Это мне пришло в голову. 4.3 Есть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения. 4.4 Зачем printf приводят, я знаю что она возвращает число выведенных символов, ну и пусть возвращает, нам то что ? 4.5 ex 2.24Функция getstops выдаёт одно и то-же сообщение по поводу разных ошибок. Предложите способ сделать её более информативной и в то же время избавиться от оператора goto... я преобразовал так, но выглядит паршиво. Можно ведь лучше ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 5. Далее говорят про оператор goto. 5.1 Существуют ли алгоритмы которые нельзя реализовать без этого оператора ? 5.2 Говорят мол в Джава так не любят этот оператор, что его там и вовсе нет. Я проверил, switch то оставили, что они как немцы с двойными стандартами к России. Тогда бы и его убирали. Одно и то-же в принципе. 6. Последний вопрос, приведён кусок кода из \netbsdsrc\lib\libc\net\getservent.c Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. комментарий к этому коду Спинеллис... где в бд системы разыскивается запись, соответствующая системной службе, с игнорированием комментариев и слишком длинных строк.(Интересно, что приведённый выше код, похоже содержит ошибку. Если прочитана только часть строки, то следующей операцией будет чтение её остатка. Этот остаток может иметь требуемую длину и будет воспринят как корректная запись. Подобные нарушения часто становятся лазейками для нарушителей системной безопасности ) Код мне понятен, ошибка, если действительно идёт усечение слишком длинных строк скорее всего есть. Пришлось изучить функции fgets and strpbrk. INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 7.24.5.4 The strpbrk function Synopsis 1 #include <string.h> char *strpbrk(const char *s1, const char *s2); Description 2 The strpbrk function locates the first occurrence in the string pointed to by s1 of any character from the string pointed to by s2. Returns 3 The strpbrk function returns a pointer to the character, or a null pointer if no character from s2 occurs in s1. INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 7.21.7.2 The fgets function Synopsis 1 #include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream); Description 2 The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array. Returns 3 The fgets function returns s if successful. If end-of-file is encountered and no characters have been read into the array, the contents of the array remain unchanged and a null pointer is returned. If a read error occurs during the operation, the array contents are indeterminate and a null pointer is returned. 6.1 Судя по этому коду у fgets есть побочный эффект, она двигает указатель внутри файла, почему об этом побочном эффекте не написано в стандарте, или я не заметил этого ? 6.2 Решил сам реализовать strpbrk, без побочного эффекта. Проверьте пожалуйста, код ниже похож на правду ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 6.3 Почему у неё такое название? Не могу расшифровать вторую часть. PS Встретил несколько ошибок пока читал 1. стр 51, 1 абзац. стр 51Поэтому переменные в которые помещаются результаты вызова этих функций должны быть целочисленными , а не символьными, чтобы хранить как все возможные символы так и коды ошибок..(речь идёт о переменной в которую пишется результат из функции getc ) Собственно, мы знаем типы данных Си, и потому делить их на целочисленные и символьные будет не совсем корректно, потому что символьные типы данных сложены в множество целочисленных. Правильнее было упомянуть не целочисленные типы данных, а знаковый тип данных, достаточный для хранения стандартной таблицы символов и кодов ошибок. 2.стр 471, п29 стр 471Циклы записанные в форме Код: plaintext 1. выполняются ровно n раз Это тоже ошибка, ибо такой цикл выполнится n/2 раз Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 06:52 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Тухумхау, но лично меня не очень устраивает и: Код: sql 1. 2. 3. 4. 5. 6. и: Код: sql 1. 2. 3. 4. 5. Вариант "все скобки блоков на отдельных строках" добавляет неэстетичные пустоты. В общем, хотелось бы, чтобы ключевые слова then, else и, возможно, elif начинали блок , заканчивающийся (другим) else, elif или end: Код: sql 1. 2. 3. 4. 5. С while - примерно тоже: Код: sql 1. 2. 3. 4. 5. Не, существующий вариант красотища для коротких условий и операторов: Код: sql 1. 2. Но лично я не настолько талантлив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 07:47 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, если выкинуть точки с запятой - получится бейсик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 08:41 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
В бэйсике, вроде, оператор, а не блок. Но в целом - да, условные операторы и циклы должны работать с блоками, ограниченными ключевыми словами, а не с отдельными операторами. То, что последовательность операторов можно превратить в блок, рассматриваемый как один оператор, само по себе проблемы не решает: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:23 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SS4.3 Есть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения. провел сегодня эксперимент. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 1. 20 436 000 2. 17 116 000 3. 16 333 000 4. 16 177 000 5. 16 676 000 6. 17 378 000 7. 20 076 000 8. 15 849 000 9. 17 065 000 10. 16 667 000 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 1. 16 067 000 2. 16 863 000 3. 16 270 000 4. 16 426 000 5. 16 629 000 6. 17 221 000 7. 17 565 000 8. 17 799 000 9. 17 097 000 10. 17 119 000 Проводил эксперименты пятёрками. 1. Обратите внимание на разброс значений в первом случае. И на стабильность во втором случае. Конечно нужно провести 1000 экспериментов чтобы делать выводы, но для начала можно сказать что время выполнения цикла while(1) возможно более предсказуемо чем for(;;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 03:37 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Хотя если дизассемблировать Код: asm 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. и Код: asm 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Есть некоторая разница. И это странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 04:41 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Думалось, что компилятор поймёт что это бесконечный циклы в обоих случаях, и заменит оба выражения на одинаковый машинный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 06:08 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury, чем дизассемблировал? Собирай release версию и дизассемблируй exe файл c помощью IDA Pro free. mingw вообще весь цикл выкинул: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 07:23 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Дизассемблировал в VS, во время отладки появляется возможность посмотреть ассемблерный код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 08:16 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Отладки и оптимизация - две вещи несовместные. Пусть генерит ассемблерный листинг для релизной компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 12:37 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury, есть понятие code-style. Это устоявшиеся предпочтения в группе разработчиков. Код: plaintext 1. 2. В нашей группе например есть обязательное правило ставить фигурные скобки в блоках for, if, while. Эти правила - что-то вроде этикета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 13:21 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
maytonВ нашей группе например есть обязательное правило ставить фигурные скобки в блоках for, if, while. Эти правила - что-то вроде этикета. Особенно это этично в отношении с MS VS, у которой при отсутствии нужных скобок начинает путаться автоматический расставлятор отступов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 13:54 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Данные фрагменты кода не идентичны. Т.к. во втором кейсе ты пропустил выражение инициализации. Кроме того их результирующий код зависит от контекста. К примеру если был внешний цикл то компиллятор будет вынужден сохранять loop variable где-то в памяти и соотв исключит какие-то оптимизации. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Кроме того, очевидно что этот вопрос - compiller depends и нужно его смотреть после того как брошен клич - "Маски - долой!" и ты покажешь --help --version своих тулзов и опций компиллятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 15:42 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury SashaMercuryПочему для преобразования строки в число не используют стандартную функцию atoi ? Ведь вы меня сами учите пользоваться стандартными функциями . Данный кусок кода Код: plaintext 1. 2. является примером недоброкачественной конвертера. Он не контролирует максимальную длину строки *cp но при этом формирует десятичное умножение на целое имеющее лимиты по сетке. Он не контролирует принадлежность символов *cp диапазону [:digit:] и соотв выдаёт undefined behavior. Такой код писать нельзя. Или можно писать с оговоркой. С оговоркой что входная строка *cp гарантирует свою пригодность к подобного рода конверсии. По сабжу atoi - это те же яйца но они хотя-бы выделены в отдельную функцию и их глюки известны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 15:59 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЕсть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения. Не парься. Этот вопрос не стоит внимания. Пиши как тебе удобно а наносекунды не повлияют на твой основной алгоритм. Основное мясо вычислений приходится на тело цикла которое будет всё равно тысячекратно тяжелее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 16:06 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury, 5. Далее говорят про оператор goto. 5.1 Существуют ли алгоритмы которые нельзя реализовать без этого оператора ? Существуют конкретные примеры алгоритмов которые с явным оператором goto выглядят компактно и вполне читабельно. Автор статьи на Хабре хорошо прошёлся по нескольким случаям. http://habrahabr.ru/post/114211/ Всё остальное - холивары и битва идеологий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 19:05 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
SashaMercury 5.2 Говорят мол в Джава так не любят этот оператор, что его там и вовсе нет. Я проверил, switch то оставили, что они как немцы с двойными стандартами к России. Тогда бы и его убирали. Одно и то-же в принципе. Goto в Java language существует. Однако он используется для "разрыва" системы вложенных циклов. В спецификации опкодов JVM goto существует аж в двух вариантах goto [offset_16bit], goto_w [offset_32bit] и судя по описанию не ограничивается контекстами циклов. Тоесть можно использовать везде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 19:27 |
|
||
|
Анализ программного кода на примере проектов Open Source 2.2-2.8
|
|||
|---|---|---|---|
|
#18+
Данный код Код: plaintext 1. 2. 3. 4. 5. по смыслу может быть преобразован в Код: plaintext 1. 2. 3. 4. 5. 6. Или в более цивильный вариант. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 19:34 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=57&tid=2019375]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 17ms |
| total: | 191ms |

| 0 / 0 |
