|
Функция, выполняющая действия с аргументами разных типов, Как сделать перегрузку функции |
|
|
|
 |
Ответов
|
Jun 15 2007, 06:50
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(KRS @ Jun 14 2007, 23:50)  Так у вас сейчас вообще у функции аргументов нет! Все через глобальные переменные. Причем ptr - указатель на беззнаковый тип. и адрес переменной offset ему будет присваивать не корректно. Очень ценное замечание... Я и не говорил, что сейчас в моей функции что-либо передавалось. Я спрашивал КАК сделать, чтобы функция могла работать с переменными разных типов. Возможно, это можно сделать через перегрузку функции. Как вы могли заметить, функция действительно называется valcoder. И по идее она должна изменять значение переменных, на которые указывает глобальный указатель. По крайней мере сейчас у меня так работает, только для переменных беззнакового типа. В общем я подумал, проще будет написать отдельную функцию для работы с знаковыми переменными. И соответственно создать указатель знакового типа. Или будут другие предложения?
Сообщение отредактировал alux - Jun 15 2007, 07:16
|
|
|
|
|
Jun 15 2007, 07:22
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(alux @ Jun 15 2007, 13:50)  Очень ценное замечание... Я и не говорил, что сейчас в моей функции что-либо передавалось. Я спрашивал КАК сделать, чтобы функция могла работать с переменными разных типов. Возможно, это можно сделать через перегрузку функции. Все-таки не понятно, что именно Вы хотите. Перегрузка имени функции - это использование одного имени для разных фукнций. Т.е. это не одна функция, которая работает с разныими данными, а это разные функции, которые работают с разными данными. Например: Код void f(int x) { ... } void f(float x) { ... }
...
f(1); // вызывается void f(int x) f(1.0) // вызывается void f(float x) Вообще, написать функцию, которая бы работала с разными типами данных на С++, нельзя - как компилятор будет знать, какой код ему родить, если он не знает их типов (ни размеров, ни форматов). Существует случай, когда хотя данные и разные, но работа с ними делается единообразно, и писать аналогичный, почти повторяющийся код в разных функциях не есть достойное занятие. Для этого случая в С++ имеются шаблоны, которые позволяют описать действия функции без привязки к конкретному типу, а при использовании - инстанцировать функцию по шаблону с заданным параметром. Например: Код template<typename T> T square(T x) { return x*x; }
...
int x = square(5);
printf("Result: %d\n", x);
float y = square(5.0);
printf("Result: %f\n", y);
результат:
Result: 25 Result: 25.000000 В общем, Вам бы надо поконкретнее определиться, что именно Вам нужно, и уже на основе этого выбирать средство для реализации.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 15 2007, 08:33
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(dxp @ Jun 15 2007, 10:22)  Существует случай, когда хотя данные и разные, но работа с ними делается единообразно, и писать аналогичный, почти повторяющийся код в разных функциях не есть достойное занятие. Для этого случая в С++ имеются шаблоны, которые позволяют описать действия функции без привязки к конкретному типу, а при использовании - инстанцировать функцию по шаблону с заданным параметром. Вот это уже ближе к делу. А есть ли такая возможность (создание шаблонов) в Си? Цитата(DRUID3 @ Jun 15 2007, 00:02)  Не очень элегантно, но когда человек покупает стиральную машину ему главное чтобы она долго и упорно работала, а не стиль зашитого в нее кода...  Согласен. Некрасиво работать через указатель на глобальные переменные. Сделал так: unsigned char value1; signed char value2; unsigned char valcoder(unsigned char); unsigned char valcoder(unsigned char x) { if(++x>250) x=0; ................ } //Вызов функции: value1=valcoder(value1); Для переменной signed char value2 функция valcoder должна сделать то же самое, отличие состоит только в проверке на другой диапазон. Если создать шаблонную функцию, как говорил dxp, можно ли создать специализированную версию функции? Например вот так: template <typename T> signed char valcoder(T x) { if(++x>120) x=0; .............. } //Вызов функции: value2=valcoder(value2);
Сообщение отредактировал alux - Jun 15 2007, 08:47
|
|
|
|
Сообщений в этой теме
alux Функция, выполняющая действия с аргументами разных типов Jun 14 2007, 20:18      KRS Цитата(alux @ Jun 15 2007, 13:31) У меня ... Jun 15 2007, 09:38 DRUID3 Цитата(alux @ Jun 14 2007, 23:18) Т.е. чт... Jun 14 2007, 21:02 alux Цитата(DRUID3 @ Jun 15 2007, 00:02) Хоть ... Jun 15 2007, 07:21 vet Термин "перегруженная функция" означает ... Jun 15 2007, 07:13 alux Номер с template не прошел. Проще действительно со... Jun 15 2007, 09:45 Сергей Борщ Цитата(alux @ Jun 15 2007, 12:45) Номер с... Jun 15 2007, 20:13  alux Цитата(Сергей Борщ @ Jun 15 2007, 23:13) ... Jun 16 2007, 20:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|