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

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

Восстановить пароль Регистрация
 
DraikoN
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
23.08.2012, 17:41     Явные специализации и массивы строк #1
Не знаю, как еще точнее это назвать...
В задании написано:
Сделайте шаблонную функцию 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++
Массивы строк C++
Специализации шаблонов классов C++
О специализации шаблона: почему код компилируется? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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
Каратель
Эксперт C++
6543 / 3963 / 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
Спасибо
Yandex
Объявления
23.08.2012, 18:35     Явные специализации и массивы строк
Ответ Создать тему
Опции темы

Текущее время: 13:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru