LINUX.ORG.RU

Передача параметра в фенкцию.


0

0

Есть функция main в которой задан тип переменной var.

Как передать эту переменную в функцию так чтобы функция не знала заранее тип переменной?

Глобальные переменные и ... не подходит.

Кстати переменные должны по ходу прогкаммы могут передаваться разные и разных типов.

Заранее спасибо


указатель на void передавай, а в функции приводи (если это С)

если это ява то используй для переменной тип Object.

guardian
()

Язык, задача?

> Есть функция main в которой задан тип переменной var.

Было бы неплохо указать язык програмирования :). Конечно, можно догадаться, что это C или C++, но, во первых, почему нужно догадываться, во вторых, различия между этими языками тоже могут иметь значение.

> Глобальные переменные и ... не подходит.

А почему не подходит ...?

> Кстати переменные должны по ходу прогкаммы могут передаваться разные и разных типов.

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

А вообще, лучше описать исходную задачу, тогда можно будет подсказать подходящее решение.

DKorolkov
()
Ответ на: Язык, задача? от DKorolkov

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

в качестве примера можно взять функцию printf();

friday ★★★
()

Извиняюсь! Недоспал. Время то какое!

Исправляюсь язык c++

printf я уже посмотрел.

Там изначально функции известны все типы которые туда передаются, или я чтото недосмотрел.

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

struct datatype1

{

int var1

int var2

char var3

...

}

struct struct1

{

struct datatype1 data

struct struct1 *next

struct struct1 *prev

}

Сильно упрощенно это выглядит так.

Есть несколько таких структур. В structX меняется только тип data. А в datatypeX любое содержимое. Передается всегда structX, тип данных data в разных struct разный.

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

rock
() автор топика
Ответ на: комментарий от rock

А может классы?

> printf я уже посмотрел.

> Там изначально функции известны все типы которые туда передаются, или я чтото недосмотрел.

Разумеется, ведь для каждого типа нужен свой код для его обработки. Если тип заранее неизвестен, как функция узнает, что с ним делать.

> В функцию должны передаваться структуры состоящие из переменных разных типов данных.

Если используется C++, то, может быть, лучше применить ООП? Вместо структур - классы, порождённые от общего предка. Функция должна ожидать указатель на экземпляр предка, а передаваться ей будет указатель на экземпляр одного из потомков.

Функция должна вызывать виртуальные методы класса, в которых заключён код для работы с разными типами данных.

Это подход C++, а если нужно в стиле C, то первое поле структуры - int с кодом типа, а в функции - switch по этому полю, который выбирает код для работы с нужным типом.

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

В C и C++ тип должен быть известен на этапе компиляции.

DKorolkov
()
Ответ на: А может классы? от DKorolkov

DKorolkov:

> Это подход C++, а если нужно в стиле C, то первое поле структуры - int с кодом типа, а в функции - switch по этому полю, который выбирает код для работы с нужным типом.

Да ну,

В "чистом" Це полиморфики реализуются ничуть не сложнее, чем в ЦеПП. Вместо int с кодом типа и последующим ключом передается указатель на функцию-обработчик специфики. В принципе, даже инкапсуляция не нужна, обработчик можно передавать одним параметром, а указатель на структуру (void*) -- другим. И полиморфизм, и позднее связывание, и безо всяких VMT.

Хорошо известный пример: либЦешная функция qsort().

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Да ну,

> В "чистом" Це полиморфики реализуются ничуть не сложнее, чем в ЦеПП. Вместо int с кодом типа и последующим ключом передается указатель на функцию-обработчик специфики. В принципе, даже инкапсуляция не нужна, обработчик можно передавать одним параметром, а указатель на структуру (void*) -- другим. И полиморфизм, и позднее связывание, и безо всяких VMT.

Знаю, сам так делал. Просто думаю, что автора вопроса этот способ запутает окончательно. Хотя, возможно, я и ошибаюсь.

Если бы он ещё объяснил, для чего ему всё это нужно ... ;-).

DKorolkov
()

А перегрузка функций не подходит? Кажется, это именно то, что Вам нужно.

Laz ★★★★★
()
Ответ на: комментарий от rock

По-простому - это несколько функций с одним именем, но разными аргументами, компилятор сам определяет, какую использовать.
Вот примерчик, сдул из Дейтела-Дейтела:
#include <stdio.h>

int sqr(int);
double sqr (double);

int sqr(int a) {return a*a;};
double sqr(double a) {return a*a;};

int main()
{
  printf(" 5 = %d\n",sqr(5));
  printf(" 5.5 = %f\n",sqr(5.5));
  return 0;
}

------------------------------------

laz@laz:~/devel$ g++ temp.c -o temp   
laz@laz:~/devel$ ./temp 
Квадрат 5 = 25
Квадрат 5.5 = 30.250000
laz@laz:~/devel$ 

Я, честно говоря, не уверен, что это именно то, что Вам нужно, но вполне возможно, что где-нить пригодится.

Laz ★★★★★
()
Ответ на: комментарий от Laz

IMHO перегрузка функций есть не что иное, как систематическое самонадувательство.

Что, кому-нибудь становится легче от того, что две различные функции названы одним и тем же именем? Компилятор все равно за вас их "исказит", чтобы они были разными. Зато ошибку совершить значительно проще...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> IMHO перегрузка функций есть не что иное, как систематическое самонадувательство. Что, кому-нибудь становится легче от того, что две различные функции названы одним и тем же именем?

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

disclaimer: I hate С++

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

> Так и функции должны быть generic, а не перегружаемыми!

почему, нет.. Допустим, наперегружал ты sqr для разных типов, а потом в определении какого-то шаблона параметризованного типом T пишешь sqr( a ), где a -- объект типа T.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Ну так это гнило и небезопасно. Нельзя так.

Правильный подход - модули в OCaml или классы типов в Haskell.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.