Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ругань 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*? Что же тогда с матрицами то не так?
Фигня какая-то. Что курили те, кто это запрещал? Зачем const, если его нельзя использовать?
По идее, логично было бы позволять передавать все типы, у которых не больше слов const на указанных в сигнатуре местах (кроме const в сигнатурах функций при передаче указателей - там количество const должно быть не меньше указанного в сигнатуре).
тогда в крестах, для темплейто-программирования, придется ввести новый оператор/функцию constof(), которая будет возвращать число констов присутствующих в сигнатуре аргумента.
я херею с местной флоры и фауны. Оно так и позволяет, вообще-то. ТС пытается передать массив по значению и не может понять чего это его компилятор ругается
Тут и по указателю не получится. Компилятор ругается не на то, что перепутана передача по указателю и по значению, а на несоответствие модификатора const.
Я - человек, имеющий весьма отдаленное отношение к pure c, но k&r C и то читал.
Мне кажется, что сишка - это основополагающий язык программирования и любой программист должен его знать.
Тут встает вопрос программисты ли 1с-ники и пхпешники...
>на нем описывают алгоритмы и API операционок
>>на нем описывают алгоритмы
Ага-ага. Только алгоритмы описывают в алголо- или бейсико- подобных псевдокодах. https://en.wikibooks.org/wiki/LaTeX/Algorithms
Или даже напитонских (с отсутствием endов и отступами). Но никак не в сишных значках и закорючках.
Я алгоритмы описываю на псевдо-С языке уже 10 лет, а потом могу уже и на C++ переписать легко. С мой первый язык, потом CPP, потом Asm, потом всё остальное
Молодец. Ты взял хуевый язык, и сделал его еще хуевее тем, что добавил в него самостоятельной непонятной псевдохуйни. Можешь собой гордится: десять лет не прошли зря.
Си вообще для этой задачин не подходит. В нем нельзя выразить много чего из нормальных языков, зато в нем есть много неоднозначностей и неопределенностей, и дохера ненужных вещей, о которых никому не интересно знать, при чтении алгоритмов, таких как, например, что будет если к беззнаковому индексу массива прибавить отрицательное знаковое число.
Не вполне. Си маскирует некоторые вещи: в арифметике указателей есть неявное умножение на размер элемента, а также передача массива по ссылке вовсе не очевидна.
или с моей перспективы: на С учат структурное программирование, максимально скрывая/игнорируя детали того как железо работает.
подмножество асма что бы простые программы писать освоить достаточно легко.
после написания пары программ на асме быстро понимаешь: зачем нужны функции, зачем нужны типы данных и структурное программирование, зачем нужны абстракции и стандартные библиотеки, и т.д.
Это неявное умножение не добавляет ровно никакого препятствия для понимания указателей. Вот хочу я выделить 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 структуру, то будет работать так как ты ожидаешь.
Верно. Но в теле функции мы обращаемся к аргументу как к массиву, значит, помним, что это указатель.
Вы за то, чтобы в языке был явный способ отличить скалярные типы (которые можно передать по значению) от «больших» типов, которые передаются только по указателю?
Новодел какой-то. У меня нельзя.
По идее, логично было бы позволять передавать все типы, у которых не больше слов const на указанных в сигнатуре местах (кроме const в сигнатурах функций при передаче указателей - там количество const должно быть не меньше указанного в сигнатуре).
Уже в c++98 можно "метопрограммно" вычислить 🙂
... где-то чуть ниже ...
> Починил:
> typedef const matrix3x4 *cmatrix3x4;
Любой, кто кодил на сишке?
Мне кажется, что сишка - это основополагающий язык программирования и любой программист должен его знать.
Тут встает вопрос программисты ли 1с-ники и пхпешники...
С - нет. Асм - да.
Знать - нет. Но раз в глаза ему посмотреть, и пару простых лаб на нем написать - да.
После этого и С, и Фортран - и даже Лисп - уже будут простыми. И после этого басики (шарпы и жабы) будут уже совсем мелочами.
конечно же сишка это лингва франка современных компьютеров
на нем описывают алгоритмы и API операционок
Не знать си это примерно как не знать латынь для историка церкви
Только после знакомства с asm x86 из какой-то книги, мне стало всё понятно.
я тоже только после асма понял что такое куча и стек и как работают указатели
а как это опровергает мои слова?
>>на нем описывают алгоритмы
Ага-ага. Только алгоритмы описывают в алголо- или бейсико- подобных псевдокодах.
https://en.wikibooks.org/wiki/LaTeX/Algorithms
Или даже напитонских (с отсутствием endов и отступами). Но никак не в сишных значках и закорючках.
И почему в интернетах оверхулион сайтов на пхп, а на с можно пересчитать на пальцах?
PHP, кстати, тоже не удобно.
Но вопрос про хулион, конечно, глуп. Миллионы мух.
Си вообще для этой задачин не подходит. В нем нельзя выразить много чего из нормальных языков, зато в нем есть много неоднозначностей и неопределенностей, и дохера ненужных вещей, о которых никому не интересно знать, при чтении алгоритмов, таких как, например, что будет если к беззнаковому индексу массива прибавить отрицательное знаковое число.
Запомни: что можно выразить на одном тюринг-полном языке ВСЕГДА можно выразить и на другом
Вопрос в сахаре
На си ему, блядь, алгоритм не выразить.
На PHP наверное выразить, ага
просто wxvw бессмысленный пиздабол не владеющий терминологией, да еще и не осиливший си
это так смешно
А потом доходит до употребления веществ, потому что у асма нет иструментов управления сложностью: http://ekimoff.ru/230/
или с моей перспективы: на С учат структурное программирование, максимально скрывая/игнорируя детали того как железо работает.
подмножество асма что бы простые программы писать освоить достаточно легко.
после написания пары программ на асме быстро понимаешь: зачем нужны функции, зачем нужны типы данных и структурное программирование, зачем нужны абстракции и стандартные библиотеки, и т.д.
Оче толсто
Это неявное умножение не добавляет ровно никакого препятствия для понимания указателей. Вот хочу я выделить 15 интов - пищу malloc(15 * sizeof(int));, этот sizeof(int) сразу же учит писать любой вменяемый сишконаставник как только требуется работать с динамической памятью. Как только я увидел array + i, у меня возник только один вопрос: "Где же sizeof(int), Карл?" И я не стал гиперабстрактным заедушным питухом, я наоборот к нотации царского маллока стремился. Си по сути это умножение маскирует только в одном месте, оставляя пользователю всякие malloc/qsort на закуску. Заодно рассказали про юнионы. Потом попросили реализовать бл**ский двусвязный список. После всего этого никаких вопросов про адреса уже не было, всё стало очевидным.
Вот многомерные массивы - это да, питушня какая-то. Но после того, как изучишь одномерные, они уже не сдвинут с дороги истины.
Наассемблер меня послали уже после того, как понял указатели и посмотрел несколько менее брейнфакоподобных языков.
> я наоборот к нотации царского маллока стремился
>Потом попросили реализовать бл**ский двусвязный список.
Надеюсь ты заяснил по хардкору этим анскилябрам, что единственная полезная структура данных - одномерный массив?
Хотя, потом написал калькулятор, где переменные лежали в массиве (double * или variable *), т.к. std::map, документацию на него и все эти ссылки амперсандные не осилил.
> я наоборот к нотации царского маллока стремился
Оно и видно. Цари ведь не используют аллокаторы.
Чтобы понять лучшее - надо изучить асм. Это основа всего. Изучая сишку ты знаешь - как делают питухи и к чему это приводит - и ты уже не будешь делать как питух.
Не изучая сишку, а потокая говну, как ты, - ты будешь до конца дней своих говнарём, который ваяет говно и думает, что ваяет не говно - всё просто.
Поэтому в x64 ты можешь сделать 4к маллоков на всю ширину физического адресного пространства. Это в бесконечное число раз быстрее любого заедушного софтварного аллокатора, ибо любой питушарский аллокатор это же и делает, но имеет оверхед намного больше, чем операции связывания в ведре.
да. но не `char * const`. указатель на конст чар != конст указатель на чар.
> Что же тогда с матрицами то не так?
вот именно это и разница. у тебя констный не массив (который ты прячешь за тайпдефом), а указатель на массив. (в тему почему в С тайпдефы плохо.) если сделаешь из matrix3x4 структуру, то будет работать так как ты ожидаешь.
ЗЫ понедельник. утро. похмелье. может быть гоню.
А у меня сложилось впечатление, что не в тайпдефах тут проблема.
Вы за то, чтобы в языке был явный способ отличить скалярные типы (которые можно передать по значению) от «больших» типов, которые передаются только по указателю?
я ни за, ни против. просто в С это так.
в крестах все меняется, потому что все в классы/структуры завернуто.
И при вызове: