1. Си / Говнокод #14256

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    string=(char*)malloc(N);
     k=fread(string,sizeof(char),N,f);
     while (k==N)
     {
     free(string);
     N=N*2;
     rewind(f);//возращает в начало файла
     string =(char*)malloc(N);
     k=fread(string,sizeof(char),N,f);
     }
     fclose (f);

    Сегодня зачоты ставил...
    студенты читают из файла. В буфер. Я придираюсь к тому, что размер файла может быть больше размера буфера....

    Исправили...

    Запостил: klavdiev, 22 Декабря 2013

    Комментарии (106) RSS

    • // Тут - как в анекдоте про воробья, который влетал слону в хобот и вылетал из заднего 
      // прохода с довольным "кааааййфф!"
      
      string=(char*)malloc(N);
       k=fread(string,sizeof(char),N,f); // влетел в хобот
      do
       {
       free(string); // готовится вылететь
       N=N*2;
       rewind(f);//возращает в начало файла.. а тут слон приставлил хобот к заднему проходу...
       string =(char*)malloc(N);
       k=fread(string,sizeof(char),N,f);
       } while (k==N); // "почти вечный кайф" - сказал слон
       fclose (f);
      Ответить
    • Do while явно не для нас, наш выбор - копипаст
      Ответить
      • А я не люблю do ... while. Пишу в таких случаях while (1) и break по условию.
        Ответить
    • > free(string)
      > N=N*2;
      > rewind(f);
      > string =(char*)malloc(N);
      Не рассказывали студентам про realloc() или хотя бы про memcpy()?
      Ответить
      • Ну и про определение размера заодно. В некоторых случаях можно и померить перед выделением буфера...
        Ответить
        • Кстати, о размере. Некроссплатформенно же. Правильнее будет так:
          string =(char*)malloc(sizeof(char)*N);
          Ответить
          • правильнее но АФАИК sizeof(char) всегда 1 по стандарту в С, так что кроссплатформенности это не помешает.
            Ответить
          • sizeof(char) по определению 1. Хотя чар может быть размером аж в 8 октетов ;) malloc, емнип, считает именно в чарах, а не в октетах. Поэтому можно не писать sizeof(char).

            P.S. Если это Си, то каст в (char*) тоже не нужен.
            Ответить
      • А также о том, что malloc может обломаться, и, скажем, при объёме файла чуть больше половины доступного объёма оперативки программа вылетит с access violation.
        Ни проверки кода возврата, ни попытки определения размера файла...
        Ответить
        • > при объёме файла чуть больше половины доступного объёма оперативки
          Ну это уже ССЗБ. Для таких файлов идиома "засосать файл целиком в оперативу", имхо, непригодна даже если ее правильно реализовать... Тут уже надо думать в сторону потоковой обработки или маппинга.

          > malloc может обломаться
          > проверки кода возврата
          Ну кто же в лабах проверяет коды возврата? ;) Тут вон даже в энтерпрайзненькой жабе умудрились просрать ошибку записи (см. #14254).
          Ответить
          • > Ну кто же в лабах проверяет коды возврата? ;)

            Нас в своё время заставляли проверять абсолютно все коды возврата, в том числе из malloc. И вручную освобождать всю выделенную память, несмотря на то, что при завершении процесса ОС всё равно её освободила бы.
            Ответить
            • > проверять абсолютно все коды возврата, в том числе из malloc
              И это хорошо. Нас не заставляли, работает на контрольных примерах и ладно :(

              > при завершении процесса ОС всё равно её освободила бы.
              Ну-ну. А если процесс завершится через 360 дней, на следующей профилактике железа? :)
              Ответить
              • помнится, у нас в универе был один вредный препод, он получал большой кайф ломать наши студенческие поделки, и если программа не ожидала хоть одной его подлянки, работу не принимал. впрочем, мог прогу не принять, даже не запуская - только если в исходнике нашел хоть одно имя типа Form1.
                я как уже тогда имел опыт программирования, так мне было легко, а однокурсники страдали.
                я тоже страдал, но по другому поводу: это был курс VB6, а там много неудобств было.
                Ответить
                • На 1м курсе во «введении в программирование» в конце семестра препод сделал подляну на зачёте: писали мы на паскале и дельфи, и для зачёта он выдал каждому .pas файлик от основной формы проекта ранее сданной лабы и попросил добавить расчёт и сохранение некого отчёта зависящего от нескольких полей на форме, включая ранее не использовавшиеся (имя пользователя, адрес). Перечень компонентов на форме есть в исходнике, поэтому те, кто давал осмысленные имена компонентам проблем не имели, кто оставил стандартные Edit1 отправились на пересдачу.
                  Ответить
              • > А если процесс завершится через 360 дней
                Тут скорее про реентерабельность и чистоту говорить надо. Сферические 360 дней в вакууме нечасто встречаются, а вот когда не помнишь, как использовать свою функцию, чтобы нигде не бомбануло, начинаешь писать чуть более прямой код.
                Ответить
              • Тогда, скорее всего, он завершиться гораздо раньше в страшных мучениях
                Ответить
                • на сервере у нормального админа, прописавшего лимиты - гораздо быстрее.
                  Ответить
              • >А если процесс завершится через 360 дней, на следующей профилактике железа? :)
                Проблема скорее в том, что код может использоваться как модуль.
                Ответить
              • > Ну-ну. А если процесс завершится через 360 дней, на следующей профилактике железа? :)

                Это же не демоны были, где было чему течь, а достаточно простые консольные утилитки.
                Ответить
                • А завтра эту функцию скопипастят в демона, чтобы не писать ее заново. И он будет постоянно падать с access violation / segmentation fault :) Если уж писать на си, то как положено, без надежды на то, что придет "сборщик мусора" и все почистит.
                  Ответить
                  • >Если уж писать на си, то зачем?
                    Ответить
                    • > то зачем?
                      Тоже верно ;) Но я тут о случаях, когда почему-то все-таки надо писать именно на нем.
                      Ответить
                      • И тут мы пришли к обсуждению, что же целесообразно делать на си.

                        Мне больше нравится вариант, когда все что можно делается на высокоуровневом языке вроде питона, а на сях пишутся только расширения для того, что этот высокоуровневый язык не осилил (вроде производительности в узких местах). Почти всю работу с памятью можно будет спихнуть на высокоуровневый язык. Хотя я этот вариант и не проверял.
                        Ответить
                        • На питоне якобы легче писать, чем на Си?
                          Ответить
                          • Разумеется, потому что на Питоне пишут анскильные питухи, а цари пишут на Сишечке, не доступной простым смертным.
                            Ответить
                          • якобы?) реально проще
                            Ответить
                            • Выравнивать код, да ещё и учить кучу конструкций, которых в Си нет, реально проще?
                              Ответить
                              • Вопрос был "На питоне якобы легче писать, чем на Си?" а не "Якобы просто перевести код с си на питон?" или "Якобы сишникам проще писать на питоне?"
                                Ответить
                                • Я не сишник, но Питон мне кажется сложнее. Что я делаю не так?
                                  Ответить
                                  • > Питон мне кажется сложнее
                                    Может он и сложнее, но граблей в нем все-таки поменьше, да и писать на нем легче.

                                    Хотя смотря что писать ;)
                                    Ответить
                                  • ЦПП? Как язык со сборкой мусора, исключениями, стандартной библиотекой и который не перл может быть сложнее языка без вышеуказанного?
                                    Ответить
                                    • > ЦПП
                                      Я о чистом Ц. Ц (не кресты!) как язык очень прост. Сложны приемы работы с ним и грабли.
                                      Ответить
                                      • Ааа ну если так. Ассемблер тогда наверно еще проще будет. А грабли очень радует тех, кто его учит без учителя.
                                        Ответить
                        • Ну, я думаю, как-то так:
                          - Мелкие функции для высокоуровневых языков (которые на высоком уровне не получается запилить из-за скорости или нативности).
                          - Рантаймы этих самых языков (Ну не на асме же их писать в конце концов).
                          - Прошивки для контроллеров.
                          - Ядра операционок и драйвера к ним.

                          Хотя вот драйверы, имхо, уже пора переводить на что-то более высокоуровневое, т.к. сейчас они во-первых слишком всемогущи (могут делать абсолютно всё, а не только управлять своей железкой), а во-вторых слишком ответственны (могут наебнуть весь комп при малейшей ошибке). Singularity от M$ была интересным проектом, идущим в эту сторону, но ее вроде как забросили.
                          Ответить
                          • Из всего этого прикладной программист может столкнуться только с первым (мы же о прикладных программах говорим, да)?

                            >т.к. сейчас они во-первых слишком всемогущи (могут делать абсолютно всё, а не только управлять своей железкой),
                            А зачем? Если хуйня случится - во-первых, ось уронят, во-вторых, отлаживать тяжелее.
                            Ответить
                            • > прикладной программист
                              Да 99% прикладников даже с первым никогда не столкнутся ;)

                              > мы же о прикладных программах говорим, да
                              Нет ;) Ну иначе зачем бы я упоминал прошивки, дрова и т.п.

                              > Если хуйня случится - во-первых, ось уронят, во-вторых, отлаживать тяжелее.
                              Ну что поделать, вот так вот и мучаются. В основном, имхо, из-за производительности.
                              Ответить
                              • Если язык динамический - столкнутся хотя бы с конпеляцией.

                                >Нет ;)
                                А я - да.

                                >В основном, имхо, из-за производительности.
                                А в чем этот прирост заключается, чтобы так жертвовать стабильностью?
                                Ответить
                                • > А в чем этот прирост заключается, чтобы так жертвовать стабильностью?
                                  В том, что если сейчас сделать по процессу, крутящемуся в юзермоде, на драйвер (а сейчас других способов изоляции нет), то будет довольно дорогая передача данных между ними (сейчас драйверы практически напрямую, без переключения контекстов, общаются друг с другом и с железом).
                                  Ответить
                          • > Singularity от M$ была интересным проектом, идущим в эту сторону, но ее вроде как забросили.

                            И не говори. Питухи. стоп ошибка 000000 кококо пришло время переустанавливать шиндовс.
                            Ответить
                      • >Если уж писать на си, то зачем?
                        D не вкушали? вроде бы тот же С, но с человеческим лицом
                        Ответить
                        • Рекомендуешь?

                          Или очередная вариация на тему Си-с-классами?
                          Ответить
                          • ну как. дока есть. IDE нет. сообщество мало, т.е. на стековерфловочке ответов нет, копаешь все сам. но по сравнению с С\С++ - просто подарок, чем-то даже напоминает жабу по простоте.
                            Ответить
                            • посмотрел описание - в целом интересно, но лично мне пока не нужно. Мне пока шарпиков хватает
                              Ответить
                              • шарпики, жабы - это все под виртуальные машины, а это компилится кроссплатформенно в нативный код. вот и решайте, когда вам понадобится exe в 100кб без сторонних зависимостей
                                Ответить
                                • А что за язык?
                                  Ответить
                                  • http://ru.wikipedia.org/wiki/D_(язык_программирования)

                                    Можно просто погуглить Digital Mars или DMD/gdc/ldc.
                                    Ответить
                                    • спс, я уже нашел, качаю пакеты.
                                      А визуальный дизайнер форм есть у него? С визуальным дизайнером учить язык куда проще.
                                      Ответить
                                • Я бы не сказал, что это огромный плюс
                                  Ответить
                                  • Как не огромный? Это же буст перфоманса 146%!
                                    Ответить
                                  • я же сказал - я не навязываю, я информирую. решает те же задачи, что С, но проще в написании.
                                    пока вам угодно зависеть от .NET фреймворка, все хорошо.
                                    Ответить
                                    • Да я и не кричу, ногами в пол не бью)
                                      Ответить
                                      • >>я и не кричу, ногами в пол не бью

                                        Потому, что лучезарная фея в белом одеянии только что вероломно улыбнувшись вколола тебе аминазин а также на тебе висит смокинг аж на несколько десятков размеров больше.
                                        Ответить
                                • >в 100кб без сторонних зависимостей
                                  Сишарп/жава же. Фреймверк - это не сторонняя зависимость, хотя для жавы по любому придется таскать с собой commons.
                                  Ответить
                            • >ну как. дока есть. IDE нет.
                              в kdevelop вроде есть плагин, в mono-develop видел
                              вроде ещё есть плагин в idea
                              Ответить
                          • Не очередная. Это скорее Паскаль с сишным синтаксисом или Java/C# без фреймворка, потому что наконец-то появилась модульная система и отпала необходимость в макросах.
                            Ответить
                        • Вы про разделы? D лучше, чем C?
                          Ответить
                          • он намного проще - в том смысле, что синтаксис упрощен и нет надобности спускаться до понимания низкоуровневых вещей типа арифметики указателей, что было краеугольным камнем С99.
                            Ответить
                            • Как по мне, незачем учить язык без ГЦ без особого профита.
                              Ответить
                              • > язык без ГЦ без особого профита
                                Но в D есть GC :)
                                Ответить
                                • хотите, пользуйтесь, хотите - убирайте память сами.
                                  Ответить
                                • да даже в плюсах есть gc, только его подключать надо
                                  Ответить
                            • /me thinks Д не нужен.
                              Go компилится в натив, в нём есть гц, нормальная стандартная библиотека, корутины и каналы из коробки.
                              Ответить
                              • да ладно, Go?
                                хм.

                                з.ы. давно хотел сказать, аватара напоминает собаку, что пытались пристрелить в фильмах "Нечто"
                                Ответить
                                • GoogleThing detected. Where's my flamethrower?
                                  Ответить
                                  • > GoogleThing
                                    Уж лучше, чем поделие тёмного разума александреску с неясными перспективами.

                                    Go проектировали Томпсон и Пайк, а эти ребята знают толк в concurrency.
                                    Ответить
                                    • >>Уж лучше, чем поделие тёмного разума александреску с неясными перспективами.

                                      Енто ты про Design Patterns?
                                      Ответить
                                      • Кто книжку по Д написал, в курсе? Может, и The Modern C++ Design читал?
                                        Ответить
                                        • Ну курсив же, курсив...

                                          Плюсы вообще не трогал и не собираюсь
                                          Ответить
                                • Нет, не она: http://youtu.be/ZXHuGyv1KXM
                                  Ответить
                          • А я недавно на одной машине как раз удалил раздел D, чтобы расширить C, потому что Винда на нём умещаться перестала... Выходит, что зря сделал?
                            Ответить
                            • Не, все норм, просто на С поставь метку Rules
                              Ответить
                            • лучше бы сделал sda1 на 1Тб
                              Ответить
                              • Прям в винде)
                                Ответить
                                • sdb2
                                  Ответить
                                  • sdc3
                                    Ответить
                                    • Кто ж разделы нынче по номерам монтирует? В этом сезоне в моде гуиды и метки.
                                      Ответить
                                      • Ох уж этот бородатый гламур
                                        Ответить
                                      • метки тома? разве по ним можно?
                                        Ответить
                                        • Да, можно. Лейбл=тырыпыры.
                                          Ответить
                                          • > Лейбл=тырыпыры.

                                            А как разрешать конфликты?
                                            Ответить
                                            • Грамотной расстановкой меток.

                                              Параноики могут приписывать в конец метки ууид.
                                              Ответить
                                      • кстати - для не gpt разделов гуиды тоже можно использовать? у меня в бубунте гуид в фстаб прописан, а вот раздел то мбр, так что интересно откуда он взялся
                                        Ответить
                                        • Можно. Используешь же ;)
                                          Ответить
                                          • так откуда берется этот гуид? где прописан в разделе? а то я вот завтра перемещу разделы и перемешаю
                                            Ответить
                                            • Вшит куда-то взаголовок раздела насколтко помню.
                                              Ответить
                                              • Ну хрен знает. Прямо вот чтоб гуид вписывался. Я такого не помню. В гпт что-то такое было, но в других вроде нет. Там кроме метки тома есть какой-то идентификационный номер (не помню названия) раздела или даже физического диска, но это не гуид вроде.
                                                Ответить
                                                • > Прямо вот чтоб гуид вписывался.
                                                  All GNU/Linux filesystems (including swap and LUKS headers of raw encrypted devices) support UUID. FAT and NTFS filesystems (fat and windows labels above) do not support UUID, but are still listed in /dev/disk/by-uuid with a shorter UID (unique identifier)

                                                  Запусти blkid, увидишь их.
                                                  Ответить
          • Ну нас, например, обучали сишке на 486х с досом постепенно увеличивая объём обрабатываемых данных. Чтобы мы прочувствовали на себе большинство грабель. Бывало, что у кого-то заработала программа, другой её скопировал, и на тех-же данных она падает — памяти не хватило, на другой машине что-то ещё её заняло. Отучились запихивать всё целиком в оперативку только когда объёмы обрабатываемых данных стали больше объёма памяти.
            Ответить
    • прелестное жонглирование памятью и жужжание диском
      Ответить
      • А еще будет очень забавный эффект, если в качестве f подсунуть какой-нибудь пайп или сокет ;)
        Ответить
        • последовательное одноразовое безвозвратное чтение? вот тогда да, буфер-таки придется использовать, т.к. читать придется один раз, а размер неизвестен
          Ответить
          • > последовательное одноразовое безвозвратное чтение?
            Я вот сейчас как раз размышлял по этому поводу.

            Допустим, я пишу класс, который упаковывает и шифрует несколько входных потоков в один выходной поток. В общем случае оба потока не умеют в перемотку. Поэтому я не могу ни замерить длину заранее, ни перемотать выходной поток и вписать ее в заголовок. Читать весь поток в память тоже не вариант, т.к. она не резиновая.

            В мою дурную голову пришли три решения:
            1) Писать длину не до блока данных, а после (аля trailer в gzip). Засада в том, как это потом распаковывать.
            2) Юзать что-нибудь в духе HTTP'шного chunked encoding. Есть оверхед, но он контрится достаточно большим буфером.
            3) Делать отдельный индексный файл, в котором лежат офсеты. Неудобство в лишнем файле.

            Пока склоняюсь ко второму варианту, но может есть более разумные решения?
            Ответить
            • по-моему, тут ничего не попишешь, придется кодировать чанками, благо мы можем изменять их размер
              Ответить
    • >Лабы на си
      Но зачем? Было бы неплохо, если бы нам си преподавали, но ручное управление памятью и коды возврата таки кал.
      Ответить
    • >>Сегодня зачоты ставил...

      А Вы не боитесь, что студенты рассердятся и устроят Вам темную?
      Ответить
      • ...Итак, слушайте, мои ученики, с Вами говорит Ваш анальный учитель, здравствуйте.
        Кто явится завтра на зачет с непобритым лобком и попкой, тот получит кол!!

        © Анальный учитель.
        Ответить
      • Я одному преподу хотел пизды дать за то, что зачет не поставил, но не дал.
        Ответить
    • [удалено полицией нравов]
      Ответить

    Добавить комментарий