1. C++ / Говнокод #28109

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    // https://github.com/santiontanon/stransball2/blob/dff413c6ed236b4be23e0152557a26d7d902976c/sources/state_changepack.cpp#L67
    
    bool state_changepack_cycle(SDL_Surface *screen,int sx,int sy,unsigned char *keyboard)
    {
    	if (SUBSTATE==0) {
    		if (image!=0) SDL_FreeSurface(image);
    		image=IMG_Load("graphics/tittle.pcx");
    
    		{
    			levelpacks.Delete();
                                                             
    #ifdef _WIN32
                            /* Find files: */ 
                            WIN32_FIND_DATA finfo;
                            HANDLE h;
    
                            h=FindFirstFile("maps/*.lp",&finfo);
                            if (h!=INVALID_HANDLE_VALUE) {
                                    char *tmp;
    
                                    tmp=new char[strlen(finfo.cFileName)+1];
                                    strcpy(tmp,finfo.cFileName);
                                    levelpacks.Add(tmp);
    
                                    while(FindNextFile(h,&finfo)==TRUE) {
                                        char *tmp;
    
                                        tmp=new char[strlen(finfo.cFileName)+1];
                                        strcpy(tmp,finfo.cFileName);
                                        levelpacks.Add(tmp);
                                    } /* while */ 
                            } /* if */ 
    #else
                            DIR *dp;
                            struct dirent *ep;
    		  
                            dp = opendir ("maps");
                            if (dp != NULL)
                            {
                                while (ep = readdir (dp))
                                {
                                    char *tmp;
                             
                                    if (strlen(ep->d_name)>4 &&
                                        ep->d_name[strlen(ep->d_name)-3]=='.' &&
                                        ep->d_name[strlen(ep->d_name)-2]=='l' &&
                                        ep->d_name[strlen(ep->d_name)-1]=='p') {
                                        tmp=new char[strlen(ep->d_name)+1];
                                        strcpy(tmp,ep->d_name);
                                        levelpacks.Add(tmp);                                    
                                    } /* if */
                                   
                                }
                                (void) closedir (dp);
                            }
    #endif

    Super Transball 2 (супер трансшары 2)

    Запостил: j123123, 04 Апреля 2022

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

    • Вот бля как надо расширение файлов проверять:
      if (strlen(ep->d_name)>4 &&
          ep->d_name[strlen(ep->d_name)-3]=='.' &&
          ep->d_name[strlen(ep->d_name)-2]=='l' &&
          ep->d_name[strlen(ep->d_name)-1]=='p') {
      Ответить
      • Интересно, а есть ли в крестах особый говнометод для строк, чтоб совпадения такой-то хуйни с конца проверять?
        Ответить
        • я не попенгаген, но кажется есть обратные итераторы втч и у строк
          Ответить
        • https://en.cppreference.com/w/cpp/string/basic_string/ends_with
          Ответить
          • > (since C++20)

            А как это решали до "C++20" ?
            Ответить
            • во-первых есть обратный итератор, но это ебля
              во-вторых есть substr
              Грубо гря
              bool has_extension(const std::string& file, const std::string& ext)
              	{
              		if (file.length() <= (ext.length() + 1))
              		{
              			return false;
              		}
              		const auto offset = file.length() - ext.length();
              		return file[offset - 1] == '.' && file.substr(offset) == ext;
              	}
              Ответить
          • И почему это какая-то завязанная на "string" херня? Если я например хочу в std::vector<int> сравнить 5 последних хуйни, мне нужно какое-то другое говно использовать, да?
            Ответить
            • template <class T>
              	bool ends_with(T const& value, T const& ending)
              	{
              		if (ending.size() > value.size()) return false;
              		return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
              	}


              stl, итераторы и шаблоны
              Ответить
              • Тогда нахуя в крестах сделали какой-то специальный "ends_with", который работает только на стрингах ( https://en.cppreference.com/w/cpp/string/basic_string/ends_with ), а не в общем виде?
                Какое-то нелогичное неконсистентное пизданатство
                Ответить
                • Наверное правильнее спросить почему вообще строки не частный случай коллекции с кодпоинтами. Кажется, для строк можно делать какие-то оптимизации, но это не точно. *

                  Я не крестовик же, нужно Госта спросить, или Борманда.

                  Вангую, что строки Страуструп сделал раньше, чем Степанов свои коллекции



                  * кстати, анекдот на эту тему: ответить без гугла чем отличаются методы length() и size() у строки?
                  Ответить
                  • вот тут про это пиздят
                    https://stackoverflow.com/questions/11358879/benefits-of-vectorchar-over-string

                    упомянутая мною оптимизация это small string optimization
                    Остальное ридабилити

                    В общем С++ это такой странный мир, где зачем-то есть vector<bool>, а строки развиваются параллельно с контейнерами, но при этом это и не строки вовсе, а тоже контейнеры со спец типами типа чар (в смысле строки не понимают там всякие юникоды)

                    Ситуация напоминает как в жабе есть 100500 фреймворков для логирования, например


                    зы: блядь как пиздато опять пиздеть про С++, а не про войну
                    Ответить
                  • > ответить без гугла чем отличаются методы length() и size() у строки?

                    Ничем. Вообще ничем. Даже для wide и multibyte строк.
                    Ответить
                  • Наверное, потому что это оверинжиниринг. Мне не нужны сферические строки в вакууме, мне нужно то, чем я пользуюсь: endsWith, toUpper, toUtf8, strip. А тащить все это в коллекцию общего вида... часто ли для обычного массива нужен endsWith? Если все потенциально полезное для коллекций добавить, то прототип распухнет как руки-базуки...
                    Ответить
                    • Справедливости ради, ends_with общего вида добавили в С++23.

                      С этим, кстати, связано ещё одно говно.
                      С появлением ranges, все алгоритмы переделали на их поддержку. Лежат эти новые алгоритмы в std::ranges::, а старые в std::.
                      Вся новая хуйня добавляется в std::ranges::, её аналог в std:: — нет. То есть, в большинстве случаев если ты напишешь std::huita вместо std::ranges::huita, всё будет работать. Но иногда нет. За 20 лет скопилось огромное количество материала, показывающего, как использовать говно из std::.
                      То есть, кто-нибудь, использующий учебники, написанные лет 5 назад, может хватить неиллюхорный диссонанс, когда в каких-то случаях всё работает, а в каких-то надо впихивать ranges в середину.
                      Задепрекетить все старые алгоритмы с сообщением «пользуйтесь новыми в ranges» не додумались.
                      Ответить
                    • >toUtf8
                      это у std::string? орлы?
                      Ответить
                      • Ну, я взял за образец QString. Там тоже, конечно, бывают неожиданности, когда, например, в QString'е есть number и arg (просто число в строку и умное форматирование, соответственно), а в частенько прикидывающемся однобайтовой строкой QByteArray'е - только number. Но так и надо, наверное...
                        Ответить
                        • QString не std:string же

                          курица не птица
                          болгария не заграница
                          std::string не строка
                          Ответить
                • Ну а нахуя в сишке сделели какой-то strtok, который работает только с массивами чаров? А если я хочу массив интов разбить на группы, что мне делать?
                  Тот же самый вопрос про strlen, да и про всю str* серию функций.
                  Ответить
                  • Потому что в сишке нет говношаблонов, чтобы делать обобщенные хуйни. А делать через коллбеки и указывать размеры хуйни (как в функции qsort() например) это оверхед. У говнокрестов таких оправданий нет.
                    Ответить
                  • Слил его как лалку )))
                    Ответить
      • какой вконтакте
        какой алогоритм Шлемеля зе пейнтера

        >new
        ого, это кресты
        Ответить
        • Наверное это и есть то, что называют "C/C++"
          Ответить
          • А вообще что вот должно быть в голове у автора? Как можно смешать win32api, препроцессор, strlen и new?

            Он накопипастил куски кода из разных мест, или это он так "C++" знает?
            Ответить
            • Satan Balls.
              #ifdef _WIN32
               <код под Windows>
              #else
               <кроссплатформенный код>
              #endif

              Хм...
              Ответить
              • Автор наверно сначала написал код под "Windows", потом написал кроссплатформенный код (который и под "Windows" работать будет), но код под "Windows" было жалко выкидывать, и он поэтому его оставил.

                Хотя вот функция opendir() это из "POSIX", в винде такой хуйни вроде нет.
                Ответить
                • нет конечно, но в крестеце есть https://en.cppreference.com/w/cpp/filesystem
                  Ответить
                • Это - магия васкира

                  An application cannot create a directory by using CreateFile, therefore only the OPEN_EXISTING value is valid for dwCreationDisposition for this use case. To create a directory, the application must call CreateDirectory or CreateDirectoryEx.

                  To open a directory using CreateFile, specify the FILE_FLAG_BACKUP_SEMANTICS flag as part of dwFlagsAndAttributes. Appropriate security checks still apply when this flag is used without SE_BACKUP_NAME and SE_RESTORE_NAME privileges.
                  Ответить
      • К собеседованию во вконтакт готовится?
        Ответить
        • Урааа! Борманд няприветнулся!
          Ответить
        • Не совсем

          Вконтактники любят конечно писать
          if (petuh[0] == 'h' && petuh[1] == 't' && petuh[2] == 't'

          но Шлёму Зепейнтера они не заказывали
          Ответить
          • Оптимизатор всё стерпит.
            Ответить
            • В смысле там Шлёмы не будет?
              Ну возможно, но расчитывать не стоит

              Вот кстати крестостроки же вроде свою длину считают один раз, так что они еще и этим лучше
              Ответить
            • Но автор кода то про это не знает
              Ответить
              • У автора кода в голове птички насрали, и я вероятно даже знаю, почему

                В не очень хороших ВУЗах иногда учат си и сразу си++, и в голове образовывается такая вот кашица
                Ответить
      • https://govnokod.ru/23672 тоже проверка расширения файла реализована похожим образом, только strlen на каждую букву не вызывается - оптимизированней!
        Ответить
    • а, так это школьник писал чтоли?
      https://github.com/santiontanon/stransball2/blob/dff413c6ed236b4be23e0152557a26d7d902976c/sources/maps.cpp#L60
      Ответить
      • мне еще нравится, что оно взяло Simple DirectMedia Layer, но всё равно прибилось говздями к win32api даже в тех местах, где у крестов есть свои API
        Ответить
    • SDL2 вперёд!!
      Ответить

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