Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: C++ - неадекватная реализация append  (Прочитано 1369 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
C++ - неадекватная реализация append
« : 25 Августа 2013, 17:18:16 »
Изучаю шаблоны, решил сделать аналог питоновского append:
Код: (C++) [Выделить]
#include <iostream>
template <class X> inline void copyArray (X *dest, X *input, int len, int startPoint=0) {
for(register int i=0; i<len; i++) dest[i+startPoint]=input[i];
}

template <class X> void append(X *dest, X *input, int lenOfDest, int lenOfInput=1) {
X *temp=new X [lenOfDest];
copyArray(temp, dest, lenOfDest);
delete [] dest;
dest = new X [lenOfDest+lenOfInput+1];
copyArray(dest, temp, lenOfDest);
delete [] temp;
copyArray(dest, input, lenOfInput, lenOfDest);
}

int main() {
int *a=new int [5];
for (int i=0; i<5; i++) a[i]=i+3;
int *b=new int [3];
for (int i=0; i<3; i++) b[i]=i+8;
append(a,b,5,3);
cout << a[5] << endl;
return 0;
}
только в результате вот такие значения:
3,4,5,6,7,0,33,0,8,9,10
при этом, в функции append() все значения адекватные (если проверить). с чем это может быть связано?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3271
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #1 : 25 Августа 2013, 18:54:33 »
Я не могу сказать, почему так получается, но вообще это не так просто.
В Qt, например, сначала надо создать свой класс на основе template
и тогда можно будет его использовать, для этого там есть конструкция
QVector<type>var;
в C++, на котором основна Qt, то же самое:
http://www.tenouk.com/cpluscodesnippet/cplusnestedclasstemplate.html
Возможно, ваша append просто не понимает, что X - это int.

Пётр.
« Последнее редактирование: 25 Августа 2013, 18:56:17 от Peter_I »
Пётр.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #2 : 26 Августа 2013, 00:34:49 »
Peter_I,
QVector<type>var;думаю вектор использовать, но раз уж взялся - надо хотя-бы понять причину проблемы
можно подробнее про непонимание того, что X - int?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #3 : 26 Августа 2013, 01:36:22 »
Kernel ops, у меня ваш код вообще не компилится.
Вы с std разберитесь для начала.

Пользователь решил продолжить мысль 26 Августа 2013, 01:41:46:
И что вы хотите вывести, в (тут я ваши ошибки исправил)?
Код: (cpp) [Выделить]
std::cout << a[5] << std::endl;Просто вы выводите то число, которого не существует, максимальное a, которое вы объявили - a[4].
Про питоновский append я не знаю, просветите, пожалуйста что это и с чем его едят.

Пользователь решил продолжить мысль 26 Августа 2013, 01:43:23:
Kernel ops, так Вы эти значения за раз получаете или разные, если разныые то дело в том, что a5 не создан,, а вы всякий мусор выводите.
« Последнее редактирование: 26 Августа 2013, 01:43:23 от peregrine »

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #4 : 26 Августа 2013, 01:45:07 »
peregrine,
забыл добавить namespace:
Код: (C) [Выделить]
#include <iostream>

using namespace std;

template <class X> inline void copyArray (X *dest, X *input, int len, int startPoint=0) {
for(register int i=0; i<len; i++) dest[i+startPoint]=input[i];
}
     
template <class X> void append(X *dest, X *input, int lenOfDest, int lenOfInput=1) {
X *temp=new X [lenOfDest];
copyArray(temp, dest, lenOfDest);
delete [] dest;
dest = new X [lenOfDest+lenOfInput+1];
copyArray(dest, temp, lenOfDest);
delete [] temp;
copyArray(dest, input, lenOfInput, lenOfDest);
}
     
int main() {
int *a=new int [5];
for (int i=0; i<5; i++) a[i]=i+3;
int *b=new int [3];
for (int i=0; i<3; i++) b[i]=i+8;
append(a,b,5,3);
cout << a[5] << endl;
return 0;
}
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #5 : 26 Августа 2013, 02:17:43 »
Kernel ops, и что это меняет? Вы выводите пятый элемент массива a, он не создан, не забывайте, что первый не a[1], а a[0]

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #6 : 26 Августа 2013, 03:09:06 »
В этом массиве есть и a[6]))
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #7 : 26 Августа 2013, 03:12:36 »
peregrine,
поправил код для наглядности:
Код: (C) [Выделить]
#include <iostream>
 
using namespace std;
 
template <class X> inline void copyArray (X *dest, X *input, int len, int startPoint=0) {
        for(register int i=0; i<len; i++) dest[i+startPoint]=input[i];
}
     
template <class X> void append(X *dest, X *input, int lenOfDest, int lenOfInput=1) {
        X *temp=new X [lenOfDest];
        copyArray(temp, dest, lenOfDest);
        delete [] dest;
        dest = new X [lenOfDest+lenOfInput+1];
        copyArray(dest, temp, lenOfDest);
        delete [] temp;
        copyArray(dest, input, lenOfInput, lenOfDest);
        cout << "dest:" << endl;
        for(register int i=0; i<10; i++) cout << dest[i] << endl;
}
     
int main() {
        int *a=new int [5];
        for (int i=0; i<5; i++) a[i]=i+3;
        int *b=new int [3];
        for (int i=0; i<3; i++) b[i]=i+8;
        append(a,b,5,3);
        cout << "a:" << endl;
        for(register int i=0; i<10; i++) cout << a[i] << endl;
        return 0;
}
вывод:
dest:
3
4
5
6
7
8
9
10
0
0
a:
0
0
5
6
7
0
33
0
8
9
хотя dest и a - указатели на один и тот-же массив
JmAbuDabi,
там много чего есть, только не в том виде

Пользователь решил продолжить мысль 26 Августа 2013, 03:18:12:
закралось подозрение, что дело в разрушении dest, проверил:
Код: (C) [Выделить]
#include <iostream>
 
using namespace std;
 
template <class X> inline void copyArray (X *dest, X *input, int len, int startPoint=0) {
        for(register int i=0; i<len; i++) dest[i+startPoint]=input[i];
}
     
template <class X> X *append(X *dest, X *input, int lenOfDest, int lenOfInput=1) {
        X *temp=new X [lenOfDest];
        copyArray(temp, dest, lenOfDest);
        delete [] dest;
        dest = new X [lenOfDest+lenOfInput+1];
        copyArray(dest, temp, lenOfDest);
        delete [] temp;
        copyArray(dest, input, lenOfInput, lenOfDest);
        return dest;
}
     
int main() {
        int *a=new int [5];
        for (int i=0; i<5; i++) a[i]=i+3;
        int *b=new int [3];
        for (int i=0; i<3; i++) b[i]=i+8;
        a=append(a,b,5,3);
        for(register int i=0; i<9; i++) cout << a[i] << endl;
        return 0;
}
вывод:
3
4
5
6
7
8
9
10
0
непонятно, почему такое происходит
« Последнее редактирование: 26 Августа 2013, 03:18:12 от Kernel ops »
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #8 : 26 Августа 2013, 03:19:48 »
Код: (C) [Выделить]
#include <iostream>
 
using namespace std;
 
template <class X> inline void copyArray (X *&dest, X *&input, int len, int startPoint=0) {
        for(register int i=0; i<len; i++) dest[i+startPoint]=input[i];
}
     
template <class X> void append(X *&dest, X *&input, int lenOfDest, int lenOfInput=1) {
        X *temp=new X [lenOfDest];

        copyArray(temp, dest, lenOfDest);
//for (int i = 0; i < lenOfDest; i++) cout<<"temp:\t"<<temp[i]<<"\t";
        delete [] dest;
        dest = new X [lenOfDest+lenOfInput];
        copyArray(dest, temp, lenOfDest);
//for (int i = 0; i < lenOfDest + lenOfInput; i++) cout<<"dest:\t"<<dest[i]<<"\t";
        delete [] temp;
        copyArray(dest, input, lenOfInput, lenOfDest);
//for (int i = 0; i < lenOfDest + lenOfInput; i++) cout<<"dest2:\t"<<*(dest+ i)<<"\t";
}
     
int main() {
int c_A = 5;
int c_B = 3;
int c_C = 3;
        int *a=new int [c_A];
        for (int i=0; i<c_A; i++)
{
a[i]=i+c_C;;
// cout<<a[i]<<endl;
}
        int *b=new int [c_B];
        for (int i=0; i<c_B; i++)
{
b[i]=i+c_C + c_A;
//cout<<"b:\t\t"<<b[i]<<endl;
}
        append(a,b,c_A,c_B);
for (int i = 0; i < 5+3; i++) cout<<a[i]<<"\t\t";
        return 0;
}

По занчению передавать плохо, надо по ссылке. Код такой, только параметризацию добавил, и отладку.

Амперсанты в инлайновой функции лишние.
« Последнее редактирование: 26 Августа 2013, 03:23:01 от JmAbuDabi »
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: C++ - неадекватная реализация append
« Ответ #9 : 26 Августа 2013, 03:31:48 »
JmAbuDabi,
тьфу, точно. я уже костыль собирался лепить (a=append(a...)), спасибо
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.