Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как работать с массивом любого типа?


Автор: Quadruple 31.3.2005, 10:30
Мне надо в функцию передать массив любой из следующих типов:
Код

short, int, float, double

Внутри функции массив будет изменен оператором =, а также применены операторы > и <.

Как сделать такую функцию? Или такого сделать нельзя? smile

Автор: chipset 31.3.2005, 10:32
Передавай массив по указателю.

Автор: Quadruple 31.3.2005, 10:34
chipset
void* ?

А мне компилер пишет что array unknow or ZERO, если сделать так: array[0].

Автор: chipset 31.3.2005, 10:40
Цитата(Quadruple @ 30.3.2005, 23:34)
А мне компилер пишет что array unknow or ZERO, если сделать так: array[0].

Код

func_array(int *s)
{
//чёта делаешь
}
int main()
{
  int something[20];
  func_array(something);
}

Автор: azesmcar 31.3.2005, 10:43
Код

template <class T>
int func_array(T a[20])
{
    return 0;
}

Добавлено @ 10:45
template тебя чем не устраивает?

Автор: Quadruple 31.3.2005, 11:01
azesmcar
Чето у меня неполучается заюзать template.

Что мне надо, уточняю:
Код

void MyFunction(array, int length)
{
 MyVariable = array[1];

 array[0] = array[1];
 array[1] = array[2];
 array[2] = array[0];
}


array может быть любого типа из short, int, float, double.

Автор: chipset 31.3.2005, 11:03
Код

void MyFunction(custom *array, int length) //вместо type подставь любой нужный тип
{
 MyVariable = array[1];
 array[0] = array[1];
 array[1] = array[2];
 array[2] = array[0];
}

Автор: Fire-Plug 31.3.2005, 11:24
Quadruple
Без template не обойтись. Тип void не поможет, т.к. чтобы доступиться до скажем элемента array[1] нужно правильно сместить указатель. Как получить смещение для типа void, кто-то знает?
Поэтому нужно:
1) Принять решение, предалагаемое azesmcar, только слегка изменить его:
Код

template <class T>
int func_array(T *array, int len)
{
    T   MyVariable = array[1];
    // и т.д.
    return 0;
}

2) Поработать вместо компилера и написать перегруженные ф-ции для всех типов. Здесь нам поможет любимая китайская технология C&P (copy & paste)
Код

int func_array(int *array, int len)
{
    int   MyVariable = array[1];
    // и т.д.
    return 0;
}

int func_array(double *array, int len)
{
    double   MyVariable = array[1];
    // и т.д.
    return 0;
}

Сразу предупреждаю, что у компайлера будут ambiguous-проблемы, т.е. проблемы неопределенности при выборе перегруженной ф-ции по её аргументу для типов short и int, а также float и double, т.к. по умолчанию имеет место продвижение типа переменной short ==> int, float ==> double.
Ну, попробуй. Попытка не пытка
Добавлено @ 11:32
Цитата(Fire @ 31.3.2005, 11:24)
для типов short и int, а также float и double,

Во блин, китайская технология меня уже подвела!
Хотел сказать, что будут проблемы неопределенности при выборе перегруженной ф-ции по её аргументу для типов short и float из-за возможности автоматического приведения аргументов этого типа к типу int и double соответственно.

Автор: azesmcar 31.3.2005, 11:49
Ну и что, так не работает?
Код

template <class T>
void MyFunction(T *array, int length)
{
   T MyVariable = array[1];
   array[0] = array[1];
   array[1] = array[2];
   array[2] = array[0];
}

Добавлено @ 11:52
Цитата
2) Поработать вместо компилера и написать перегруженные ф-ции для всех типов. Здесь нам поможет любимая китайская технология C&P (copy & paste)


А смысл? за тебя это темплейт сделает..кстати насчет темплейта...читал у страуструпа что есть возможность для указателей сделать так чтоб темплейт создавал только одну копию функции с параметром void* и автоматически делал кастинг...Только не помню как это делалось, а книги под рукой нету...тоже неплохой вариант..и памяти меньше занимает и код меньше получится...

Автор: Quadruple 31.3.2005, 13:21
azesmcar
с template там не все так просто, копилир ругается Cannot use template...

Вот идея chipset с подстановкой типа интересна, определяю тип через typeid, только неудается мне его подставить.

Автор: jorkug 31.3.2005, 14:35
Цитата(Quadruple @ 31.3.2005, 13:21)
с template там не все так просто, копилир ругается Cannot use template...

Ты вообще в какой среде пишешь?

Автор: Quadruple 31.3.2005, 15:17
jorkug
Билдер. Я просто template как-то вот непользуюсь пока smile

Вобщем все решил, всем спасибо smile

Автор: Fire-Plug 1.4.2005, 03:40
Цитата(azesmcar @ 31.3.2005, 11:49)
Цитата
2) Поработать вместо компилера и написать перегруженные ф-ции для всех типов. Здесь нам поможет любимая китайская технология C&P (copy & paste)

А смысл? за тебя это темплейт сделает..

Ну, хочется быть как все - приличным участником форума, не язвить, но разве позволят...
azesmcar, ведь сказано немного выше в п. 1) - напиши template-ф-цию, а если по какой-то причине у тебя не получается, то придется самому за компилер поработать и написать соотв. перегруженные версии. Что, некий фильтр отсеял утверждение из п 1) или, быть может, стилистика изложения приводит к ложным выводам?
Вот так и работает механизм возникновения офф-топов.

Цитата
определяю тип через typeid, только неудается мне его подставить

Оператор typeid возвращает ссылку на объект type_info:
Код

const type_info& typeid(type). 

к-рый содержит строку с именем типа.
С моей точки зрения, это обстоятельство не продвигает в направлении требуемого решения ни на йоту.
Как на основе строки с именем типа сделать обощенный(generic) вариант кода? Ведь кастать придется каждую операцию! Есть ещё мнения?

Автор: azesmcar 1.4.2005, 07:45
Цитата
Ну, хочется быть как все - приличным участником форума, не язвить, но разве позволят...
azesmcar, ведь сказано немного выше в п. 1) - напиши template-ф-цию, а если по какой-то причине у тебя не получается, то придется самому за компилер поработать и написать соотв. перегруженные версии. Что, некий фильтр отсеял утверждение из п 1) или, быть может, стилистика изложения приводит к ложным выводам?
Вот так и работает механизм возникновения офф-топов.


Fire-Plug
Цитата
Поэтому нужно:
1) Принять решение, предалагаемое azesmcar, только слегка изменить его:
2) Поработать вместо компилера и написать перегруженные ф-ции для всех типов. Здесь нам поможет любимая китайская технология C&P (copy & paste)


Ну и где ты это написал? что то не вижу...ты предлагаешь или то или то...поскольку я тебя не знаю считаю что ты человек который предлагает осмысленные вещи...и коли уж предложил вместо темплейт написать самому перегруженные функции то в этом нашел какой то смысл который не сумел найти я. А насчет того что если уж вдруг не получиться у тебя ни слова...
Лично я если что то не работает пытаюсь понять почему не работает а не искать других решений. Quadruple Может в настройках компилера отключено...где то и в каком то компиляторе попалась мне такая птичка...у тебя что стоит?

Автор: np9mi7 1.4.2005, 11:56
Код

template <class T>
void some_funk(T* pHead, unsigned int iLength)
{
    for (unsigned int cIndex = 0; cIndex < iLength; cIndex ++)
    {
        *(pHead + cIndex) = 0;
    }
    return;
}
int main(int argc,char* argv[])
{
    float    f    [20];
    int        i    [30];
    short    s    [23];
    double    d    [89];
    //////////////////////////////////////////
    some_funk (f , 20);
    some_funk (i , 30);
    some_funk (s , 23);
    some_funk (d , 89);
    //////////////////////////////////////////
    return 0;
}

заработает, поверь!
К тому же будет работать быстрее чем с void (на этапе компиляции типы известны) + вообще не представляю как ты собрался это делать с void, ведь полюбому придеться от - cast ить к типу который тебе нужен... Как хотел то?

Автор: DerLaM 1.4.2005, 12:19
Всем привет!
У меня вопрос не по теме!
Скажите пожалуйста реально ли изучить с++ (с нуля) за 2 месяца, для того чтобы хотябы научиться делать простую записную книжку?
P.S. Простите за флуд но моя скорость (10 кб/сек) не позволяет найти нужную тему smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)