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

    −48

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    typedef float		vec_t;
    ...
    typedef vec_t		matrix3x4[3][4];
    ...
    void Matrix3x4_ConcatTransforms( matrix3x4 out, const matrix3x4 in1, const matrix3x4 in2 );
    ...
    static matrix3x4		g_bonestransform[MAXSTUDIOBONES];
    static matrix3x4		g_rotationmatrix;
    ...
        matrix3x4		bonematrix;
    ...
        Matrix3x4_ConcatTransforms( g_bonestransform[i], g_rotationmatrix, bonematrix );

    Поясните, что не так?

    Ругань gcc такова:
    client/gl_studio.c:1076:5: warning: passing argument 2 of ‘Matrix3x4_ConcatTransforms’ from incompatible pointer type [enabled by default]
    common/mathlib.h:144:6: note: expected ‘const vec_t (*)[4]’ but argument is of type ‘vec_t (*)[4]’
    client/gl_studio.c:1076:5: warning: passing argument 3 of ‘Matrix3x4_ConcatTransforms’ from incompatible pointer type [enabled by default]
    common/mathlib.h:144:6: note: expected ‘const vec_t (*)[4]’ but argument is of type ‘vec_t (*)[4]’

    Ведь в функцию, принимающую const char* можно передавать char*? Что же тогда с матрицами то не так?

    Запостил: mittorn, 24 Апреля 2016

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

    • govnokod.ru/19873#comment323463
      Ответить
    • УМВР.
      Ответить
    • > Ведь в функцию, принимающую const char* можно передавать char*?
      Новодел какой-то. У меня нельзя.
      Ответить
      • Фигня какая-то. Что курили те, кто это запрещал? Зачем const, если его нельзя использовать?
        По идее, логично было бы позволять передавать все типы, у которых не больше слов const на указанных в сигнатуре местах (кроме const в сигнатурах функций при передаче указателей - там количество const должно быть не меньше указанного в сигнатуре).
        Ответить
        • тогда в крестах, для темплейто-программирования, придется ввести новый оператор/функцию constof(), которая будет возвращать число констов присутствующих в сигнатуре аргумента.
          Ответить
          • > придется ввести новый оператор/функцию constof()

            Уже в c++98 можно "метопрограммно" вычислить :)
            Ответить
        • я херею с местной флоры и фауны. Оно так и позволяет, вообще-то. ТС пытается передать массив по значению и не может понять чего это его компилятор ругается
          Ответить
          • Тут и по указателю не получится. Компилятор ругается не на то, что перепутана передача по указателю и по значению, а на несоответствие модификатора const.
            Ответить
            • > Тут и по указателю не получится
              ... где-то чуть ниже ...
              > Починил:
              > typedef const matrix3x4 *cmatrix3x4;
              Ответить
              • Там по сути то же самое: *& ничего не делает, а между ними каст, чтобы обмануть компилятор.
                Ответить
          • Qt развратил тебе мозг, массив не передастся по значению, но передастся константный указатель на его первый элемент.
            Ответить
            • На самом деле да. Как уже кто-то заметил, в сишке arr[i] — это синтаксический сахар для *(arr+i), а сам arr — это по факту указатель.
              Ответить
              • >> Как уже кто-то заметил
                Любой, кто кодил на сишке?
                Ответить
                • Ну не совсем любой. Есть же ещё и неосиляторы...
                  Ответить
                  • Я - человек, имеющий весьма отдаленное отношение к pure c, но k&r C и то читал.
                    Мне кажется, что сишка - это основополагающий язык программирования и любой программист должен его знать.
                    Тут встает вопрос программисты ли 1с-ники и пхпешники...
                    Ответить
                    • > Мне кажется, что сишка - это основополагающий язык программирования и любой программист должен его знать.

                      С - нет. Асм - да.

                      Знать - нет. Но раз в глаза ему посмотреть, и пару простых лаб на нем написать - да.

                      После этого и С, и Фортран - и даже Лисп - уже будут простыми. И после этого басики (шарпы и жабы) будут уже совсем мелочами.
                      Ответить
                      • что за чушь?
                        конечно же сишка это лингва франка современных компьютеров

                        на нем описывают алгоритмы и API операционок

                        Не знать си это примерно как не знать латынь для историка церкви
                        Ответить
                        • Не чушь. Ни одна книга по си не помогла мне въехать в указатели.
                          Только после знакомства с asm x86 из какой-то книги, мне стало всё понятно.
                          Ответить
                          • совершенно верно

                            я тоже только после асма понял что такое куча и стек и как работают указатели

                            а как это опровергает мои слова?
                            Ответить
                          • если читать через строчку, то и mein kampf не про адольфа
                            Ответить
                        • >на нем описывают алгоритмы и API операционок
                          >>на нем описывают алгоритмы

                          Ага-ага. Только алгоритмы описывают в алголо- или бейсико- подобных псевдокодах.
                          https://en.wikibooks.org/wiki/LaTeX/Algorithms
                          Или даже напитонских (с отсутствием endов и отступами). Но никак не в сишных значках и закорючках.
                          Ответить
                          • Я алгоритмы описываю на псевдо-С языке уже 10 лет, а потом могу уже и на C++ переписать легко. С мой первый язык, потом CPP, потом Asm, потом всё остальное
                            Ответить
                            • Молодец. Ты взял хуевый язык, и сделал его еще хуевее тем, что добавил в него самостоятельной непонятной псевдохуйни. Можешь собой гордится: десять лет не прошли зря.
                              Ответить
                              • А какой язык не хуевый; PHP, Perl, Java, Ruby, Pascal??
                                Ответить
                                • Что за вопрос? конечно php. Кто не согласен, завидуют.
                                  Ответить
                                  • А почему тогда PHP написан не на PHP, а на C. И почему на PHP нельзя написать ядро ОС или драйвер, или вообще делать Asm вставки?
                                    Ответить
                                    • а почему ты решил. что все это - критерии хорошего языка?
                                      Ответить
                                    • А почему джумла написана не на C а на php.
                                      И почему в интернетах оверхулион сайтов на пхп, а на с можно пересчитать на пальцах?
                                      Ответить
                                      • Очевидно что C не удобно использовать для написания сайтов.
                                        PHP, кстати, тоже не удобно.

                                        Но вопрос про хулион, конечно, глуп. Миллионы мух.
                                        Ответить
                                • Из перечисленных Java, Ruby и Pascal
                                  Ответить
                                • Нехуевый для написания алгоритмов?
                                  http://www.kframework.org/index.php/Main_Page

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

                                    Запомни: что можно выразить на одном тюринг-полном языке ВСЕГДА можно выразить и на другом

                                    Вопрос в сахаре

                                    На си ему, блядь, алгоритм не выразить.
                                    На PHP наверное выразить, ага
                                    Ответить
                                    • Свыня, как я понимаю, вопросы теоретической возможности в треде интересуют только тебя.
                                      Ответить
                                      • свыня это твой дед, а я гуесто

                                        просто wxvw бессмысленный пиздабол не владеющий терминологией, да еще и не осиливший си
                                        Ответить
                                        • Ты хуесто, анонимный петух, занимающийся пустопорожним пиздежом. Типичный прыщеблядок.
                                          Ответить
                                          • лол, безработная проститутка решила пообзываться

                                            это так смешно
                                            Ответить
                      • > С - нет. Асм - да.
                        А потом доходит до употребления веществ, потому что у асма нет иструментов управления сложностью: http://ekimoff.ru/230/
                        Ответить
                      • Ну на асме я писал херню для чтения тестового файла с возможностью листать страницы и бегунком сбоку - этого хватит?
                        Ответить
                        • Конечно же нет. Зачем писать на асме прикладнуху?
                          Ответить
                          • что бы сдать ассемблер и получить оценку? а что надо?
                            Ответить
                      • Знать си вполне достаточно, чтобы разобраться, что такое указатели и как управлять памятью.
                        Ответить
                        • Не вполне. Си маскирует некоторые вещи: в арифметике указателей есть неявное умножение на размер элемента, а также передача массива по ссылке вовсе не очевидна.
                          Ответить
                          • почти то же самое хотел сказать.

                            или с моей перспективы: на С учат структурное программирование, максимально скрывая/игнорируя детали того как железо работает.

                            подмножество асма что бы простые программы писать освоить достаточно легко.

                            после написания пары программ на асме быстро понимаешь: зачем нужны функции, зачем нужны типы данных и структурное программирование, зачем нужны абстракции и стандартные библиотеки, и т.д.
                            Ответить
                            • походив пару дней голым и босым в -20 быстро понимаешь, зачем нужны ботинки, одежда и общественный транспорт
                              Ответить
                              • ... но продолжаешь задаваться вопросом на кой хер живешь так далеко на севере, а не где южнее.
                                Ответить
                                • На югах всё-равно средство передвижения нужно. Машина какая-то виртуальная.
                                  Ответить
                              • >босым в -20
                                Оче толсто
                                Ответить
                          • в си же нет ссылок?
                            Ответить
                          • Да что-то вы с Dummy00001 слишком низкоуровневые.

                            Это неявное умножение не добавляет ровно никакого препятствия для понимания указателей. Вот хочу я выделить 15 интов - пищу malloc(15 * sizeof(int));, этот sizeof(int) сразу же учит писать любой вменяемый сишконаставник как только требуется работать с динамической памятью. Как только я увидел array + i, у меня возник только один вопрос: "Где же sizeof(int), Карл?" И я не стал гиперабстрактным заедушным питухом, я наоборот к нотации царского маллока стремился. Си по сути это умножение маскирует только в одном месте, оставляя пользователю всякие malloc/qsort на закуску. Заодно рассказали про юнионы. Потом попросили реализовать бл**ский двусвязный список. После всего этого никаких вопросов про адреса уже не было, всё стало очевидным.

                            Вот многомерные массивы - это да, питушня какая-то. Но после того, как изучишь одномерные, они уже не сдвинут с дороги истины.

                            Наассемблер меня послали уже после того, как понял указатели и посмотрел несколько менее брейнфакоподобных языков.
                            Ответить
                            • >гиперабстрактным заедушным питухом
                              > я наоборот к нотации царского маллока стремился

                              >Потом попросили реализовать бл**ский двусвязный список.
                              Надеюсь ты заяснил по хардкору этим анскилябрам, что единственная полезная структура данных - одномерный массив?
                              Ответить
                              • К сожалению, нет. Не родился я Царём.
                                Хотя, потом написал калькулятор, где переменные лежали в массиве (double * или variable *), т.к. std::map, документацию на него и все эти ссылки амперсандные не осилил.
                                Ответить
                                • > Не родился я Царём.
                                  > я наоборот к нотации царского маллока стремился

                                  Оно и видно. Цари ведь не используют аллокаторы.

                                  Чтобы понять лучшее - надо изучить асм. Это основа всего. Изучая сишку ты знаешь - как делают питухи и к чему это приводит - и ты уже не будешь делать как питух.

                                  Не изучая сишку, а потокая говну, как ты, - ты будешь до конца дней своих говнарём, который ваяет говно и думает, что ваяет не говно - всё просто.

                                  Поэтому в x64 ты можешь сделать 4к маллоков на всю ширину физического адресного пространства. Это в бесконечное число раз быстрее любого заедушного софтварного аллокатора, ибо любой питушарский аллокатор это же и делает, но имеет оверхед намного больше, чем операции связывания в ведре.
                                  Ответить
    • ГК это тебе не киберфорум
      Ответить
    • > Ведь в функцию, принимающую const char* можно передавать char*?

      да. но не `char * const`. указатель на конст чар != конст указатель на чар.

      > Что же тогда с матрицами то не так?

      вот именно это и разница. у тебя констный не массив (который ты прячешь за тайпдефом), а указатель на массив. (в тему почему в С тайпдефы плохо.) если сделаешь из matrix3x4 структуру, то будет работать так как ты ожидаешь.

      ЗЫ понедельник. утро. похмелье. может быть гоню.
      Ответить
      • > в тему почему в С тайпдефы плохо

        А у меня сложилось впечатление, что не в тайпдефах тут проблема.
        Ответить
        • тайпдеф скрывает что matrix3x4 это указатель.
          Ответить
          • Верно. Но в теле функции мы обращаемся к аргументу как к массиву, значит, помним, что это указатель.

            Вы за то, чтобы в языке был явный способ отличить скалярные типы (которые можно передать по значению) от «больших» типов, которые передаются только по указателю?
            Ответить
            • > Вы за то [...] ?

              я ни за, ни против. просто в С это так.

              в крестах все меняется, потому что все в классы/структуры завернуто.
              Ответить
    • http://c-faq.com/ansi/constmismatch.html
      Ответить
    • Починил:
      typedef const matrix3x4 *cmatrix3x4;

      И при вызове:
      Matrix3x4_ConcatTransforms( g_bonestransform[i], *(cmatrix3x4)&g_rotationmatrix, *(cmatrix3x4)&bonematrix );
      Ответить

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