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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
#1

access violation at address - C++

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

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

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

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA - C++
Выдает ошибку raised exception class EAccessViolation with message 'Access violation at address 004011FA... на строке { fputc (c,b);}....

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

Crash (access violation) - C++
Задача: http://acm.timus.ru/problem.aspx?space=1&num=1313 p.s. ссылку лучше откопипастить в браузер, т.к. форум на выходе её портит ...

Ошибка Access Violation - C++
Собственно, проблемма: Есть класс, в котором есть переменные (3 шт): class wField { protected: int Vert; int Gor; char*...

Access violation writing location - C++
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит результат, а после вылетает исключение. #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,305
16.11.2012, 12:58     access violation at address #2
1 зачем вы явно вызываете деструктор
2 не видно повторного открытия. или вы повторно на запись открываете?
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 13:49  [ТС]     access violation at address #3
1. Чтобы освободить память) Но и при методе Free(); ошибка не исчезает)
2. Повторно файл открываю на запись.

Если есть возможность, прошу скинуть немного гайдов по TFileStream, TMemoryStream. Заранее спасибо)
DU
1480 / 1056 / 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
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
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,305
16.11.2012, 14:35     access violation at address #6
как у вас считаются DATA2 items[]? сколько там данных,
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:40  [ТС]     access violation at address #7
Дата2 сейчас не так принципиально, т.к сейчас записываю только DATA1[], как запишу без ошибок - приступлю к дата2)
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 14:43     access violation at address #8
Цитата Сообщение от Quantity Посмотреть сообщение
Но при повторном открытии файла ошибка : access violation at address n
А Вы фаил закрываете после записи в него?
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:45  [ТС]     access violation at address #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы фаил закрываете потом?
Вызываю метод delete tfile; Или вы про другое?
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 15:00     access violation at address #10
я про close.
Не знаю, как там в TFileStream, но должно же быть что-то на подобии
C++
1
tfile->close();
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:05  [ТС]     access violation at address #11
Скорее всего
C++
1
tfile->Free();
Но с ним все равно ошибка.. странно все это)
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 15:07     access violation at address #12
Цитата Сообщение от Quantity Посмотреть сообщение
Но с ним все равно ошибка..
надеюсь free() был вызван до delete?
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:09  [ТС]     access violation at address #13
Надежда оправданна
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,305
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
Еще ссылки по теме:

Access violation reading location - C++
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На...

Сортировка слиянием и Access Violation - C++
Доброе время суток. Подскажите в чем я мог просчитаться(строчку с ошибкой отметил комментарием): #include "stdafx.h" #include...

Что делать? Access violation - C++
Ругается на 40 строчку Пишет: Необработанное исключение по адресу 0x7C7C7C7C в движение курсора.exe: 0xC0000005: Access violation...

Access violation writing location - C++
Добрый день! на строке ptr = ptr; бросает unhandeled exeption: Access violation writing location, не пойму почему, может уже туплю....

почему выдает access violation? - C++
подскажите плиз изза чего доступ ограничивает, и как сделать чтоб я мог каждому элементу массива структур присваивать по...


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

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

Не по теме:

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

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

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