Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> resize for NEW, глюк с массивом 
V
    Опции темы
Syberex
Дата 11.12.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Код

char  *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich)
  {
    char *Second=new char[*NewKolich];
    memcpy(Second,pointer,*OldKolich);
    delete [] pointer;
    return  Second;
  }



предположительно должна работать так

Код

unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
char *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich);
char * Second=ResizeNew(First,x, y);  ///  
cout<<Second[80]<<endl;



не может преобразовать в функции unsigned long в unsigned long

и вторая трабла хотелось бы в место Second  увидеть First, т.е.


Код

unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
char *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich);
char * First=ResizeNew(First,x, y);  ///  
cout<<First[80]<<endl;



т.е получится как бы resize for NEW, если не трудно чиркните чё там поменять надо??
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Что-то ахинея какая-то написана.
Код
unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
char *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich);
char * Second=ResizeNew(First,x, y);  ///  
cout<<Second[80]<<endl;

В строке 5 это что? Вызов функции?



--------------------
忍者

user posted image
PM MAIL   Вверх
Syberex
Дата 11.12.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



нет, в строке 5  прототип функции.
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Не ненадо объявлять функции внутри других функций. Покажи код целеком. И текст ошибки полностью.


--------------------
忍者

user posted image
PM MAIL   Вверх
maxim1000
Дата 11.12.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



такой вот вопрос: а зачем передавать в функцию _указатели_ на переменные, хранящие старую и новую длину?


--------------------
qqq
PM WWW   Вверх
Syberex
Дата 11.12.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



[C++ Error] Intellect.cpp(27): E2034 Cannot convert 'unsigned long' to 'unsigned long *'
[C++ Error] Intellect.cpp(27): E2342 Type mismatch in parameter 'OldKolich' (wanted 'unsigned long *', got 'unsigned long')
[C++ Error] Intellect.cpp(27): E2034 Cannot convert 'unsigned long' to 'unsigned long *'
[C++ Error] Intellect.cpp(27): E2342 Type mismatch in parameter 'NewKolich' (wanted 'unsigned long *', got 'unsigned long')
[C++ Warning] Intellect.cpp(33): W8004 'y' is assigned a value that is never used

Добавлено @ 17:15 
Код

 int main(int argc, char* argv[])
{
unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
char *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich);
char * Second=ResizeNew(First,x, y);  ///
cout<<Second[80]<<endl;


 getch();
   return 0;
};




--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Если с указателями тогда уж вот так:
Код
char * Second=ResizeNew(First, &x, &y);


Добавлено @ 17:16 
Код
char *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich);

И вынеси объявление из main!


--------------------
忍者

user posted image
PM MAIL   Вверх
Syberex
Дата 11.12.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(maxim1000 @ 11.12.2006,  17:11)
такой вот вопрос: а зачем передавать в функцию _указатели_ на переменные, хранящие старую и новую длину?

как зачем, а как я одним махом тогда скопирую содержимое первого массива если я не знаю его размера, поєтому и передаю его memcpy
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Код
char  *ResizeNew(char * pointer,unsigned long OldKolich,unsigned long NewKolich)
  {
    char *Second=new char[NewKolich];
    memcpy(Second,pointer,OldKolich);
    delete [] pointer;
    return  Second;
  }

Вот что имелось ввиду. Так правильней.
И тогда такой вызов будет работать:
Код
char * Second=ResizeNew(First,x, y);



--------------------
忍者

user posted image
PM MAIL   Вверх
Syberex
Дата 11.12.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



 а как тогда вместо Second  увидеть First

Код

unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
char * First=ResizeNew(First,&x, &y); 
cout<<First[80]<<endl;


как тут приодолеть двойное объявление?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Код
unsigned long x=100;
unsigned long y=2000;
char *First=new char[x];
First[80]='P';
First=ResizeNew(First,&x, &y); 
cout<<First[80]<<endl;


Это сообщение отредактировал(а) Dray - 11.12.2006, 17:32


--------------------
忍者

user posted image
PM MAIL   Вверх
Syberex
Дата 11.12.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



т.е я так понимаю, если удалить указатель на память, то сдесь просто освобождается память, а  указатель продолжает существовать только голый, и мы ему и присваиваем новое значение указателя на массив, да?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Dray
Дата 11.12.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Ну, что-то вроде.


--------------------
忍者

user posted image
PM MAIL   Вверх
Syberex
Дата 12.12.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



// изменение размерности массива
  
Код

char  *ResizeNew(char * pointer,unsigned long* OldKolich,unsigned long* NewKolich)
  {
    char *Second=new char[*NewKolich];
    if(*NewKolich>=*OldKolich)
        {
                memcpy(Second,pointer,*OldKolich);
                //cout<<"UP memory"<<endl;
        } else
                {
                memcpy(Second,pointer,*NewKolich);
                //cout<<"DOWN memory"<<endl;
                };
    delete [] pointer;
    return  Second;
  }

--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
UnrealMan
Дата 12.12.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Syberex @  12.12.2006,  11:51 Найти цитируемый пост)
// изменение размерности массива

И зачем тогда вообще new? :lol:
Использовал бы уж malloc/realloc/free :-)

А коли хочешь нормального «изменения размерности» на C++, используй std::vector. Лучше std::vector может быть разве что усовершенствованный контейнер, где для сложных объектов, захватывающих ресурсы, вместо копирований будут происходить перемещения объектов (но для этого придётся специально затачивать классы, объекты которых будут использоваться в векторе, либо пользоваться вспомогательным контейнером – см. ниже).

Код
template <class T>
    struct Single
{
    Single() : p(new T) {}

    // технику реализации такого шаблона я демонстрировал в теме про новый C++
    // (автор темы - участник под ником Любитель)... в общем, кому надо, тот найдёт :-)
    template <class T1, class T2, ...>
        Single(T1 &t1, T2 &t1, ...) : p(new T(t1, t2, ...)) {}
    Single(const Single &a) : p(new T(*a.p)) {} // copy-constructor
    Single(Single *p) : p(p->p) { p->p = 0; }   // move-constructor

    // при помощи SFINAE в векторе можно распознать наличие такого метода
    // (способ продемонстрирован в той же теме) и задействовать его вместо копирующего
    // конструктора
    void move_to(Single *p) { new (p) Single(this) }

    ~Single() { delete p; }

    const T &operator *() const  { return *p; }
    const T *operator ->() const { return p; }
    T &operator *()  { return *p; }
    T *operator ->() { return p; }

private:
    T *p;
};

Вот небольшие вырезки кода из драфта моего класса Vector:

Код
template <class T, class Allocator>
    void Vector<T, Allocator>::Reserve(size_t newCapacity, size_t newOffset)
{
    T *p_ = allocator.allocate(newCapacity);
    p_ += newOffset;

    try
    {
        MoveObjects(p_, p, nSize);
        DestroyObjects(p, nSize);
    }
    catch (...)
    {
        allocator.deallocate(p_-newOffset, newCapacity);
        throw;
    }

    if (nCapacity)
        allocator.deallocate(p-nOffset, nCapacity);
    p = p_;
    nOffset = newOffset;
    nCapacity = newCapacity;
}

.......................................................................

template <class T, class Allocator>
    void Vector<T, Allocator>::MoveObjects(T *dst, T *src, size_t n)
{
    T *it = dst;
    T *end = dst+n;
    if (dst < src)
        try
        {
            for (; it!=end; ++it, ++src)
                Move(it, src,
                    CHOOSE_TYPE(int *, int, CHECK_METHOD(T, move_to, void (T *)))());
        }
        catch (...)
        {
            while (it!=dst)
                (--it)->~T();
            throw;
        }
    else

.......................................................................

static void Move(T *const &dst, T *const &src, const int *) { src->move_to(dst); }
static void Move(T *const &dst, T *const &src, const int &) { new (dst) T(*src); }
static void DestroyObjects(T *p, size_type n) { while (n>0) p[--n].~T(); }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.