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

Шаблонная функция с явной специализацией не возвращает динамический массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 14:09     Шаблонная функция с явной специализацией не возвращает динамический массив #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
71
72
73
74
75
76
77
template <typename T> 
T *DynMass(T *mas, int n)
{
   T *dynamic = new T [n + 2]; //динамический масив
   
   for (int i = 0; i < n; i++)
   {
      dynamic[i] = mas[i]; 
   }
   dynamic[n] = maximum(mas, n); 
   dynamic[n + 1] = sum(mas, n); 
 
 
   delete [] mas;
 
   return dynamic;
}
 
template <> 
char **DynMass<char*>(char **mas, int n)
{
   char **dynamic = new char *[n]; //динамический масив
  
    for(int i = 0; i < n; i++)
    {
        dynamic[i] = mas[i];
    }
    
   delete [] *mas;
 
   return dynamic;
}
 
int main()
{
           const int k = 100; //максимальный размер динамического символьного массива
    char *ch = new char [k]; //создаем динамический массив
 
    const int nW = 15;//размер массива для фамилий 
    char **words = new char *[nW];
    
    cout << "\n\nОдномерный символьный массив(заполненный с файла CharMass.txt)" << endl << endl;
 
    ifstream inarray("CharMass.txt"); // открытие файла для ввода;
    if (!inarray) //если файла не существует
    {
        cout << "File can not be opened" << endl; //выводим сообщение
        return 0;   //выход из программы
    }
    inarray.getline(ch, k, EOF);//считываем с файла в массив, k-размер массива
    inarray.close(); //закрываем файл CharMass.txt
 
    int i = 0;
    words[i] = strtok(ch, " "); //
    while (words[i] != NULL)
    {
        i++;                                
        words[i] = strtok( NULL, " ");
    }
 
    InitMas<nW>(words); //выводим массив фамилий на екран
    
    
    words = DynMass(words, nW); //тут передаю массив в функцию
 
    /*cout << "\n\nМаксимальный элемент массива с явной специализацией для строк (тип char*);" << endl;
    cout << endl << maximum(words, nW);//вызываем функции
 
    cout << "\n\nCумма элементов массива с явной специализацией для строк (тип char*);" << endl;
    cout << endl << sum(words, nW);//вызываем функции*/
 
    
    //InitMas<nW>(words);
    cout << "\n---------------------------------------------------------------- ";
    cin.get();
    return 0;
}
Передаю массив в функцию

C++
1
words = DynMass(words, nW); //тут передаю массив в функцию
Ну дело в том что массив words почему то пустой, потому что dynamic не возвращается!!





Если сделать вывод не посредственно в функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <> 
char **DynMass<char*>(char **mas, int n)
{
   char **dynamic = new char *[n]; //динамический масив
  
    for(int i = 0; i < n; i++)
    {
        dynamic[i] = mas[i];
        cout << dynamic[i] << " "; //вывод
    }
    
   delete [] *mas;
 
   return dynamic;
}
то массив dynamic выводиться в норме!

но за функцией его не видно!

Может я не правильно возвращаю его??

C++
1
return dynamic;
Спасибо!

Добавлено через 32 минуты
ну или подскажите как можно передать динамический массив char* в функцию которая создает вновь динамический и удаляем передаваемый!


Такой вариант как у меня работает с int и float!

вот этот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T> 
T *DynMass(T *mas, int n)
{
   T *dynamic = new T [n + 2]; //динамический масив
   
   for (int i = 0; i < n; i++)
   {
      dynamic[i] = mas[i]; 
   }
   dynamic[n] = maximum(mas, n); 
   dynamic[n + 1] = sum(mas, n); 
 
 
   delete [] mas;
 
   return dynamic;
}
с char обстоят дела похуже!

жду подсказок!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2011, 14:09     Шаблонная функция с явной специализацией не возвращает динамический массив
Посмотрите здесь:

Функция возвращает массив C++
Функция которая возвращает динамический массив C++
Вычисления максимального элемента массива с явной специализацией для строк C++
Вычисления суммы элементов массива с явной специализацией (тип char*) C++
Шаблонная функция возвращающая созданный динамический массив C++
C++ Функция, которая возвращает массив
Функция возвращает двумерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
03.12.2011, 15:30     Шаблонная функция с явной специализацией не возвращает динамический массив #2
Infinity3000,
Ваша специализация функции возвращает тот указатель, который вы в ней создаете. Так что вопрос ваш не понятен. Или скорей всего вы просто грамотно не можете сформулировать вопрос.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 15:41  [ТС]     Шаблонная функция с явной специализацией не возвращает динамический массив #3
Цитата Сообщение от Сыроежка Посмотреть сообщение
Или скорей всего вы просто грамотно не можете сформулировать вопрос.
Все может быть!

Есть у меня динамический массив слов(Фамилий), состоящий из 15 элементов

C++
1
2
const int nW = 15;//размер массива для фамилий 
       char **words = new char *[nW];

Мне нужно передать этот массив в функцию, которая возвращает как результат вновь созданный динамический массив и удаляющая передаваемый динамический массив!

C++
1
words = DynMass(words, nW);
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 15:47     Шаблонная функция с явной специализацией не возвращает динамический массив #4
Массив не пустой. Просто это массив массивов. Тебе нужно дополнительно копировать каждый элемент массива.

Добавлено через 1 минуту
А может, и нет. В общем, я тоже не понял, что ты пытаешься сделать.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 16:02  [ТС]     Шаблонная функция с явной специализацией не возвращает динамический массив #5
Цитата Сообщение от volovzi Посмотреть сообщение
Массив не пустой. Просто это массив массивов. Тебе нужно дополнительно копировать каждый элемент массива.
На примере можно показать?

Добавлено через 10 минут
Цитата Сообщение от volovzi Посмотреть сообщение
А может, и нет. В общем, я тоже не понял, что ты пытаешься сделать.
Я не понимаю что тут может быть не понятного!))

Мне нужно передать этот массив в функцию, которая возвращает как результат вновь созданный динамический массив который состоит из элементов передаваемого массива и удаляющая передаваемый динамический массив!

Добавлено через 2 минуты
Тут все правильно!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <> 
char **DynMass<char*>(char **mas, int n)
{
   char **dynamic = new char *[n]; //динамический масив
  
        for(int i = 0; i < n; i++)
        {
                dynamic[i] = mas[i];
                cout << dynamic[i] << " "; //вывод
        }
        
   delete [] *mas;
 
   return dynamic;
}
Массив передается функцию, элементы из передаваемого массива в новь созданный массив тоже передаются! передаваемый массив я удаляю!!

Но почему то массив возвращается пустым!)

C++
1
return dynamic;
Добавлено через 1 минуту
то есть когда мы делаем

C++
1
words = DynMass(words, nW);
то массив words должен содержать элементы массива dynamic из функции, но он пустой!

Добавлено через 39 секунд
Получаеться я передаю нормальный массив, а на выходе получаю пустой!))
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 16:12     Шаблонная функция с явной специализацией не возвращает динамический массив #6
Так, а почему ты думаешь, что он пустой?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 16:27  [ТС]     Шаблонная функция с явной специализацией не возвращает динамический массив #7
Потому что дальше я хочу вывести его на экран, а соответственно ничего не выводится! Также нахождения суммы(слияние всех фамилий в массиве)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T> 
T sum(T* mas, int n)
{
    T sum = mas[0];
    for (int i = 1; i < n; ++i )
    {
         sum += mas[i];
    }
    return sum;
}
 
template <>
char* sum<char*>(char **mas, int n)
{
    char *sum = mas[0];
    for (int i = 1; i < n; ++i )
    {
          strcat(sum, mas[i]);
    }
    return sum;
}

максимальный элемент(самая длинная фамилия!) !

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
template <typename T> 
T maximum(T* mas, int n)
{
    T max = mas[0];
    for (int i = 1; i < n; ++i )
    {
        if ( mas[i] > max )
            max = mas[i];
    }
    return max;
}
 
template<>
 char* maximum<char*>(char **mas, int n)
{
    char *max = mas[0];
    int max_len = strlen(mas[0]);
    for ( int i = 1; i < n; ++i )
    {
        int len = strlen(mas[i]);
        if ( len > max_len )
        {
            max = mas[i];
            max_len = len;
        }
    }
    return max;
}
Если с массивом сразу это делать то все нормально ищет!!

Но если я передаю его в функцию, которая должна возвратить вновь созданный массив с элементами передаваемого

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
template <typename T> 
T *DynMass(T *mas, int n)
{
   T *dynamic = new T [n + 2]; //динамический масив
   
   for (int i = 0; i < n; i++)
   {
      dynamic[i] = mas[i]; 
   }
   dynamic[n] = maximum(mas, n); 
   dynamic[n + 1] = sum(mas, n); 
 
 
   delete [] mas;
 
   return dynamic;
}
 
template <> 
char **DynMass<char*>(char **mas, int n)
{
   char **dynamic = new char *[n]; //динамический масив
  
        for(int i = 0; i < n; i++)
        {
                dynamic[i] = mas[i];
        }
        
   delete [] *mas;
 
   return dynamic;
}

то уже ни сумма , ни максимум, ни вывод на экран не происходит!

Добавлено через 1 минуту
Функция вывод на экран

C++
1
2
3
4
5
6
7
8
template<int n, typename T>
void InitMas(T *mas)      //передача массива
{  
    for(int i = 0; i < n; ++i)
    {
        cout << mas[i] << " "; 
    }
}
вызов

C++
1
InitMas<nW>(words);
Не понятно вообще!!
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 16:33     Шаблонная функция с явной специализацией не возвращает динамический массив #8
А я у себя проверил — возвращается непустой. Да и в самой функции, вроде, всё в порядке: создаётся новый массив указателей, указатели на слова копируются из старого массива в новый, после чего старый удаляется, а новый — возвращается.
Если закрыть глаза на то, что функция совершенно бесполезна, то всё должно быть нормально.
Возможно, дело не в этой функции, а в том месте, где ты считываешь массив.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 16:37  [ТС]     Шаблонная функция с явной специализацией не возвращает динамический массив #9
Цитата Сообщение от volovzi Посмотреть сообщение
Если закрыть глаза на то, что функция совершенно бесполезна, то всё должно быть нормально.
Это функция будет возвращать массив на 2 элемента больше чем передаваемый, то есть в конец будет добавлена сумма и максимальный элемент!))


Цитата Сообщение от volovzi Посмотреть сообщение
Возможно, дело не в этой функции, а в том месте, где ты считываешь массив.
та вроде бы все правильно делаю!

Скиньте свой вариант, рабочий! Хотя подозреваю что он такой же!)
Bers
Заблокирован
03.12.2011, 16:46     Шаблонная функция с явной специализацией не возвращает динамический массив #10
автор!

У тебя в коде присутствуют два момента:

1. Порча памяти (не правильно выделяешь исходную память под свои массивы массивов)
2. Утечка памяти (не правильно освобождаешь память взятую под массивы массивов)

Диагноз: попытка работать с сложно-понимаемыми абстракциями "указатель на указатель" привели мысли в кашу, и породили ошибки.

Лечение: избавиться от указателей на указатели, и работать с более простыми сущностями.

Здесь, я локализировал проблему:
Причем, я не пытался ничего особо исправлять, или как то чистить код.
Все что я сделал - заставил код работать, несмотря ущербность конструкции.
Поэтому в данном коде по прежнему присутствуют утечки памяти

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
template <typename T> 
T *DynMass(T *mas, int n)
{
    T *dynamic = new T [n + 2]; //динамический масив
 
    for (int i = 0; i < n; i++)
    {
        dynamic[i] = mas[i]; 
    }
    dynamic[n] = maximum(mas, n); 
    dynamic[n + 1] = sum(mas, n); 
 
 
    delete [] mas;
 
    return dynamic;
}
 
 
template <> 
char **DynMass<char*>(char **mas, int n)
{
    char **dynamic = new char *[n]; //динамический масив
 
    cout<< "\n-----Dyn-------\n";
    for(int i = 0; i < n; i++)
    {
        dynamic[i] = mas[i];
        
        cout << dynamic[i] << " "; //вывод
    }
 
    //delete [] *mas;
 
    return dynamic;
}
 
void main()
{
    const int nW = 5;//размер массива для фамилий 
    char **words = new char *[nW];
 
    int i=0;
    for( int i=0;i<nW;++i)
    {
        words[i] = new char[nW];
        strcpy(words[i], "1234");
    }
 
    words = DynMass(words, nW); //тут передаю массив в функцию
 
    cout<< "\n-----Word-------\n";
    for( int i=0;i<nW;++i)
    {
        
        cout <<words[i] << " "; //вывод
    }
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2011, 17:12     Шаблонная функция с явной специализацией не возвращает динамический массив
Еще ссылки по теме:

C++ Шаблонная функция принимает 2 аргумента разных типов и возвращает больший из них
C++ Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432)
Функция, что возвращает динамический массив C++
Функция, которая возвращает массив C++
C++ В чем разница между явной специализацией и инстанциацией?

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

Или воспользуйтесь поиском по форуму:
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 17:12  [ТС]     Шаблонная функция с явной специализацией не возвращает динамический массив #11
Спасибо, всем!
Yandex
Объявления
03.12.2011, 17:12     Шаблонная функция с явной специализацией не возвращает динамический массив
Ответ Создать тему
Опции темы

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