Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
1

access violation at address

16.11.2012, 08:22. Просмотров 1138. Ответов 17
Метки нет (Все метки)

Дорогие форумчане, столкнулся с проблемой, читаю бинарный файл по структуре :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct HEAD
 {
 int a1;
 int a2;
 };
 
struct DATA1
 {
 unsigned int a5;
 wchar_t a6[32];
 int a7;
 int a8;
 int a9;
 int a10;
 int a11;
 };
 
struct LIST1
 {
 int a3;
 int a4;
 DATA1 items[];
 };

Читается нормально, далее - записываю значения в файл :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    TFileStream  * tfile = new TFileStream("C:/Users/Quality/Desktop/file.data",fmOpenReadWrite);
 
    tfile->Seek(0,0);
    tfile->Write(&head->a1, 4);
    tfile->Write(&head->a2, 4);
    tfile->Write(&list1->a3, 4);
    tfile->Write(&list1->a4, 4);
 
        tfile->Write(&list1->items[1].a5, 4);
        tfile->Write(list1->items[1].a6, 64);
        tfile->Write(&list1->items[1].a7, 4);
        tfile->Write(&list1->items[1].a8, 4);
        tfile->Write(&list1->items[1].a9, 4);
        tfile->Write(&list1->items[1].a10, 4);
        tfile->Write(&list1->items[1].a11, 4);
        tfile->~TFileStream();
        ShowMessage("Файл успешно сохранен!");
Но при повторном открытии файла ошибка : access violation at address n

Помогите пожалуйста решить проблему)

Добавлено через 11 часов 34 минуты
Ап.. актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 08:22
Ответы с готовыми решениями:

Access violation at address in module
здравствуйте ребят. Такой вопрос. В самом начале проганья Пытаюсь заполнить...

Access violation at address in module cc32100mt.dll
Нужна помощь. Билдер выдает ошибку "access violation at address in module...

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA
Выдает ошибку raised exception class EAccessViolation with message 'Access...

Access violation
Помогите пожалуйста. Не могу разобраться. Нашел в каком месте ругается. Но не...

Crash (access violation)
Задача: http://acm.timus.ru/problem.aspx?space=1&num=1313 p.s. ссылку лучше...

17
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
16.11.2012, 12:58 2
1 зачем вы явно вызываете деструктор
2 не видно повторного открытия. или вы повторно на запись открываете?
1
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 13:49  [ТС] 3
1. Чтобы освободить память) Но и при методе Free(); ошибка не исчезает)
2. Повторно файл открываю на запись.

Если есть возможность, прошу скинуть немного гайдов по TFileStream, TMemoryStream. Заранее спасибо)
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
16.11.2012, 13:53 4
C++
1
tfile->~TFileStream();//  - это некорректный код
деструктор вызывается, но память не освобождается.
правильно:
C++
1
delete tfile;
и хз что вы там потом делаете с этим tfile. у вас ошибка случается позже, в коде, которого тут нет.
показывайте остальной код.
1
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:08  [ТС] 5
Остальной код :

Открытие :
C++
1
2
3
4
5
6
7
8
9
10
TMemoryStream *st = new TMemoryStream();
if(!OpenDialog1->Execute())
        return;
 
st->LoadFromFile(OpenDialog1->FileName);
 
HEAD *head = (HEAD*)st->Memory;
list1 = (LIST1*)&head[1];
list2 = (LIST2*)((unsigned int)list1 + 4 + list1->count * sizeof(DATA1));
list3 = (LIST3*)((unsigned int)list2 + 4 + list2->count * sizeof(DATA2));
Структура :
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
struct HEAD
 {
 int version;
 int timestamp;
 };
 
struct DATA1
 {
 unsigned int id;
 wchar_t name[32];
 int type;
 int num_params;
 int param1;
 int param2;
 int param3;
 };
struct LIST1
 {
 int size;
 int count;
 DATA1 items[];
 };
 
struct DATA2
 {
 unsigned int id;
 wchar_t name[32];
 };
struct LIST2
 {
 int size;
 int count;
 DATA2 items[];
 };
 
 struct DATA3
 {
 unsigned int id;
 wchar_t name[32];
 };
struct LIST3
 {
 int size;
 int count;
 DATA2 items[];
 };
Сохранение :
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
if (!SaveDialog1->Execute())
        return;
 
    st->~TMemoryStream();
 
 
 
    TFileStream  * tfile = new TFileStream(Main_Form->SaveDialog1->FileName,fmOpenReadWrite);
 
    tfile->Seek(0,0);
 
    tfile->WriteBuffer(&head, sizeof(*head));
    tfile->WriteBuffer(&list1, sizeof(*list1));
 
    tfile->~TFileStream();
 
    // Описание HEAD
    tfile->Write(&head->version, 4);
    tfile->Write(&head->timestamp, 4);
 
    // Описание LIST1
 
    tfile->Write(&list1->size, 4);
    tfile->Write(&list1->count, 4);
 
    // Описание DATA1
 
    tfile->Write(&list1->items->id, 4);
    tfile->Write(list1->items->name, 64);
    tfile->Write(&list1->items->type, 4);
    tfile->Write(&list1->items->param1, 4);
    tfile->Write(&list1->items->param2, 4);
    tfile->Write(&list1->items->param3, 4);
 
    ShowMessage("Файл успешно сохранен!");
Добавлено через 10 минут
Сохранение :
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
if (!SaveDialog1->Execute())
        return;
 
    st->~TMemoryStream();
 
 
 
    TFileStream  * tfile = new TFileStream(Main_Form->SaveDialog1->FileName,fmOpenReadWrite);
 
    tfile->Seek(0,0);
 
    // Описание HEAD
    tfile->Write(&head->version, 4);
    tfile->Write(&head->timestamp, 4);
 
    // Описание LIST1
 
    tfile->Write(&list1->size, 4);
    tfile->Write(&list1->count, 4);
 
    // Описание DATA1
 
    tfile->Write(&list1->items->id, 4);
    tfile->Write(list1->items->name, 64);
    tfile->Write(&list1->items->type, 4);
    tfile->Write(&list1->items->param1, 4);
    tfile->Write(&list1->items->param2, 4);
    tfile->Write(&list1->items->param3, 4);
 
    tfile->~TFileStream();
 
    ShowMessage("Файл успешно сохранен!");
Ошибся, вот такое сохранение. там 2 кода ничайно смешал)
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
16.11.2012, 14:35 6
как у вас считаются DATA2 items[]? сколько там данных,
0
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:40  [ТС] 7
Дата2 сейчас не так принципиально, т.к сейчас записываю только DATA1[], как запишу без ошибок - приступлю к дата2)
0
Croessmah
++Ͻ
14607 / 8361 / 1576
Регистрация: 27.09.2012
Сообщений: 20,554
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 14:43 8
Цитата Сообщение от Quantity Посмотреть сообщение
Но при повторном открытии файла ошибка : access violation at address n
А Вы фаил закрываете после записи в него?
1
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:45  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы фаил закрываете потом?
Вызываю метод delete tfile; Или вы про другое?
0
Croessmah
++Ͻ
14607 / 8361 / 1576
Регистрация: 27.09.2012
Сообщений: 20,554
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 15:00 10
я про close.
Не знаю, как там в TFileStream, но должно же быть что-то на подобии
C++
1
tfile->close();
1
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:05  [ТС] 11
Скорее всего
C++
1
tfile->Free();
Но с ним все равно ошибка.. странно все это)
0
Croessmah
++Ͻ
14607 / 8361 / 1576
Регистрация: 27.09.2012
Сообщений: 20,554
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 15:07 12
Цитата Сообщение от Quantity Посмотреть сообщение
Но с ним все равно ошибка..
надеюсь free() был вызван до delete?
0
Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:09  [ТС] 13
Надежда оправданна
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
16.11.2012, 15:26 14
если вы динамично создаете файловый поток через new, пишите в него и удаляете через delete не будет у вас access violation. а вот в структурах ваших DATAx items[] - это фактически никакие не массивы и в них никогда не окажется того количества элементов которое вы храните в count. то что вы делаете доступ к этим элементам и программа не падает - уже счастье. наверное на месте
C++
1
DATAx items[]
должно быть
C++
1
DATAx *items
с последующим динамическим выделением памяти для массива при считывании count и ее освобождении в деструкторе LISTx.

Добавлено через 43 секунды
попробуйте собрать программу с включенным codeguard и поглядите что он у вас в лог посыпет
1
Croessmah
16.11.2012, 15:27
  #15

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
и программа не падает - уже счастье
Поверьте, счастье - это когда программа падает :D

0
vxg
16.11.2012, 15:27
  #16

Не по теме:

вообще да, но если это происходит во время презентации заказчику - уж лучше бы она подождала денек)

0
Croessmah
16.11.2012, 15:28
  #17

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
вообще да, но если это происходит во время презентации заказчику - уж лучше бы она подождала денек)
Вот как раз лучше, чтобы она упала во время разработки, иначе потом упадет когда не нужно

0
vxg
16.11.2012, 22:44     access violation at address
  #18

Не по теме:

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

0
16.11.2012, 22:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 22:44
Привет! Вот еще темы с ответами:

Ошибка Access Violation
Собственно, проблемма: Есть класс, в котором есть переменные (3 шт): class...

Access violation writing location
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит...

Access violation writing location
Добрый день! на строке ptr = ptr; бросает unhandeled exeption: Access...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru