Другие языки программирования и технологии
Вопрос для тех кто знает точный ответ, язык C про функции все подробности вопроса внутри...
Вообщем изучаю язык C при создании любой функции чтобы она не делала, необходимо указать тип возвращаемого значения, и должна получать параметры в строго указанном типе, например я создаю функцию для сортировки массива, всё её параметры типа int, я вызываю функцию сортировки передаю ей массив с несколькими элементами типа int всё хорошо работает, но когда я передаю функции массив типа double компилятор начинает уже ругаться, я понимаю что это неправильно, если производить явное преобразование, то дробная часть отсекается, это уже совсем не то что нужно, и тут приходится создавать другую функцию и называть её как то типа sort_double sort_int вот так делать конечно не очень хочется, хочется чтоб функция была универсальная, в языке C этого точно наверное не достичь. В будущем я собираюсь рассматривать язык GO те кто программирует на этом языке, можете ответить там нету таких проблем как в C? Или это во всех типизированных языках нужно создавать отдельные функции к каждом типу данных? Заранее благодарю.
Проще всего делать универсальные функции в языках, поддерживающих обобщённое программирование (generic, template): C++, Java, C# и т. д. Там пишется шаблон функции, в котором типы тоже являются параметрами (особого вида) и при вызове функции эти типы-параметры явно указываются. А компилятор автоматически генерирует отдельный экземпляр функции для каждой используемой комбинации типов. Т. е., фактически, компилятор сам создаёт sort_int, sort_double и т. д. - без твоего участия.
Если такого механизма нет, всё становится сложнее...
Всё, что нужно для сортировки массива - это знать размер массива, иметь возможность получить/записать элемент по его индексу и иметь возможность сравнить два элемента.
В C универсальная функция qsort получает 4 параметра: адрес массива, кол-во элементов в массиве, размер одного элемента и функцию, сравнивающую два элемента. Это простейшее решение "в лоб", которое вполне неплохо работает для массивов (вместо копипаста всей функции сортировки надо копипастить только простейшую функцию сравнения), но, как и всё в C, является предельно ненадёжным.
В Go обобщённого программирования ещё нет (обещают завезти в течение пары лет), но есть интерфейсы, так что там пошли по другому пути: функция sort.Sort принимает любое значение, которое реализует интерфейс sort.Interface, включающий в себя три метода: Len - длинна коллекции, Less - сравнение значений элементов с индексами i и j и Swap - обмен значений элементов с индексами i и j. Да, придётся писать больше функций для каждого типа, но данный подход позволяет сортировать не только последовательно размещённые в памяти значения. Впрочем, для []int, []float64 и []string в модуле sort уже определены отдельные типы, реализующие сортировку.
P.S. Go хорош, в том числе, тем, что его стандартная библиотека написана на самом Go и в любой момент можно посмотреть её исходники.
Если такого механизма нет, всё становится сложнее...
Всё, что нужно для сортировки массива - это знать размер массива, иметь возможность получить/записать элемент по его индексу и иметь возможность сравнить два элемента.
В C универсальная функция qsort получает 4 параметра: адрес массива, кол-во элементов в массиве, размер одного элемента и функцию, сравнивающую два элемента. Это простейшее решение "в лоб", которое вполне неплохо работает для массивов (вместо копипаста всей функции сортировки надо копипастить только простейшую функцию сравнения), но, как и всё в C, является предельно ненадёжным.
В Go обобщённого программирования ещё нет (обещают завезти в течение пары лет), но есть интерфейсы, так что там пошли по другому пути: функция sort.Sort принимает любое значение, которое реализует интерфейс sort.Interface, включающий в себя три метода: Len - длинна коллекции, Less - сравнение значений элементов с индексами i и j и Swap - обмен значений элементов с индексами i и j. Да, придётся писать больше функций для каждого типа, но данный подход позволяет сортировать не только последовательно размещённые в памяти значения. Впрочем, для []int, []float64 и []string в модуле sort уже определены отдельные типы, реализующие сортировку.
P.S. Go хорош, в том числе, тем, что его стандартная библиотека написана на самом Go и в любой момент можно посмотреть её исходники.
Смотри функцию qsort в stdlib
Осваивай C++. Там это можно. Полиморфные, они же перегруженные, функции.
Похожие вопросы
- Вопрос актуальности языка C++, расхождение источников. Мне нужна достоверная инфа на это счет.
- C++ Builder. Вопрос внутри.
- Вау, у меня есть вопрос =D . Часть знаю как решить а часть нет. Тогда задам подвопрос. Язык - C# C++ Pascal на выбор
- Вопрос по языку C#
- Вопрос по изучению языка C++?
- Существует ли учебное пособие по программированию С++? Конечно же, подробности вопроса внутри)
- В чем причина ненависти к языкам C, C#, C++ на ответах?
- Язык программирования! Дайте мне точный ответ уважаемые, от вашего ответа зависят мои следующие 2-3 года
- heloword не запускается!? вопрос внутри!и код C+ builder! программа на С!
- Не знаю ни одного языка программирования и решил начать изучать язык c++