реклама на сайте
подробности

 
 
> Функция, выполняющая действия с аргументами разных типов, Как сделать перегрузку функции
alux
сообщение Jun 14 2007, 20:18
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Т.е. чтобы в функцию передавался аргумент, который может быть как unsigned char , так и signed char.
Сейчас у меня работает так::
//Глобальные переменные
unsigned char* ptr;
unsigned char val;
signed char offset;
void valcodr(void);

//Определение
void valcoder(void)
{
выполняет действия с ptr;
}

//Вызов функции, которая изменяет переменную val
ptr=&val;
valcoder();

Вопрос. Как теперь заставить функцию работать с знаковой переменной offset? Возможна ли такая перегрузка функции?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Jun 14 2007, 20:50
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Так у вас сейчас вообще у функции аргументов нет!
Все через глобальные переменные.
Причем ptr - указатель на беззнаковый тип. и адрес переменной offset ему будет присваивать не корректно.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 15 2007, 06:50
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(KRS @ Jun 14 2007, 23:50) *
Так у вас сейчас вообще у функции аргументов нет!
Все через глобальные переменные.
Причем ptr - указатель на беззнаковый тип. и адрес переменной offset ему будет присваивать не корректно.

Очень ценное замечание... Я и не говорил, что сейчас в моей функции что-либо передавалось. Я спрашивал КАК сделать, чтобы функция могла работать с переменными разных типов. Возможно, это можно сделать через перегрузку функции. Как вы могли заметить, функция действительно называется valcoder. И по идее она должна изменять значение переменных, на которые указывает глобальный указатель. По крайней мере сейчас у меня так работает, только для переменных беззнакового типа.

В общем я подумал, проще будет написать отдельную функцию для работы с знаковыми переменными. И соответственно создать указатель знакового типа. Или будут другие предложения?

Сообщение отредактировал alux - Jun 15 2007, 07:16
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 15 2007, 07:22
Сообщение #4


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


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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 15 2007, 08:33
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(dxp @ Jun 15 2007, 10:22) *
Существует случай, когда хотя данные и разные, но работа с ними делается единообразно, и писать аналогичный, почти повторяющийся код в разных функциях не есть достойное занятие. Для этого случая в С++ имеются шаблоны, которые позволяют описать действия функции без привязки к конкретному типу, а при использовании - инстанцировать функцию по шаблону с заданным параметром.

Вот это уже ближе к делу. А есть ли такая возможность (создание шаблонов) в Си?


Цитата(DRUID3 @ Jun 15 2007, 00:02) *
Не очень элегантно, но когда человек покупает стиральную машину ему главное чтобы она долго и упорно работала, а не стиль зашитого в нее кода... smile.gif

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

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
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 15 2007, 09:13
Сообщение #6


Adept
******

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



Цитата(alux @ Jun 15 2007, 15:33) *
Вот это уже ближе к делу. А есть ли такая возможность (создание шаблонов) в Си?

Нет, шаблоны - это С++ная фишка. А в чем проблема-то? Кроссплатформенный компилятор IAR вполне поддерживает шаблоны. Не только шаблоны функций, но и классов. Если компилятор умеет - пользуйтесь. Только надо режим ++ включить у компилятора.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 04:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016