Шаблон массива не работает с float/double

248
13 октября 2017, 16:18

Здравствуйте. Вот задание:


То есть выполнить задание 2 варианта используя шаблоны.

Я написал такой код. Но он работает только с integer'ом. С флоатом и даблом выдает какую то хрень. Я делал отладку пошагово и понял что ошибка где то в функции void create(T *arr, T n); Но в чем именно вообще не понимаю

Если подскажете буду очень благодарен.

#include <iostream>
#include <math.h>
using namespace std;
template <typename T> int func(T n);
template <typename T> void create(T *arr, T n);
template <typename T> T positiv(T *arr, int n);
template <typename T> T proizv(T *arr, int n);
template <typename T> void sort(T *arr, int n);
template <typename T> void print(T *arr, int n);

int main()
{
    int n;
    cin >> n;
    func(n);
    return 0;
}
template <typename T>
int func(T n)
{
    T *arr1 = new T[n];
    create(arr1, n);

    /*T *arr2 = new T[n];
    create(arr2, n);

    T *arr3 = new T[n];
    create(arr3, n);*/
    //T s1 = positiv(arr1, n);
    //T p1 = proizv(arr1, n);
    //sort(arr1, n);
    //T s2 = positiv(arr2, n);
    //T p2 = proizv(arr2, n);
    //sort(arr2, n);
    //T s3 = positiv(arr3, n);
    //T p3 = proizv(arr3, n);
    //sort(arr3, n);
    //cout << s1 << " ";
    //if (p1 == -100)
    //  cout << "No elements between max and min." << endl;
    //else
    //  cout << p1 << endl;
    print(arr1, n);
    /*cout << s2 << " ";
    if (p2 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p2 << endl;
    print(arr2, n);
    cout << s3 << " ";
    if (p3 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p3 << endl;
    print(arr3, n);*/
    system("pause");
    return 0;
}
template <typename T>
void create( T *arr, T n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = 0;
    }

    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
}
template <typename T>
T positiv(T *arr, int n)
{
    T  i, summ;
    for (i = summ = 0; i < n; i++)
    {
        if (arr[i] > 0) summ += arr[i];
    }
    return summ;
}
template <typename T>
T proizv(T *arr, int n)
{
    int i, maxelem, minelem;
    maxelem = minelem = 0;
    for (maxelem = minelem = i = 0; i < n; i++)
    {
        if (fabs(arr[i]) > fabs(arr[maxelem])) maxelem = i;
        if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i;
    }
    T temp;
    if (abs(maxelem - minelem) > 1)
    {
        int stelem = (maxelem < minelem ? maxelem : minelem);
        int endelem = (maxelem < minelem ? minelem : maxelem);
        for (i = stelem + 1, temp = 1; i < endelem; i++)
            temp *= arr[i];
    }
    else
        temp = -100;
    return temp;
}
template <typename T>
void sort(T *arr, int n)
{
    T temp;
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j <= n - 1; j++)
            if (arr[i] < arr[j]) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
}
template <typename T>
void print(T *arr, int n)
{
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    delete[] arr;
}
Answer 1

Итак, ваш шаблон:

template <typename T>
int func(T n)
{
    T *arr1 = new T[n];

Подставим для double:

int func(double n)
{
    double *arr1 = new double[n];

И как вы себе представляете массив из, скажем, 2.5 элементов? n же у вас - double!

В create та же некорректность - вы используете n с плавающей точкой...

P.S. А вообще, очень странно смотрится чисто C-шный подход с применением шаблонов :)

READ ALSO
Синхронизация mutex [требует правки]

Синхронизация mutex [требует правки]

Нужно сделать синхронизацию с помощью мьютексов, но почему то пишет "индентификатор CloseHundle" не определен

211
Инспекция кода: генетический поиск

Инспекция кода: генетический поиск

Здравствуйте! Сейчас пытаюсь искать алгоритмы Маркова с помощью генетических алгоритмовЕсть такой вот код:

259
Глобальная переменная своего типа - c++

Глобальная переменная своего типа - c++

Завожу глобальную переменную собственноручно написанного класса в файле maincpp следующим образом:

243
Работа с частью вектора как с вектором

Работа с частью вектора как с вектором

Есть стандартный вектор, допустим типа std::vector<int>Есть функция void plusOne(std::vector<int>::iterator it1, std::vector<int>::iterator it2), прибавляющая всем элементам...

306