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

Шаблонные функции и динамические массивы строк - C++

Восстановить пароль Регистрация
 
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
02.10.2013, 11:04     Шаблонные функции и динамические массивы строк #1
Всем доброго времени суток. Я уже наверное всех достал вопросами, но опять не могу отловить ошибку сам...

Задача:
написать шаблонную функцию, которая принимает в качестве аргумента массив элементов Т и целое число, представляющее количество элементов в массиве, а возвращает элемент с наибольшим значением. Программа так же должна содержать специализацию, которая использует массив указателей на char в качестве первого аргумента и количество указателей в качестве второго, а затем возвращает адрес самой длинной строки.

Код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstring>
 
template <typename T>
T maxn(T* arr, int n);
 
template <> char* maxn<char*>(char** arr, int n);
 
using namespace std;
 
int main()
{
    int amount=0;
 
    cout<<"Input amount int val: ";
    cin>>amount;
    int* arr_int=new int[amount];
    cout<<"Input int val: ";
    for(int i=0; i<amount; i++)
        cin>>arr_int[i];
    cout<<"Max elemet of int arr is "<<maxn(arr_int, amount)<<endl;
    delete [] arr_int;
 
    cout<<"Input amount double val: ";
    cin>>amount;
    double* arr_double=new double[amount];
    cout<<"Input double val: ";
    for(int i=0; i<amount; i++)
        cin>>arr_double[i];
    cout<<"Max elemet of double arr is "<<maxn(arr_double, amount)<<endl;
    delete [] arr_double;
 
    cout<<"Input amount char strin val: ";
    cin>>amount;
    cin.get();
    char** str=new char*[amount]; //количество строк
    for(int i=0; i<amount; i++)
        str[i]=new char[256];
    cout<<"Input the strings: ";
    for(int i=0; i<amount; i++)
        cin.getline(str[i], 256);
    cout<<"Biggest string is: "<<maxn(*str, amount);
 
    for(int i=0; i<amount; i++)
        delete [] str[i];
    delete [] str;
 
    return 0;
}
 
template <typename T>
T maxn(T* arr, int n)
{
    T tmp=0;
    for(int i=0; i<n; i++)
        if(arr[i]>tmp)
            tmp=arr[i];
    return tmp;
}
template <> char* maxn<char*>(char** arr, int n)
{
    int Len_Str=0;
    int Indx=0;
    for(int i=0; i<n; i++)
        if(strlen(arr[i])>Len_Str){
            Len_Str=strlen(arr[i]);
            Indx=i;
        }
        return arr[Indx];
}


Проблема: дебагер в code::blocks как-то неясно для меня работает.. В общем когда я построчно выполняю программу доходя до строки 42 (вывод наиболее длинной строки посредство вызова шаблонной функции) сама функция как бы не вызывается, курсор перепрыгивает сразу на delete и выводит первую введенную строку (которая заведомо короче). Сравнивал с ответом из найденного решебника (там алгоритм немного другой, код не использует динамические массивы, а строки и их количество жестко прописано в коде, что мне не интересно ) все вроде как правильно.

На всякий случай вот код из решебника:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
template <typename T>
T maxn (T arr[], int n);
 
template <> char * maxn <char *>(char * pt[], int n);
 
int main()
{
using namespace std;
 
char * pt [5] = {"Arnold Schwarznegger",
                "Joe Pesci",
                "Silvester Stallone",
                "Robert DeNiro",
                "Charlie Chaplin"};
 
char * pt2 = maxn(pt,5);
int arr[6] = {11,2,33,24,85,6};
double arr2[4] = {22.5,5.7,11.5,17.0};
 
 
cout << "The max of INTs is " << maxn(arr,6) << endl;
cout << "The max of DOUBLEs is " << maxn(arr2,4) << endl;
cout << "The longest length string - " << pt2;
 
cin.get();
cin.get();
return 0;
}
 
template <typename T>
T maxn (T arr[], int n)
{
    T max = arr[0];
 
    for (int i=1; i<n; i++)
        if (max < arr[i])
            max = arr[i];
             
    return max;
}
 
template <> char * maxn <char *>(char * pt[], int n)
{
    int max;
    int maxindex;
 
    max = strlen(pt[0]);
    maxindex = 0;
 
 
    for (int i=0; i < n; i++)
    {
        if (max < strlen(pt[i]))
        {
            max = strlen(pt[i]);
            maxindex = i;
        }
    }
    return pt[maxindex];
}
Источник и авторство
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 11:04     Шаблонные функции и динамические массивы строк
Посмотрите здесь:

C++ Снова динамические массивы и функции
C++ Динамические строки и массивы строк
C++ Функции и динамические массивы.
C++ Динамические массивы, удаление строк/столбцов
C++ Динамические массивы и функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HedgehogLu
 Аватар для HedgehogLu
146 / 67 / 1
Регистрация: 04.09.2013
Сообщений: 250
02.10.2013, 11:33     Шаблонные функции и динамические массивы строк #2
так у вас в 42 строке и проблемка
Цитата Сообщение от h_wolf Посмотреть сообщение
cout<<"Biggest string is: "<<maxn(*str, amount);
Функция мак ожидает первым параметром массив строк, а вы передаете первую строку.
Если не ошибаюсь надобно так
C++
1
cout<<"Biggest string is: "<<maxn(str, amount);
h_wolf
02.10.2013, 11:36  [ТС]
  #3

Не по теме:

HedgehogLu, как перестать путаться в типах данных?

HedgehogLu
02.10.2013, 11:42
  #4

Не по теме:

ну просто не спешить
и не забывать что при объявлении типа * означает, что будет использоваться указатель. А вот при использовании самой переменной * т.с. разыменовывает указатель и достает из него значение на которое он указывает.

а вообще с опытом придет само.

h_wolf
02.10.2013, 11:43  [ТС]
  #5

Не по теме:

HedgehogLu, стыдно за такие глупые ошибки....еще раз спасибо за помощь.

HedgehogLu
02.10.2013, 11:52     Шаблонные функции и динамические массивы строк
  #6

Не по теме:

не ошибается только тот, кто ничего не делает всем мы учимся на ошибках. кто на своих... кто на чужих.. Но именно на ошибках.
Дерзайте!

Yandex
Объявления
02.10.2013, 11:52     Шаблонные функции и динамические массивы строк
Ответ Создать тему
Опции темы

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