Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DraikoN
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
#1

Явные специализации и массивы строк - C++

23.08.2012, 17:41. Просмотров 672. Ответов 4
Метки нет (Все метки)

Не знаю, как еще точнее это назвать...
В задании написано:
Сделайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое число, представляющее собой количество элементов в массиве, и которая возвращает элемент с наибольшим значением в этом массиве.
Проверьте ее в программе, которая использует шаблон данной функции с массивом из шести значений типа int и с массивом из четырех значений типа double.
Программа также должна включать специализацию, которая использует в качестве аргумента массив указателей на char и число указателей в качестве второго аргумента и которая возвращает адрес самой длинной строки. Если имеется более одной строки наибольшей длины, функция возвращает адрес первой из них. Выполнить проверку специализации на примере массива, состоящего из пяти указателей на строки.
Проблема в том, что компилятор выдает ошибку:
"Exercize8.6.exe": Загружено: "D:\+PROJECTS+\Visual Studio\Exercize8.6\Debug\Exercize8.6.exe", Символы загружены.
"Exercize8.6.exe": Загружено: "C:\Windows\System32\ntdll.dll", Невозможно найти или открыть файл PDB
"Exercize8.6.exe": Загружено: "C:\Windows\System32\kernel32.dll", Невозможно найти или открыть файл PDB
"Exercize8.6.exe": Загружено: "C:\Windows\System32\KernelBase.dll", Невозможно найти или открыть файл PDB
"Exercize8.6.exe": Загружено: "C:\Windows\System32\msvcp100d.dll", Символы загружены.
"Exercize8.6.exe": Загружено: "C:\Windows\System32\msvcr100d.dll", Символы загружены.
Первый этап обработки исключения в "0x010c2984" в "Exercize8.6.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Необработанное исключение в "0x010c2984" в "Exercize8.6.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Первый этап обработки исключения в "0x010c2984" в "Exercize8.6.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Необработанное исключение в "0x010c2984" в "Exercize8.6.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Первый этап обработки исключения в "0x010c2984" в "Exercize8.6.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Поток 'Поток Win32' (0xa58) завершился с кодом -1073741749 (0xc000004b).
Программа "[1724] Exercize8.6.exe: Машинный код" завершилась с кодом -1073741510 (0xc000013a).
те программа компилируется, но после ввода первой строки выдает ошибку.
где то проблема с istream - точно понять в чем проблема не в состоянии.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <Windows.h>
#include <ctime>
#include <cstring>
#include <cstdlib>
using namespace std;
 
template <typename Any> Any MaxCount(Any *arr, int n);
 
[B]//создаем явную специализацию[/B]
template <> int MaxCount (char * ukChar[], int n);         //подсвечивает MaxCount в этой строке (!)
//порыскав в инете и если написать вместо строки выше вот это:
//template <int> int MaxCount (char * ukChar[], int n);
//то прога компилируется но выдает ошибку описанную выше
 
template <typename what> void ShowArr(what *arr, int n);
void ShowStrArr(char *str[], int n);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    /*cout << "введите кол-во элементов в массиве int:\t";              //int
    int icol = 0;
    (cin >> icol).get();
    cout << "введите 5 int значений:\n";
    const int length = 10;
    int iarr[length];
    for (int i = 0; i < icol; i++)
    {
        cout << i + 1 << ":\t";
        (cin >> iarr[i]).get();
    }
    ShowArr(iarr, icol);
    cout << "введите кол-во элементов в массиве double:\t";         //double
    int dcol = 0;
    (cin >> dcol).get();
    cout << "введите 5 double значений:\n";
    double darr[length];
    for (int d = 0; d < dcol; d++)
    {
        cout << d + 1 << ":\t";
        (cin >> darr[d]).get();
    }
    ShowArr(darr, dcol);
    cout << "\n\nрезультаты:\nдля int:\t" << MaxCount(iarr, icol)       //result
         << "\nдля double:\t" << MaxCount(darr, dcol);*/
 
    cout << "\n\n\nВведите строки(5 штук):\n";                          //char
    const int chcol = 5;
    char *chArr[chcol]; 
    for (int i = 0; i < chcol; i++)
    {
        cout << "Введите строку №" << i+1 << ":\t";
        (cin >> chArr[i]).get();
    }
//собственно проблема где то тут ->
    cout << "\n" << MaxCount(chArr, chcol);
    ShowStrArr(chArr, chcol);
 
    cin.get();
    float secs = 10;
    clock_t delay = secs * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay);
    return 0;
}
 
template <typename Any> Any MaxCount(Any *arr, int n)
{
    Any temp = 0;
    for (int i = 0; i < n; i++)
        if (arr[i] >= temp)
            temp = arr[i];
    return temp;
}
 
template <int> int MaxCount (char * ukChar[], int n)       //смотреть сюда :)
{
    int temp =0;
        int tmp = 0;
       for (int i = 0; i<k; i++)
       {
            if (tmp < strlen(ukChar[i]))
            {
                tmp = strlen(ukChar[i]);
                temp = &ukChar[i];
             }
            cout << ukChar[i] << endl;
       };
    return  temp;
}
 
template <typename what> void ShowArr(what *arr, int n)
{
    for (int i = 0; i < n; i++)
        cout << "Значение №" << i+1 << "\t" << arr[i] << endl;
}
void ShowStrArr(char *str[], int n)
{
    cout << "Вы ввели " << n << " строк:\n";
    for (int i = 0; i < n; i++)
        cout << "Строка #" << i + 1 << ":\t" << str[i] << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Явные специализации и массивы строк (C++):

явные преобразования - C++
откоректируйте синтаксис Any a; f(&quot;&quot;,ios::binary); /* * */ f.write((char*) a,sizeof(a));

Специализации шаблонов класса - C++
Из книги Просьба пример показать. А-то не очень понятно. Как-то очень обобщенно.

Специализации шаблонов классов - C++
Здравствуйте, возникла следующая проблема. Пишу класс Матрица со след. шаблонными параметрами. template&lt;typename Type, size_t...

Тест по специализации шаблонов - C++
Всех приветствую. Столкнулся с подобной проверкой знаний при переводе в другой универ, а именно предлагается нижеприведённый тест для...

Массивы структур и массивы строк - C++
1. Сформировать динамический массив из элементов структурного типа. Структурный тип определен в варианте. 2. Распечатать...

Массивы структур и массивы строк - C++
Здравствуйте. Возникла проблема с одной работой: Постановка задачи: 1. Сформировать динамический массив из элементов структурного типа....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 17:43 #2
Цитата Сообщение от DraikoN Посмотреть сообщение
template <typename Any> Any MaxCount(Any *arr, int n);
//создаем явную специализацию
template <> int MaxCount (char * ukChar[], int n); * * * * //подсвечивает MaxCount в этой строке (!)
какая же это специализация? это новая функция и естественно это не соответствует заданию
Цитата Сообщение от DraikoN Посмотреть сообщение
Программа также должна включать специализацию, которая использует в качестве аргумента массив указателей на char и число указателей в качестве второго аргумента и которая возвращает адрес самой длинной строки.
DraikoN
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
23.08.2012, 18:00  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
какая же это специализация? это новая функция и естественно это не соответствует заданию
объясни тогда, что такое явная специализация? а лучше приведи пример, на основе моего кода.

PS нашел в инете решение этой задачи, но у меня вот эти строчки опять подсвечиваются, а именно maxn

C++
1
2
template <typename T> T maxn (T Arr[], int k);
template <> int maxn (char * , int );
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 18:21 #4
ваш код мне разбирать в лом

вот рабочий пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cstring>
#include <stddef.h>
 
template< typename T >
T max(T* arr, size_t size)
{
    T tmp = arr[0];
    
    for (size_t i = 1; i < size; ++i)
        if (tmp < arr[i])
            tmp = arr[i];
 
    return tmp;
}
 
template< >
const char* max<const char*>(const char** arr, size_t size)
{
    size_t tmp_l = std::strlen(arr[0]);
    const char* tmp_s = arr[0];
 
    for (size_t i = 1; i < size; ++i)
    {
        size_t tmp = std::strlen(arr[i]);
        if (tmp_l < tmp)
        {
            tmp_l = tmp;
            tmp_s = arr[i];
        }
    }
 
    return tmp_s;
}
 
int main()
{
    {
        int arr[] = { 1, 2, 9, 5, 11, 100500 };
        std::cout << ::max(arr, sizeof(arr) / sizeof(int)) << std::endl;
    }
 
    {
        const char* arr[] = { "hello", "hello world", "world", "test" };
        std::cout << ::max(arr, sizeof(arr) / sizeof(char*)) << std::endl;
    }
}

ваша же ошибка в том что тип возвращаемого значения не совпадает с типом специализации
Цитата Сообщение от DraikoN Посмотреть сообщение
C++
1
2
template <typename T> T maxn (T Arr[], int k); // параметр шаблона T и тип возвращаемого значения - T
template <> int maxn (char * , int ); // параметр шаблона char*, какого дьявола возвращаемый тип int!?
DraikoN
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
23.08.2012, 18:35  [ТС] #5
Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 18:35
Привет! Вот еще темы с ответами:

Ошибка при специализации шаблона - C++
Пишу: template &lt;&gt; struct Test &lt; int&gt; { Test(int x) :x(x) {} int Cout () { cout &lt;&lt; &quot;Bool&quot;; ...

Отличия явной специализации от частичной - C++
Чем явная специализация шаблонов отличается от частичной? Когда стоит писать template &lt;&gt; class A&lt;int&gt;, а когда template &lt;class T&gt; class...

Специализации шаблона функции или перезагрузка - C++
Доброго времени суток. Собственно, мою проблему можно увидеть в коде: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; ...

Ошибка определения специализации шаблонного класса - C++
На этом месте вылазит ошибка: Error 1 error C3413: 'MyClass&lt;int&gt;' : invalid explicit instantiation template class MyClass&lt;int&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.08.2012, 18:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru