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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> специализация и масив указателей, специализация, масив указателей и адрес  
:(
    Опции темы
pycha
Дата 23.6.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


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

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



Драсте. Тут есть одна програмка: должна иметь шаблонную функцию , что принимает масив и возвращает наибольшее значение в масиве.
Так же должна быть специализация, которая принимает масив указателей на сhar и возвращает адрес самой длинной строки. Вот какраз со специализацией у меня чтото не получается, я чтото запутался. Вот что я сделал:
Код

#include <iostream>
#include <cstring>
using namespace std;
template<typename t>
t maxs(t mas[], int z);
template <> char * maxs(char * mas[],int z);
 
int main()
{
    int mas1[4] = {1, 2,3, 4};
    double mas2[6] = {2.3, 4.9, 4.5, 6.7,8.9, 1.0};
    char  * mas6[3][20]=
    {
        "malenkaya ",
        "srednyaya str",
        "samaya bolchaya"
    };
    int x = maxs(mas1,4);
    double y = maxs(mas2,6);
    cout << "naibolchee znachenie int i double\n"
        << x <<"\t"<<y<< endl;
    char * n =maxs(mas6,3);
    cout << *n<<endl;
    return 0;
}

template<typename t>
t maxs(t mas[], int z)
{
    double x=0;
    for (int i=0; i<z;i++)
     if (x<mas[i])
        x=mas[i];
    return x;
}

template <> char * maxs(char * mas[],int z)
{
    int t=0,r=0;
    char y= 'a';
    char *c =&y;
    for(int i=0; i<z; i++)
    {
     t=strlen(*mas[i]);
     r=strlen(*c);
     if(t>r)
        c = mas[i];
    }
        
    return c;
}

Подскажите как надо правильно.
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
bsa
Дата 23.6.2008, 13:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



pycha, функции специализировать не рекомендуется. Лучше сделай обычную перегрузку.
PM   Вверх
pycha
Дата 23.6.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


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

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



Это задача на специализацию, я ее хочу сделать для себя. Это не главное . Главная проблема что функция strlen кричит про несоотвествие типов, и в специализацию я параметры тоже параметры неверно передаю, и по неопытности никак не могу понять что не так. Вот ошибки:
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(24) : error C2893: Failed to specialize function template 't maxs(t [],int)'
        With the following template arguments:
        'char *[20]'
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(46) : error C2664: 'strlen' : cannot convert parameter 1 from 'char' to 'const char *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(47) : error C2664: 'strlen' : cannot convert parameter 1 from 'char' to 'const char *'
       
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
bsa
Дата 23.6.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



pycha, понимаешь в чем штука, если бы ты для начала сделал перегрузку, то было бы тебе легче найти ошибку. А ошибка заключается в том, что ты передаешь maxs не char *[], а char *[3][20], а это разные вещи. Первое - одномерный массив указателей на char, а второе - двумерный массив указателей на char.
PM   Вверх
pycha
Дата 23.6.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


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

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



Блин, у меня ощущение что я по пояс деревяный,- потомучто никак не могу понять как надо сделать правильно: так как передаю двухмерный масив написал в обявлении 
template <> char * maxs(char * mas[][],int z)
а оно в ответ еще кучу ошибок:

g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(8) : error C2087: 'mas' : missing subscript
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(8) : error C2782: 't maxs(t [],int)' : template parameter 't' is ambiguous
        g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(7) : see declaration of 'maxs'
        could be 'char *'
        or       'char *[1]'
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(8) : error C2785: 't maxs(t [],int)' and 'char *maxs(char *[][1],int)' have different return types
        g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(7) : see declaration of 'maxs'
        g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(8) : see declaration of 'maxs'
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(8) : error C2912: explicit specialization; 'char *maxs(char *[][1],int)' is not a specialization of a function template
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(24) : error C2893: Failed to specialize function template 't maxs(t [],int)'
        With the following template arguments:
        'char *[20]'
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(39) : error C2087: 'mas' : missing subscript
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\5\5\5.cpp(47) : error C2664: 'strlen' : cannot convert parameter 1 from 'char' to 'const char *'

Понимаю что говорит что в обявлении должно быть (could be 'char *'  or       'char *[1]') но как же правильно обьявить?
И еще (error C2664: 'strlen' : cannot convert parameter 1 from 'char' to 'const char *') -  почему говорит что ему надо  'const char *' 
Напишите пожалуйста как надо правильно обьявить (ибо я как об стенку горохом-ничего не доходит)
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
bsa
Дата 24.6.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



конечно так нельзя. нужно обязательно указывать все размерности многомерных массивов кроме последней.
Вот пример шаблона определения количества элементов в статическом массиве на этапе компиляции:
Код
#include <iostream>

template<typename T, unsigned size>
unsigned size_of_array(T (&array)[size])
{
        return size;
}

int main()
{
        int array[100];
        std::cout << size_of_array(array) << std::endl;
        return 0;
}
Надеюсь, догадаешься, что изменить?  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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