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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Получить температуру процессора http://www.cyberforum.ru/cpp-beginners/thread966972.html
Кто-нибудь занимался вопросом по получению данных из HW монитора BIOS из-под Окошек? WMI и CIM(хотя по большому счету это одно и то же) сразу пришлось отбросить, потому как в пространстве имен нет ни одного объекта классов Win32_TemperatureProbe или CIM_TemperatureSensor. Сами классы есть - объектов нет. Я, с каждым днем, все больше и больше начинаю верить в то, что из под Окошек, да еще и без...
C++ ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты. Колода, начинается с двоек до туза, по очереди, для каждой масти. через 52 кейсай делать не вариант. Подскажите как можно другим способам?(Использовать только if switch enum)Уже голову сломал и тока мысли про 52case http://www.cyberforum.ru/cpp-beginners/thread966971.html
C++ операторы
Здравствуйте, столкнулся с такой проблемой Есть мной написаный класс Set(множество с дискретной математики) Есть метод Complement который мне должен вернуть новый обьект, дополнение множества Set Complement() { vector<set> temp = _vector; for(int i = 0; i < size; i++) if(temp.getIsPlaced()) temp.setIsPlaced(false);
Функция указатель на класс, определенный внутри шаблонного класса C++
Доброго времени суток! Помогите пожалуйста разобрать со следующим кодом: template <class T> class List{ class Node{ public: T d; Node(T d){/..../}; //тело ф-ции. }; Node *pbeg, *pend;
C++ Функции fseek, _fseeki64 http://www.cyberforum.ru/cpp-beginners/thread966886.html
Ребят как по умному объяснить преподавателю что я использую функцию _fseeki64 для того чтобы создавать большие файлы, потому что функция fseek не создает файлы больше 4GB. Вот сам код: #include <iostream> #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv) { setlocale(LC_ALL, "russian"); __int64 start, finish, move; FILE *f;
C++ Разъясните пожалуйста фрагмент программы Даны произвольные числа a b c.Написать программу,которая проверяла бы,можно ли построить треугольник с такими длинами сторон, и если можно, то определить вид треугольника по соотношению сторон (равносторонний, равнобедренный, разносторонний) и по соотношению углов( остроугольный ,прямоугольный, тупоугольный). По результатам проверки вывести на экран соответствующее сообщение. #include... подробнее

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

Задача:
написать шаблонную функцию, которая принимает в качестве аргумента массив элементов Т и целое число, представляющее количество элементов в массиве, а возвращает элемент с наибольшим значением. Программа так же должна содержать специализацию, которая использует массив указателей на 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];
}
Источник и авторство
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru