Няшная / Говнокод #19873 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 mittorn, (Updated )

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

  • > Ведь в функцию, принимающую 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 из какой-то книги, мне стало всё понятно.
                        Ответить
                        • совершенно верно

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

                          а как это опровергает мои слова?
                          Ответить
                      • >на нем описывают алгоритмы и API операционок
                        >>на нем описывают алгоритмы

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

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

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

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

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

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

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

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

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

                          после написания пары программ на асме быстро понимаешь: зачем нужны функции, зачем нужны типы данных и структурное программирование, зачем нужны абстракции и стандартные библиотеки, и т.д.
                          Ответить
                          • походив пару дней голым и босым в -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 структуру, то будет работать так как ты ожидаешь.

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

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

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

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

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

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

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8