Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136

access violation at address

16.11.2012, 08:22. Показов 2163. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2012, 08:22
Ответы с готовыми решениями:

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

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

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

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

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

Открытие :
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
16.11.2012, 14:35
как у вас считаются DATA2 items[]? сколько там данных,
0
 Аватар для Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:40  [ТС]
Дата2 сейчас не так принципиально, т.к сейчас записываю только DATA1[], как запишу без ошибок - приступлю к дата2)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2012, 14:43
Цитата Сообщение от Quantity Посмотреть сообщение
Но при повторном открытии файла ошибка : access violation at address n
А Вы фаил закрываете после записи в него?
1
 Аватар для Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 14:45  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы фаил закрываете потом?
Вызываю метод delete tfile; Или вы про другое?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2012, 15:00
я про close.
Не знаю, как там в TFileStream, но должно же быть что-то на подобии
C++
1
tfile->close();
1
 Аватар для Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:05  [ТС]
Скорее всего
C++
1
tfile->Free();
Но с ним все равно ошибка.. странно все это)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.11.2012, 15:07
Цитата Сообщение от Quantity Посмотреть сообщение
Но с ним все равно ошибка..
надеюсь free() был вызван до delete?
0
 Аватар для Quantity
13 / 13 / 2
Регистрация: 06.06.2012
Сообщений: 136
16.11.2012, 15:09  [ТС]
Надежда оправданна
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
16.11.2012, 15:26
если вы динамично создаете файловый поток через new, пишите в него и удаляете через delete не будет у вас access violation. а вот в структурах ваших DATAx items[] - это фактически никакие не массивы и в них никогда не окажется того количества элементов которое вы храните в count. то что вы делаете доступ к этим элементам и программа не падает - уже счастье. наверное на месте
C++
1
DATAx items[]
должно быть
C++
1
DATAx *items
с последующим динамическим выделением памяти для массива при считывании count и ее освобождении в деструкторе LISTx.

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

Не по теме:

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

0
16.11.2012, 15:27

Не по теме:

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

0
16.11.2012, 15:28

Не по теме:

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

0
16.11.2012, 22:44

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2012, 22:44
Помогаю со студенческими работами здесь

Project project.exe raised exception class EAccessViolation with message"Access violation at address 326025AF
Программа билдится, запускается, проходить все функции и операторы, но в конце (там где getch();) я нажимаю любую кнопку чтобы закрыть...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru