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

access violation at address - C++

Восстановить пароль Регистрация
 
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 08:22     access violation at address #1
Дорогие форумчане, столкнулся с проблемой, читаю бинарный файл по структуре :

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 минуты
Ап.. актуально
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 08:22     access violation at address
Посмотрите здесь:

C++ Unhandled exception .. access violation
C++ Access violation
Access violation writing exeption C++
Ошибка Access Violation C++
C++ Crash (access violation)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,280
16.11.2012, 12:58     access violation at address #2
1 зачем вы явно вызываете деструктор
2 не видно повторного открытия. или вы повторно на запись открываете?
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 13:49  [ТС]     access violation at address #3
1. Чтобы освободить память) Но и при методе Free(); ошибка не исчезает)
2. Повторно файл открываю на запись.

Если есть возможность, прошу скинуть немного гайдов по TFileStream, TMemoryStream. Заранее спасибо)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.11.2012, 13:53     access violation at address #4
C++
1
tfile->~TFileStream();//  - это некорректный код
деструктор вызывается, но память не освобождается.
правильно:
C++
1
delete tfile;
и хз что вы там потом делаете с этим tfile. у вас ошибка случается позже, в коде, которого тут нет.
показывайте остальной код.
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:08  [ТС]     access violation at address #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 кода ничайно смешал)
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,280
16.11.2012, 14:35     access violation at address #6
как у вас считаются DATA2 items[]? сколько там данных,
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:40  [ТС]     access violation at address #7
Дата2 сейчас не так принципиально, т.к сейчас записываю только DATA1[], как запишу без ошибок - приступлю к дата2)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 14:43     access violation at address #8
Цитата Сообщение от Quantity Посмотреть сообщение
Но при повторном открытии файла ошибка : access violation at address n
А Вы фаил закрываете после записи в него?
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:45  [ТС]     access violation at address #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы фаил закрываете потом?
Вызываю метод delete tfile; Или вы про другое?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 15:00     access violation at address #10
я про close.
Не знаю, как там в TFileStream, но должно же быть что-то на подобии
C++
1
tfile->close();
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:05  [ТС]     access violation at address #11
Скорее всего
C++
1
tfile->Free();
Но с ним все равно ошибка.. странно все это)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.11.2012, 15:07     access violation at address #12
Цитата Сообщение от Quantity Посмотреть сообщение
Но с ним все равно ошибка..
надеюсь free() был вызван до delete?
Quantity
 Аватар для Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:09  [ТС]     access violation at address #13
Надежда оправданна
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,280
16.11.2012, 15:26     access violation at address #14
если вы динамично создаете файловый поток через new, пишите в него и удаляете через delete не будет у вас access violation. а вот в структурах ваших DATAx items[] - это фактически никакие не массивы и в них никогда не окажется того количества элементов которое вы храните в count. то что вы делаете доступ к этим элементам и программа не падает - уже счастье. наверное на месте
C++
1
DATAx items[]
должно быть
C++
1
DATAx *items
с последующим динамическим выделением памяти для массива при считывании count и ее освобождении в деструкторе LISTx.

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

Не по теме:

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

vxg
16.11.2012, 15:27
  #16

Не по теме:

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

Croessmah
16.11.2012, 15:28
  #17

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 22:44     access violation at address
Еще ссылки по теме:

C++ Access violation writing location
Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA C++
C++ Access violation at address in module cc32100mt.dll

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

Или воспользуйтесь поиском по форуму:
vxg
16.11.2012, 22:44     access violation at address
  #18

Не по теме:

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

Yandex
Объявления
16.11.2012, 22:44     access violation at address
Ответ Создать тему
Опции темы

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