Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
1

Ошибка (access violation) при обращении к элементу динамического массива структур

07.10.2015, 09:12. Показов 1321. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Все прекрасно работает если в структуре статические массивы. Но так уж получилось, что есть необходимость задавать размерность массивов вручную. Итак, есть некая структура с динамическим массивом, которую мы объявляем в одной из функций:

C++
1
2
3
4
5
6
7
Struct STR{ 
...
...
int   *Prog;
} rec;
 
rec.Prog=new int[k]; //Значение k получаем ранее, в процессе работы программы.
Далее пытаюсь записать значение этого массива в вариантный массив

C++
1
2
3
4
5
while (!eof(Fdat)){
        read( Fdat,(char *)&rec,sizeof(rec));
for (int i=0;i<k;i++)
 {
                most_prog.PutElement(rec.Prog[i], t, i);
И на последней строке вылетает не к ночи помянутый access violation. По-разному пробовал экспериментировать, пришел к выводу, что дело именно в обращении к элементам динамического массива rec.Prog[i], размерность которого мы вроде как задали ранее. Помогите, пожалуйста. Заранее благодарю. Повторюсь, если структура объявлена со статическими массивами, то проблем нет вообще никаких с этим же кодом.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2015, 09:12
Ответы с готовыми решениями:

Массивы структур (при обращении к элементу массива выскакивает ошибка)
#include &lt;iostream&gt; using namespace std; class Lancuch { public: char cos; Lancuch *...

Access Violation при обращении к элементу массива
Пытаюсь написать одну занятную карточную игру, но еще на стадии описания колоды(точней при его...

Access Violation при повторном заполнении динамического массива
Здравствуйте, есть код парсинга некоторой информации с сайта. type RRecord = record ...

Ошибка при обращении к элементу массива
Я создаю динамический массив. Но при обращении к элементу массива у меня ошибка: constant out of...

10
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
07.10.2015, 09:30 2
А что тебе мешает обьявить сразу динамический массив в структуре

Добавлено через 3 минуты
C++
1
2
3
4
for (int i=0;i<k;i++)
{
rec.Prog[i]=new int[k];
}
Так пробовал
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 09:49  [ТС] 3
Цитата Сообщение от Игорь1986 Посмотреть сообщение
А что тебе мешает обьявить сразу динамический массив в структуре
Добавлено через 3 минуты
Код C++Выделить код
1
2
3
4
for (int i=0;i<k;i++)
{
rec.Prog[i]=new int[k];
}
Так пробовал
Я правильно понимаю, что это вместо 7 строки в моей первой вставке? Если да, то ругается cannot convert 'int*' to 'int'
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.10.2015, 09:53 4
Jaydens_Blues, вы записываете в файл структуру, содержащую указатель (это просто адрес памяти в куче), сам массив, как лежал в куче, так там и будет лежать, пока эту память не отметят как неиспользуемую (что неминуемо произойдёт при завершении работы программы). Когда вы читаете структуру, то в ней находится адрес, по которому уже нет массива (при этом и куча скорее всего уже другая), разыменовывание (rec.Prog[i]) такого указателя и приводит к "access violation". Для записи структуры в файл используйте либо статический массив, либо как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct STR
{
    ...
    size_t count;
} rec_for_write, rec_for_read;
...
rec_for_write.count = k;
int* Prog_for_write = new int[rec.count];
...
write(Fdat, (char*)&rec_for_write, sizeof(STR));
write(Fdat, (char*)Prog_for_write, rec_for_write.count*sizeof(int));
...
read(Fdata, (char*)&rec_for_read, sizeof(STR));
int* Prog_for_read = new int[rec_for_read.count];
read(Fdata, (char*)Prog_for_read, rec_for_read.count*sizeof(int));
//работаем с Prog_for_read
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:01  [ТС] 5
Цитата Сообщение от Operok Посмотреть сообщение
aydens_Blues, вы записываете в файл структуру, содержащую указатель (это просто адрес памяти в куче), сам массив, как лежал в куче, так там и будет лежать, пока эту память не отметят как неиспользуемую (что неминуемо произойдёт при завершении работы программы). Когда вы читаете структуру, то в ней находится адрес, по которому уже нет массива (при этом и куча скорее всего уже другая), разыменовывание (rec.Prog[i]) такого указателя и приводит к "access violation". Для записи структуры в файл используйте либо статический массив, либо как-то так
У меня наоборот, я считываю файл в структуру. Но, как я понимаю, это без разницы. Наверное, все же придется работать со статическими массивами, т.к. помимо этой одной ошибки почему-то файл читается как-то по-другому, не как со статическими. Это еще как-то и на размер структуры sizeof(rec) влияет, потому что файл будто дольше читается, чем положено и, возможно, некорректно
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.10.2015, 10:06 6
Jaydens_Blues, а пишет туда эти структуры кто? Если в структуре объявить статический массив, то он её размер станет больше ровно на sizeof("тип_эл_массив")*count, в вашем случае (динамический массив) в структуре лежит просто указатель, который имеет актуальность только в том процессе, в котором его инициализировали (выделили память под него).
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
07.10.2015, 10:08 7
Насчет ошибки обьяви вот так и все должно работать int Prog;
Мучайся с динамическими, так интереснее
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.10.2015, 10:13 8
Если это файл с данными типа:
C++
1
2
3
4
5
6
struct STR
{
    ...
    int k; //кол-во данных
    int Prog[k];  //данные
}
то лучше будет считывать либо побайтно, либо как я предложил, тогда лучше будет объявить структуру:
C++
1
2
3
4
5
struct STR_for_read
{
    ...
    int k;
}
читать её, узнавать кол-во данных и читать данные в динамический массив (они будут лежать в файле ровно за структурой STR_for_read)
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:14  [ТС] 9
Цитата Сообщение от Игорь1986 Посмотреть сообщение
Насчет ошибки обьяви вот так и все должно работать int Prog;
Мучайся с динамическими, так интереснее
Ну, так это же будет просто переменная, если просто int Prog
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
07.10.2015, 10:34 10
C++
1
rec.Prog[i]=new int*[k];
)))Бывает
Радует что вы хоть немного думаете а не сдираете с копирки
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:54  [ТС] 11
Игорь1986, да не, все равно не то, cannot convert 'int**' to 'int'. Ну и в целом, как я понимаю, этот код пытается в элемент массива запихнуть другой массив... Или я не прав? Какова суть фрагмента кода, который вы хотели предложить с самого начала?
Ведь изначально 7 строка (rec.Prog=new int[k]) и устанавливает размерность массива, то есть если k=10, то получится типа как при объявлении статического int Prog[10], вот только дальше уже фигушки работать как со статическим...
0
07.10.2015, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2015, 10:54
Помогаю со студенческими работами здесь

Ошибка при обращении к элементу массива; не удается найти автокорреляционную функцию
При вычислении автокорреляционной функции столкнулся с проблемой &quot;это вычисление не приближается к...

Access violation при обращении по указателю
_CommandPtr pCmd = NULL; _ParameterPtr Var1; Var1 = pCmd-&gt;CreateParameter(_bstr_t(&quot;@T&quot;),...

Обращение к элементу динамического массива структур
Само задание: http://cs412722.vk.me/v412722398/4e77/fUkq93u2HDE.jpg пока написал только это:...

Ошибка 'Access violation at address 00403EF4' при вводе массива
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru