Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с массивом любого типа? если неимеет значения тип данных 
:(
    Опции темы
Quadruple
  Дата 31.3.2005, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



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

short, int, float, double

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

Как сделать такую функцию? Или такого сделать нельзя? smile
PM   Вверх
chipset
Дата 31.3.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Передавай массив по указателю.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Quadruple
Дата 31.3.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



chipset
void* ?

А мне компилер пишет что array unknow or ZERO, если сделать так: array[0].
PM   Вверх
chipset
Дата 31.3.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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

Код

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



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
azesmcar
Дата 31.3.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

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

Добавлено @ 10:45
template тебя чем не устраивает?
PM   Вверх
Quadruple
Дата 31.3.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



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.
PM   Вверх
chipset
Дата 31.3.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Код

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


Это сообщение отредактировал(а) chipset - 31.3.2005, 11:03


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 31.3.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



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 соответственно.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
azesmcar
Дата 31.3.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ну и что, так не работает?
Код

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* и автоматически делал кастинг...Только не помню как это делалось, а книги под рукой нету...тоже неплохой вариант..и памяти меньше занимает и код меньше получится...
PM   Вверх
Quadruple
Дата 31.3.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



azesmcar
с template там не все так просто, копилир ругается Cannot use template...

Вот идея chipset с подстановкой типа интересна, определяю тип через typeid, только неудается мне его подставить.
PM   Вверх
jorkug
Дата 31.3.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 21.3.2005

Репутация: нет
Всего: 1



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

Ты вообще в какой среде пишешь?
PM MAIL   Вверх
Quadruple
Дата 31.3.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



jorkug
Билдер. Я просто template как-то вот непользуюсь пока smile

Вобщем все решил, всем спасибо smile
PM   Вверх
Fire-Plug
Дата 1.4.2005, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(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) вариант кода? Ведь кастать придется каждую операцию! Есть ещё мнения?
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
azesmcar
Дата 1.4.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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


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


Ну и где ты это написал? что то не вижу...ты предлагаешь или то или то...поскольку я тебя не знаю считаю что ты человек который предлагает осмысленные вещи...и коли уж предложил вместо темплейт написать самому перегруженные функции то в этом нашел какой то смысл который не сумел найти я. А насчет того что если уж вдруг не получиться у тебя ни слова...
Лично я если что то не работает пытаюсь понять почему не работает а не искать других решений. Quadruple Может в настройках компилера отключено...где то и в каком то компиляторе попалась мне такая птичка...у тебя что стоит?
PM   Вверх
np9mi7
Дата 1.4.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Код

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 ить к типу который тебе нужен... Как хотел то?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.