Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

access violation at address - C++

16.11.2012, 08:22. Просмотров 1060. Ответов 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 (C++):

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*...

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

Если есть возможность, прошу скинуть немного гайдов по TFileStream, TMemoryStream. Заранее спасибо)
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.11.2012, 13:53 #4
C++
1
tfile->~TFileStream();//  - это некорректный код
деструктор вызывается, но память не освобождается.
правильно:
C++
1
delete tfile;
и хз что вы там потом делаете с этим tfile. у вас ошибка случается позже, в коде, которого тут нет.
показывайте остальной код.
1
Quantity
12 / 12 / 1
Регистрация: 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
Модератор
3183 / 1986 / 226
Регистрация: 13.01.2012
Сообщений: 7,675
16.11.2012, 14:35 #6
как у вас считаются DATA2 items[]? сколько там данных,
0
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:40  [ТС] #7
Дата2 сейчас не так принципиально, т.к сейчас записываю только DATA1[], как запишу без ошибок - приступлю к дата2)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 14:43 #8
Цитата Сообщение от Quantity Посмотреть сообщение
Но при повторном открытии файла ошибка : access violation at address n
А Вы фаил закрываете после записи в него?
1
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:45  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы фаил закрываете потом?
Вызываю метод delete tfile; Или вы про другое?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 15:00 #10
я про close.
Не знаю, как там в TFileStream, но должно же быть что-то на подобии
C++
1
tfile->close();
1
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:05  [ТС] #11
Скорее всего
C++
1
tfile->Free();
Но с ним все равно ошибка.. странно все это)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 15:07 #12
Цитата Сообщение от Quantity Посмотреть сообщение
Но с ним все равно ошибка..
надеюсь free() был вызван до delete?
0
Quantity
12 / 12 / 1
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:09  [ТС] #13
Надежда оправданна
0
vxg
Модератор
3183 / 1986 / 226
Регистрация: 13.01.2012
Сообщений: 7,675
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     access violation at address
  #15

Не по теме:

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

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

Access violation writing location - C++
#include <iostream> using namespace std; template < typename t > void QuickSort( t array, int left,int right) { int i = left; ...

access violation reading location - C++
access violation reading location такая проблема если вести информацию про двух и больше студентов помогите пожалуйста очень срочно надо ...

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

не пойму из-за чего Access violation - C++
При запуске проги происходит Access violation. Причём ранее проект был написан в bcb6, затем ради эксперимента(и возможного переезда)...


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

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

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