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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с динамической памятью, нужна помощь 
V
    Опции темы
Hyps
Дата 17.2.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смысл проблемы такой:
есть класс
Код

class vector{
  public:
  int *x;
  void init(int m);
  
  ...
  
  ~vector();

};

void vector::init(int m){
  x=new int[m];
}

vector::~vector(){
  delete [] x;
}


есть некоторая функция, например:
Код

vector f(){
  vector x;
  x.init(10);
  return x;
}


ну или в программе есть такой момент

Код
 
  int n=500000;
  vector a,b;
  a.init (n); 
  b.init (n); 
  ...
  for (int i=0;i<n;i++)  a.x[i]=b.x[i]; 
  ...


вобщем программа постоянно ошибку доступа к памяти если размер массива x достаточно большой
а по сути он должен быть большой в той задаче где используется

но если убрать delete из деструктора все работает, но возникает маленькая проблема, за один прогон программы засира**ся 20 мб памяти, и её нужно как то очищать, можно написать отдельную фукцию в которой удалять массивы, но в примере №1 такой способ не катит...

в общем для меня это единственный камень приткновения в моей работе...

P.S. нашел в одной книге алгоритм "сбора мусора", но он замедляет программу раз в десять, а при работе с нейронными сетями и генетическим алгоритмами, которые и так долго работаю, это не приемлимо...
из моих попыток как то это исправить стало понятно что деструктор просто срабатывает раньше чем нужно, почему? не понятно




PM MAIL   Вверх
Mayk
Дата 17.2.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Почему бы не использовать приятный во всех отношениях std::vector?

Цитата(Hyps @ 18.2.2006, 01:27 Найти цитируемый пост)
но если убрать delete из деструктора все работает

Наводит на мысль - переопределены ли конструктор копирования и оператор присваивания?





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 17.2.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



либо используй std::vector либо используй конструктор копий, но если у тебя выделяется большой кусок памяти, то возможно использовать стратегию подсчета ссылок
Код

class vector
{
private:
    int* x;
    int* counter;
    void destroy()
    {
        if (!--*counter)
        {
            delete counter;
            delete []x;
        }
    }
public:
    vector(): counter(new int(1)), x(0) {}
    vector(const vector& object)
        : x(object.x), counter(object.counter) {++*counter;}
    vector& operator=(const vector& object)
    {
        destroy();
        x=object.x;
        counter=object.counter;
        ++*counter;
        return *this;
    }
    ~vector() {destroy();}
    void init(int);
    ...
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Hyps
Дата 19.2.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mayk @ 17.2.2006, 21:37)
Почему бы не использовать приятный во всех отношениях std::vector?

Цитата(Hyps @  18.2.2006,  01:27 Найти цитируемый пост)
но если убрать delete из деструктора все работает

Наводит на мысль - переопределены ли конструктор копирования и оператор присваивания?

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

ладно...

конструктор копирования переопределен, а так же переопределены все возможные операторы.
Добавлено @ 14:25
Цитата(MAKCim @ 17.2.2006, 22:06)
либо используй std::vector либо используй конструктор копий, но если у тебя выделяется большой кусок памяти, то возможно использовать стратегию подсчета ссылок
Код

class vector
{
private:
    int* x;
    int* counter;
    void destroy()
    {
        if (!--*counter)
        {
            delete counter;
            delete []x;
        }
    }
public:
    vector(): counter(new int(1)), x(0) {}
    vector(const vector& object)
        : x(object.x), counter(object.counter) {++*counter;}
    vector& operator=(const vector& object)
    {
        destroy();
        x=object.x;
        counter=object.counter;
        ++*counter;
        return *this;
    }
    ~vector() {destroy();}
    void init(int);
    ...
}

я уже говорил что использовал алгоритм "сбора мусора", я его списал из книжки, там как раз используется стратегия подсчета ссылок, но она реально замедляет работу программы... но там алгоритм какой то замутненный...
напиши пожалуйста коментарии к твоему коду, а то я не все понимаю, я все-таки математик
PM MAIL   Вверх
MAKCim
Дата 19.2.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Код

class vector
{
private:
    int* x;                                    //указатель на твой массив
    int* counter;                        //указатель на счетчик, присутствует в кажом объекте vector
    void destroy()             //удаление массива и счетчика, если на данный массив (vector) больше нет ссылок: (*counter==0)
    {
        if (!--*counter)
        {
            delete counter;
            delete []x;
        }
    }
public:
    vector(): counter(new int(1)), x(0) {}  //создание нового вектора, выделение памяти для счетчика, установка его в 1
    vector(const vector& object)
        : x(object.x), counter(object.counter) {++*counter;}        //увеличение счетчика ссылок при вызове констр-ра копий
    vector& operator=(const vector& object)
    {
        destroy();               //при коп. присваивании либо удаление счетчика ссылок и массива либо уменьшение значения
        x=object.x;                                       //счетчика ссылок на 1, взятие адреса массива и счетчика ссылок из object,
        counter=object.counter;              //увеличение на 1 значения счетчика ссылок
        ++*counter;
        return *this;
    }
    ~vector() {destroy();}                //либо удаление массива и счетчика ссылок, либо ум. на 1 значения счетчика ссылок
    void init(int);
    ...
}

надеюсь понятно


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mayk
Дата 19.2.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Hyps @ 19.2.2006, 18:20 Найти цитируемый пост)

стандартный вектор неподходит просто потому что я математик и мой вектор был написан специально для моих нужд и я не думаю что в стандартном векторе есть эти функции

Так и не стоит использовть std::vector вместо своих специфических нужд.
Его стоит использовать для хранения данных.

То есть заменить
Цитата(Hyps @ 18.2.2006, 01:27 Найти цитируемый пост)
int *x;

на std::vector<int> x;

Цитата(Hyps @ 18.2.2006, 01:27 Найти цитируемый пост)

x=new int[m]; //в ::vector::init(int m)

на
x.resize(m);
delete[] x из деструктора соответственно выкинуть.

После замены хуже навряд ли кому станет.

Ведь в конце концов int* предназначен для расчетов в гораздо меньшей степени, чем vector, который сам способен позаботится об освобождении памяти.

Цитата(Hyps @ 19.2.2006, 18:20 Найти цитируемый пост)

конструктор копирования переопределен, а так же переопределены все возможные операторы.

Конструктор копирования плиз и оператор присваивания плиз в студию.

зы. только при использовании std::vector надо помнить, что если у них у каждого свои внутренности.
То есть если есть ::vector a,b; ,
a = b; a[0] = b[0]+1;
то в случае использования std::vector'а для хранения данных изменится только a[0].
В коде MAKCim,а изменится еще и b[0].
(подразумеваем, что a[i] суть a.x[i])


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Hyps
Дата 19.2.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mayk @ 19.2.2006, 18:51)
Конструктор копирования плиз и оператор присваивания плиз в студию.

Код

class vector{
  public:
  vector (){};
  vector (const vector &ob);
  void init (int a, double b);
  int n;
  double *x;
  double f;
  void add(vector a);
  void sub(vector a);
  void ravno(vector a);
  void mult(double a);
  vector operator= (vector a);
  vector operator= (double a);
  vector operator+ (vector a);
  vector operator- (vector a);
  vector operator* (double a);
  AnsiString show();
  ~vector();

};

vector::vector (const vector &ob){
  n=ob.n;
  x=ob.x;
  f=ob.f;
}

void vector::init (int a, double b){
  n=a;f=0;
  x=new double[n];
  for (int i=0;i<n;i++) x[i]=b;
}

void vector::add(vector a){
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=x[i]+a.x[i];
  return;
}

void vector::sub(vector a){
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=x[i]-a.x[i];
  return;
}

void vector::ravno(vector a){
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=a.x[i];
  return;
}

void vector::mult(double a){
  for (int i=0;i<n;i++) x[i]=x[i]*a;
  return;
}

AnsiString vector::show(){
  AnsiString a;
  for (int i=0;i<n;i++)
    a=a+"x"+FloatToStr(i+1)+"="+FloatToStr(x[i])+"\r\n";
  return a;
}

vector vector::operator=( vector a){
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) x[i]=a.x[i];
  return *this;
}

vector vector::operator+(vector a){
  vector ret;
  ret.init (n,0);
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) ret.x[i]=x[i]+a.x[i];
  return ret;
}

vector vector::operator-(vector a){
  vector ret;
  ret.init (n,0);
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) ret.x[i]=x[i]-a.x[i];
  return ret;
}

vector vector::operator*(double a){
  vector ret;
  ret.init (n,0);
  for (int i=0;i<n;i++) ret.x[i]=x[i]*a;
  return ret;
}

vector vector::operator=(double a){
  vector ret;
  ret.init (n,0);
  for (int i=0;i<n;i++) ret.x[i]=a;
  return ret;
}

AnsiString V_show(vector b){
  AnsiString a;
  for (int i=0;i<b.n;i++){
    a=a+"x"+FloatToStr(i+1)+"="+FloatToStr(b.x[i]);
    a=a+"\r\n";
    }
  return a;
}

vector::~vector(){
  delete[] x;
}


Цитата(Mayk)

После замены хуже навряд ли кому станет.


Допустим....
Но:
1. что делать с кучай других классов о которых я говорил ранее
2. мне надо редактировать абсолютно все что я сделал за 2 года

зы кстати, может и глупый вопрос, но я так и не понял, зачем вообще нужен конструктор копирования и в каких случаях он вызывается?

Это сообщение отредактировал(а) Hyps - 19.2.2006, 21:08
PM MAIL   Вверх
Mayk
Дата 19.2.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Hyps @ 20.2.2006, 00:30 Найти цитируемый пост)
vector::vector (const vector &ob){
  n=ob.n;
-->  x=ob.x; <--
  f=ob.f;
}

Вот оно. Тут просто копируется указатель.
Таким образом, если сделать
vector a(b) (где a,b - рассматриваемы вектора, а не std::),
то при уничтожении a уничтожится и содержимое b (так как delete[] x таки освободит память)
а при попытке уничтожить b, если повезёт, программа рухнет сразу. А если нет - то позже.

а конструктору копирования вызываются довольно часто:
Цитата(Hyps @ 20.2.2006, 00:30 Найти цитируемый пост)
void vector::sub(vector a){

здесь ведь будет вызван именно конструктор копирования.
а при выходе из ф-ции он уничтожит не только себя, но и свой "источник".
Пусть vector a принимается по ссылке.

Цитата(Hyps @ 20.2.2006, 00:30 Найти цитируемый пост)

1. что делать с кучай других классов о которых я говорил ранее

нейронов и прочего? пускай живут. Зачем их трогать, если они корректны? Незачем. Пусть живут...
Пусть даже ::vector живёт. Только вот int *x в нём поменять (ну и аргументы принимать по ссылке,
а не по значению).

Цитата(Hyps @ 20.2.2006, 00:30 Найти цитируемый пост)
2. мне надо редактировать абсолютно все что я сделал за 2 года

... x[i] раньше работало, оно и сейчас работать будет. Так что особо глобальных изменений после перехода
с массивов на std::vector'а не будет (за одним правда исключением - код отныне не должен
полагать что vector a; vector b(a); b[0]=a[0]+1; изменит не только b, но и a.)

Это сообщение отредактировал(а) Mayk - 19.2.2006, 20:57


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Hyps
Дата 19.2.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



зы кстати, может и глупый вопрос, но я так и не понял, зачем вообще нужен конструктор копирования и в каких случаях он вызывается?
Добавлено @ 21:17
Цитата(Mayk)

нейронов и прочего? пускай живут. Зачем их трогать, если они корректны? Незачем. Пусть живут...


но там такая же ситуация с массивами...
ты мне лучше из всего выше написанного выдели момент которыйнужно изменить для корректной работы того что есть...

PM MAIL   Вверх
MAKCim
Дата 19.2.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



конструктор копирования нужен для корректного создания копий экземляров классов, если те содержат "стремные" моменты типа указателей и прочего
пример
Код

class A
{
private:
    int* a;
public:
    A(): a(new int [10]) {}
    ~A() {delete []a;}
}

void F(A object) {}

int main()
{
    A a;
    F(a);           //случится непоправимое
}

при непереопределенном копирующем конструкторе он генерируется компилятором автоматически и производит побитовое копирование полей класса
это значит, что указатели в объектах (в моем примере) будут указывать на рдин и тот же участок памяти, и значит будут удаляться дважды
исправленный пример
Код

class A
{
private:
    int* a;
public:
    A(): a(new int [10]) {}
    A(const A& object): a(new int [10])               //копирующий конструтор
    {
       for (int i=0; i<10; i++) a[i]=object.a[i];
    }
    ~A() {delete []a;}
}

void F(A object) {}

int main()
{
    A a;
    F(a);           //случится непоправимое
}

Цитата

и в каких случаях он вызывается?

вызывается:
1. инициализация объектом этого же типа
2. передача объекта в ф-ю, если она принимает не указатель и не ссылку
3. возвращение объекта из ф-ии (опять же если не ссылка и не указатель)
4. вызывается для объектов-агрегатов в опр. случаях
...

Это сообщение отредактировал(а) MAKCim - 19.2.2006, 21:47


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mayk
Дата 19.2.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Hyps @ 20.2.2006, 01:10 Найти цитируемый пост)
ты мне лучше из всего выше написанного выдели момент которыйнужно изменить для корректной работы того что есть...


что-то около того:

Код

#include <algorithm> //for std::copy // <-- added
class vector{
  public:
  vector (){};
  vector (const vector &ob);
  void init (int a, double b);
  int n;
  double *x;
  double f;
  void add(const vector& a); // <-- changed
  void sub(const vector& a); // <-- changed
  void ravno(const vector& a); // <-- changed
  void mult(double a);
  vector operator= (const vector& a); // <-- changed
  vector operator= (double a); 
  vector operator+ (const vector& a); // <-- changed
  vector operator- (const vector& a); // <-- changed
  vector operator* (double a);
  AnsiString show();
  ~vector();
};

vector::vector (const vector &ob){ 
  n=ob.n;
  x = new double[n];             // <-- changed
  std::copy(ob.x,ob.x + n, x); // <-- changed
}
void vector::init (int a, double b){
  n=a;f=0;
  x=new double[n];
  for (int i=0;i<n;i++) x[i]=b;
}
void vector::add(const vector& a){ // <-- changed
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=x[i]+a.x[i];
}
void vector::sub(const vector& a){ // <-- changed
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=x[i]-a.x[i];
}
void vector::ravno(const vector& a){ // <-- changed
  if (n!=a.n) return;
  for (int i=0;i<n;i++) x[i]=a.x[i];
  return;
}
void vector::mult(double a){ 
  for (int i=0;i<n;i++) x[i]=x[i]*a;
  return;
}
AnsiString vector::show(){ 
  AnsiString a;
  for (int i=0;i<n;i++)
    a=a+"x"+FloatToStr(i+1)+"="+FloatToStr(x[i])+"\r\n";
  return a;
}
vector vector::operator=( const vector& a){ // <-- changed
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) x[i]=a.x[i];
  return *this;
}
vector vector::operator+(const vector& a){ // <-- changed
  vector ret;
  ret.init (n,0);
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) ret.x[i]=x[i]+a.x[i];
  return ret;
}
vector vector::operator-(const vector& a){ // <-- changed
  vector ret;
  ret.init (n,0);
  if (n!=a.n) return *this;
  for (int i=0;i<n;i++) ret.x[i]=x[i]-a.x[i];
  return ret;
}
vector vector::operator*(double a){
  vector ret;
  ret.init (n,0);
  for (int i=0;i<n;i++) ret.x[i]=x[i]*a;
  return ret;
}
vector vector::operator=(double a){
  vector ret;
  ret.init (n,0);
  for (int i=0;i<n;i++) ret.x[i]=a;
  return ret;
}
AnsiString V_show(const vector& b){ // <-- changed
  AnsiString a;
  for (int i=0;i<b.n;i++){
    a=a+"x"+FloatToStr(i+1)+"="+FloatToStr(b.x[i]);
    a=a+"\r\n";
    }
  return a;
}
vector::~vector(){
  delete[] x;
}


Это сообщение отредактировал(а) Mayk - 19.2.2006, 21:56


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Hyps
Дата 19.2.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Mayk спасибо за информацию, а тоя все понять не мог зачем это надо, теперь более менее заработало, но...
при длинне вектора 500000 вылетает, или если длинна меньше а самих векторов больше один хрен вылетает, а их у меня в программе всегда больше


з.ы. а почему нельзя вместо std::copy просто загнать все это в обычный цикл...


Это сообщение отредактировал(а) Hyps - 19.2.2006, 23:04
PM MAIL   Вверх
Mayk
Дата 20.2.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Hyps @ 20.2.2006, 02:59 Найти цитируемый пост)

з.ы. а почему нельзя вместо std::copy просто загнать все это в обычный цикл...

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

Цитата(Hyps @ 20.2.2006, 02:59 Найти цитируемый пост)
при длинне вектора 500000 вылетает, или если длинна меньше а самих векторов больше один хрен вылетает, а их у меня в программе всегда больше

хмм. В принципе не должно вылетать. Полмиллиона double'ов на винде это 4 метра оперативки.
Оно вылетает точно из-за большого числа элемента?


Кстати, возможно стоит подумать о кэшировании результатов.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Hyps
Дата 20.2.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mayk @ 20.2.2006, 10:46)
хмм. В принципе не должно вылетать. Полмиллиона double'ов на винде это 4 метра оперативки.
Оно вылетает точно из-за большого числа элемента?


Кстати, возможно стоит подумать о кэшировании результатов.

когда делаешь вектор меньшей длинны оно все работает нормально, а вылетает как раз при выполнении операции присваивания... когда в цикле поэлементное приравнивание идет он в определенный момент вылетает, как правило на последнем шаге цикла...
кстати может std::copy лучше сработает, но я еще не попробовал

Это сообщение отредактировал(а) Hyps - 20.2.2006, 12:12
PM MAIL   Вверх
Hyps
Дата 20.2.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



блин... smile
заработало... теперь только разобрать полностью как это все работает и зашибись...
надо обратится к первоисточникам, почитать умные книжки...
кстати, Mayk, мож посоветуеш какие нибудь с учетом того что я програмист-самоучка и не всегда понимаю че вы мудреные профессионалы пишете...
я смотрел у вас раздел книги, там 2 для себя отметил (Bjarne Stroustrup, The C++ Language: Third Edition, Special и Роберт Седжвик "Фундаментальные алгоритмы на C++"), но не знаю насколько они подойдут...
хочу приобрести Герберт Шилдт, Полный справочник по С++, твое мнение?

зы а sts::copy работает с двойными массивами и собственными типами данных?

ззы спасибо за помощь! у меня не у одного подобные проблемы, так что можно сказать от спасибо от некоторой части кафедры системного анализа моего универа, а то наши програмисты такие балбесы, они кроме БД ничего делать не умеют, им когда показываешь свои классы они смотрят на них как некоторые на новые ворота... тыкают пальцем и спрашивают: "а что это такое?", "а это зачем?", "ух ты! а я и не знал что так можно", а ведь их этому учат, а нас нет...


зззы ... и я все равно не понимаю зачем делать нужны ссылки и const здесь
Код

vector operator= (const vector& a);

ведь без них и так все работает.... да и посмыслу как то не понятно получется



Это сообщение отредактировал(а) Hyps - 20.2.2006, 12:55
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.0723 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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