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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель на указатель, список указателей на список не работает  
V
    Опции темы
cooper123
Дата 21.6.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



программа вылетает на строчке идущей за     //error line
этот вариант  работате но не правильно, указатель на указатель как то не правильно 
разадресовывается, причем не всегда, не стабильно. 

где искать ошибку не представляю 
подскажите пожалуйста


Код

//makefile:
//all:
//  g++ prob.cpp -o aaa.exe
#include <iostream>
#include <fstream>
#include <string>
#include <list>

using namespace std;

class t{
public:
  int index;
};

typedef  std::list<t>::iterator T_node_now;

class t_list : public list<t>{
public:
  int nn;
  void create(void);
};

void t_list::create(void ){
  t tt1;
  
  clear();
  for(int i =0;i<nn;i++){
    tt1.index = i;
    push_back(tt1);
  };  
  cout<<"list created"<<endl;
};

///spisok nekotorysh elementov is t_list
class t_list_node{
public:
  T_node_now pos;
  int index,ind_ind;  
  
};

class pointer_list : std::list<t_list_node>{
public: 
  int nn;
  int prop;
  void create(t_list tl);
  void save(char *file_name);   
  int get_index(void);
};

int pointer_list::get_index(){
  static int i = 0;
  return i++;
};

void pointer_list::create(t_list tl){
  T_node_now tl_pos; 
  t_list_node tln;
  tl_pos = tl.begin();
  
  clear();
  for(int i=0;i<tl.size();i++){
    if(tl_pos->index%prop == 0){
      tln.pos= tl_pos;
      tln.ind_ind = tl_pos->index;
      tln.index = get_index();
      push_back(tln);
    }
    tl_pos++;
  }
  cout<<"pointer list created"<<endl;
};

void pointer_list::save(char *file_name){
  ofstream of(file_name);
  iterator iter;

  iter = begin();
  for(int i =0;i<size();i++){
    of<<"index "<<iter->index<<endl;
    of<<"iter->ind_ind  "<<iter->ind_ind<<endl;

    //error line
    of<<"iter->pos->index  "<<iter->pos->index<<endl;
    of<<"next node"<<endl;
    iter++;
  }
    of<<"pointer list saved"<<endl;
};

int main(void){
  t_list tl;
  pointer_list pl;
  tl.nn = 100;

  tl.create();
  pl.prop = 3;
  pl.create(tl);
  pl.save("ttt");
  cout<<"ende kapende"<<endl;
  return 0;
};




вот что выводится в файл

Код

index 0
iter->ind_ind  0
iter->pos->index  0
next node
index 1
iter->ind_ind  3
iter->pos->index  3
next node
index 2
iter->ind_ind  6
iter->pos->index  0
next node
index 3
iter->ind_ind  9
iter->pos->index  1765682547
next node
index 4
iter->ind_ind  12
iter->pos->index  12
next node
index 5
iter->ind_ind  15
iter->pos->index  15
next node
index 6
iter->ind_ind  18
iter->pos->index  18
next node
index 7
iter->ind_ind  21
iter->pos->index  21
next node
index 8
iter->ind_ind  24
iter->pos->index  24
next node
index 9
iter->ind_ind  27
iter->pos->index  27
next node
index 10
iter->ind_ind  30
iter->pos->index  4260048
next node
index 11
iter->ind_ind  33
iter->pos->index  33




Это сообщение отредактировал(а) cooper123 - 21.6.2008, 14:18
PM MAIL   Вверх
rrrFer
Дата 22.6.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



cooper123
Вы бы сказали что должна делать программа?
PM MAIL WWW ICQ   Вверх
cooper123
Дата 22.6.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

при исполнении моей программы выдается ошибка

Program received signal SIGSEGV, Segmentation fault.

а в этом примере что я построил по подобию  своей программы (для обозримости) вроде работает но не правильно и главное нестабильно то правильно то не правильно. 


надеюсь что может сейчас понятно.



Это сообщение отредактировал(а) cooper123 - 22.6.2008, 22:31
PM MAIL   Вверх
jonie
Дата 22.6.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



где-то обращаетесь по невыделенной памяти.
что мешает взять gdb и найти где валитесь анализом крешдампа?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
cooper123
Дата 23.6.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробую. 
только вот не понятно что это может дать. 
тоесть то что ссылка не так разадресовывается это и так понятно, а вот какие есть возможности это исправить я не представляю, кроме того как переходить обратно на си без всяких плюсов и темлатов (которые мне так понравились((((
PM MAIL   Вверх
mes
Дата 23.6.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(cooper123 @  23.6.2008,  01:16 Найти цитируемый пост)
тоесть то что ссылка не так разадресовывается это и так понятно, а вот какие есть возможности это исправить я не представляю, кроме того как переходить обратно на си без всяких плюсов и темлатов (которые мне так понравились(((( 

проблемы с указателями у С и С++ общие. Исправить поможет внимательность, аккуратность и желание.  Если они не помогут то програмировать на С (С++)
будет очень тяжело.. Для подобных случаев сушествует большой список других языков, не имееюших такого "недостатка"  smile 




--------------------
PM MAIL WWW   Вверх
xvr
Дата 23.6.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Ошибка в методе void pointer_list::create(t_list tl) - его параметр (список по которому заполняется объект) передается по значению, т.е. будет сделана копия списка, каковая и будет переданна параметром. Далее по этой копии организуется обход и итераторы, указывающие на эту ВРЕМЕННУЮ копию сохраняются внутри объекта. По выходу параметр разрушается и все итераторы становятся невалидными.
Надо поменять способ передачи параметра: void pointer_list::create(t_list & tl)
PM MAIL   Вверх
cooper123
Дата 23.6.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(xvr @  23.6.2008,  11:02 Найти цитируемый пост)
Ошибка в методе void pointer_list::create(t_list tl) - его параметр (список по которому заполняется объект) передается по значению, т.е. будет сделана копия списка, каковая и будет переданна параметром. Далее по этой копии организуется обход и итераторы, указывающие на эту ВРЕМЕННУЮ копию сохраняются внутри объекта. По выходу параметр разрушается и все итераторы становятся невалидными.
Надо поменять способ передачи параметра: void pointer_list::create(t_list & tl) 



Спасибо большое. 
помогло. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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