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

ошибка в указателе - C++

Восстановить пароль Регистрация
 
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 19:26     ошибка в указателе #1
после выполнения функции pbeg->next ссылается на последний элемент, а не на следующий, помогите!
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
void addf()
 
       { FILE *f1;
pt=new magazin;
pr=new magazin;
magazin m;
f1 = fopen("6.dat","r+b");
fread(&m.nomer,sizeof(m.nomer),1,f1);
fread(&m.nazvanie,sizeof(m.nazvanie),1,f1);
fread(&m.fio,sizeof(m.fio),1,f1);
fread(&m.dohod,sizeof(m.dohod),1,f1);
fread(&m.kol,sizeof(m.kol),1,f1);
pr->nomer=m.nomer;
strcpy(pr->nazvanie,m.nazvanie);
strcpy(pr->fio,m.fio);
pr->dohod=m.dohod;
pr->kol=m.kol;
pr->prev=0;
pr->next=0;
pbeg=pr;
pg=pbeg;
while(true)
{fread(&m.nomer,sizeof(m.nomer),1,f1);
fread(&m.nazvanie,sizeof(m.nazvanie),1,f1);
fread(&m.fio,sizeof(m.fio),1,f1);
fread(&m.dohod,sizeof(m.dohod),1,f1);
fread(&m.kol,sizeof(m.kol),1,f1);
pt->nomer=m.nomer;
strcpy(pt->nazvanie,m.nazvanie);
strcpy(pt->fio,m.fio);
pt->dohod=m.dohod;
pt->kol=m.kol;
if(feof(f1)) {break;}
pt->next=0;
pt->prev=pg;
pg->next=pt;
cout<<pt->dohod<<endl;
pg=pt;
}
 
  fclose(f1); }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 19:26     ошибка в указателе
Посмотрите здесь:

НЕ могу разобраться в указателе C++
C++ Конвертация типа или как сэкономить на указателе?
ошибка в указателе C++
Ошибка в указателе. исправьте ) C++
Аргументы по-умолчанию в указателе на функцию в классе C++
C++ Ошибка в указателе
C++ Где - то слышал, что в указателе сохраняется информация о размере массива, верно ли это?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 19:51     ошибка в указателе #2
обычно лучше весь код выкладывать, а не отдельные куски.
значит попробуй поугадывать:
в строке 21: pg=pbeg;
pbeg указывает на самый первый узел. после выполнения этой строчки
pg тоже бует указывать на этот самый первый узел.
далее идет цикл заполнения списка и в строчке 36 происходит следующее:
pg->next= pt;
вот в этот момент начальный узел начинает ссылаться на последний узел, т.к.
pg и pbeg указывают на один и тот же узел, то эта 36ая строчка эквивалентна
pbeg->next=pt; - т.е. pbeg->next начнет указывать на последний добавленный.

А вообще я бы вам посоветовал реорганизовать код.
чтение данных из файла - это одна функция.
добавление значение в конец списка - это другая.
так будет проще и понятнее.
Вот примерно так:

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
// Вот примерный код:
 
//Тут обратите внимание на то, что узел - это структура из
//данных и указателя на другие узлы. У вас же узел списка - это
//структура в которой и поля данных и указатели на другие узлы.
// такое разделение еще дает возможность читать из файла структуру
// magazine одним вызовом функции, а не по полям,
// т.е. fread(&m,sizeof(magazine),1,f1);, потому что в структуре нет
// паразитных next и prev
struct Node
{
  magazine mag;
  Node* prev;
  Node* next
};
 
magazine readFromFile()
{
  magazine m;
  // тут любым способом макаром читаем из файла
  return m;
};
 
Node* getLastNode()
{
  // тут проходим по списку до конца и возвращаем последний узел.
  // ну или еще откудато его берем. это не важно. главное чтобы
  // функция всегда возвращала последний узел.
  return lastNode;
}
 
void add(const magazine& m)
{
  Node* lastNode = getLastNode();
  Node* newNode = new Node();
  newNode.mag = m;
  lastNode->next = newNode;
  newNode->prev = lastNode;
  newNode->next = 0;
}
 
// ну и тут все это применяем:
const magazine m = readFromFile();
add(m);
 
 
// В таком коде всегда легче разобраться чем в том, что у вас написано.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:09  [ТС]     ошибка в указателе #3
ну так правильно, в 36 строчке после первого прохода я присваиваю pbeg->next следующее значение pt, а потом в 38 строке pg присваиваю значение этого(следуещего) pt, т.е. pg теперь у нас pbeg->next
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 20:33     ошибка в указателе #4
как вы определили, что pbeg указывает на последний элемент в списке, а не на следующий? печатью на экран? а размер списка после такого добавления не пробовали проверить? корректные ли указатели? в общем на один вызов функции вы выделяете в памяти всего два узла (строки 4 и 5), а потом химичите с указателями на них. после этого в список не получится сделать больше чем из двух узлов. на каждой итерации чтения нужно выделять в памяти новый узел и связывать его у уже имеющимися.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:42  [ТС]     ошибка в указателе #5
да, выводом на экран, и количество смотрел-2! не понял почему список не может быть больше 2-х узлов?
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:10     ошибка в указателе #6
вот еще раз прочтите:
на каждой итерации чтения нужно выделять в памяти новый узел и связывать его с уже имеющимися.
а лучше обратите внимание на код из моего первого сообщения.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:17  [ТС]     ошибка в указателе #7
я же динамически захватываю pt!
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:21     ошибка в указателе #8
не знаю что значит динамически захватить pt.
каждый узел списка должен создаваться динамически.
чтобы создать объект динамически, нужно позвать new.
у вас в коде new зовется всего два раза. значит создается всего два узла.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:36  [ТС]     ошибка в указателе #9
спс, согласен затупил
надо было pt=new magazin в цикл запихнуть!
Yandex
Объявления
21.05.2012, 21:36     ошибка в указателе
Ответ Создать тему
Опции темы

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