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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
#1

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

03.12.2011, 14:09. Просмотров 1338. Ответов 10
Метки нет (Все метки)

Здравствуйте!

Возникла проблема!

Есть шаблонная функция с явной специализацией для строк (тип 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 обстоят дела похуже!

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

Шаблонная функция возвращающая созданный динамический массив - C++
Здравствуйте! Нужна Ваша помощь! Нужна шаблонная функция которая возвращает созданный динамический массив, который на 2...

В чем разница между явной специализацией и инстанциацией? - C++
В чем разница между явной специализацией и инстанциацией? Желательно, подробно.

Вычисления максимального элемента массива с явной специализацией для строк - C++
Здравствуйте! Всех студентов с праздником! Возможно тема заезженная! Возникла такая проблемка, нужно вычислить максимальный...

Вычисления суммы элементов массива с явной специализацией (тип char*) - C++
Здравствуйте! Помогите найти сумму элементов массива с явной специализацией (тип char*)! Это должна быть шаблонная функция! ...

Функция, что возвращает динамический массив - C++
Функция возвращает динамический массив int *A1 (BYTE val) { int *mass = new int; //инициализация массива return mass; }...

Функция которая возвращает динамический массив - C++
Здравствуйте! у меня такой глупый вопрос. Я все время путаюсь и никак не могу четко сформулировать на него ответ. Помогите мне раз и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
03.12.2011, 15:30 #2
Infinity3000,
Ваша специализация функции возвращает тот указатель, который вы в ней создаете. Так что вопрос ваш не понятен. Или скорей всего вы просто грамотно не можете сформулировать вопрос.
1
Infinity3000
1058 / 577 / 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);
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 15:47 #4
Массив не пустой. Просто это массив массивов. Тебе нужно дополнительно копировать каждый элемент массива.

Добавлено через 1 минуту
А может, и нет. В общем, я тоже не понял, что ты пытаешься сделать.
1
Infinity3000
1058 / 577 / 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 секунд
Получаеться я передаю нормальный массив, а на выходе получаю пустой!))
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 16:12 #6
Так, а почему ты думаешь, что он пустой?
1
Infinity3000
1058 / 577 / 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);
Не понятно вообще!!
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
03.12.2011, 16:33 #8
А я у себя проверил — возвращается непустой. Да и в самой функции, вроде, всё в порядке: создаётся новый массив указателей, указатели на слова копируются из старого массива в новый, после чего старый удаляется, а новый — возвращается.
Если закрыть глаза на то, что функция совершенно бесполезна, то всё должно быть нормально.
Возможно, дело не в этой функции, а в том месте, где ты считываешь массив.
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 16:37  [ТС] #9
Цитата Сообщение от volovzi Посмотреть сообщение
Если закрыть глаза на то, что функция совершенно бесполезна, то всё должно быть нормально.
Это функция будет возвращать массив на 2 элемента больше чем передаваемый, то есть в конец будет добавлена сумма и максимальный элемент!))


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

Скиньте свой вариант, рабочий! Хотя подозреваю что он такой же!)
0
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] << " "; //вывод
    }
 
}
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
03.12.2011, 17:12  [ТС] #11
Спасибо, всем!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2011, 17:12
Привет! Вот еще темы с ответами:

Шаблонная функция принимает 2 аргумента разных типов и возвращает больший из них - C++
Не могу сообразить как ее правильно написать. Функция может возвратить или T1 или T2 template &lt;typename T1, typename T2&gt; ?...

Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432) - C++
Вот мое решение, подскажите, пожалуйста, что изменить, чтобы заработала программа: # include &lt;iostream&gt; # include &lt;stdlib.h&gt; #...

Функция возвращает массив - C++
Как сделать чтобы функция возвращала массив(не исползуя указатели):(. К присмеру: ... char v; // //заполнение массива // ...

Функция, которая возвращает массив - C++
Здравствуйте. Подскажите, пожалуйста, как правильно написать код - есть функция; она должна вернуть массив, который создается в этой же...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.12.2011, 17:12
Ответ Создать тему
Опции темы

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