Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2010, 16:56   #1
Sergey.Voloxov
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 11
По умолчанию проблема с указателем на массив

Привет всем.

Имеем структуру
Код:
struct t_aflist
{
много полей....
}
имеем два масства
Код:
t_aflist aflist16[3][8];
t_aflist aflist32[3][8];
в зависимости от условий нужно выбрать один из них.
Пишу следующее
Код:
t_aflist ** pointer_to_aflist;
if(условие)
{
pointer_to_aflist=(t_aflist **)aflist16;
}
else
{
pointer_to_aflist=(t_aflist **)aflist32;
}
Далее пишем
Код:
pointer_to_aflist[0][5];
Все компилируется, но при запуске выдается access violation error.

Объясните пожалуйста, в чем дело??


P.S.
для одномерных массивов трюк проходитю
Sergey.Voloxov вне форума Ответить с цитированием
Старый 14.03.2010, 17:05   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

По моему надо так написать
Код:
t_aflist ** pointer_to_aflist;
>>>>
Код:
t_aflist * pointer_to_aflist;
а то выходит указатель на указатель на массив
BOBAH13 вне форума Ответить с цитированием
Старый 14.03.2010, 17:09   #3
Sergey.Voloxov
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 11
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
По моему надо так написать
Код:
t_aflist ** pointer_to_aflist;
>>>>
Код:
t_aflist * pointer_to_aflist;
а то выходит указатель на указатель на массив
Так ведь это ж двумерный массив. Он есть указатель на указатель.

Последний раз редактировалось Sergey.Voloxov; 14.03.2010 в 17:12.
Sergey.Voloxov вне форума Ответить с цитированием
Старый 14.03.2010, 17:11   #4
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

однако память выделяйте, и инициализурйте переменные

Код:
struct t_aflist
{
 int a;
};
	t_aflist aflist16[3][8];

	memset(aflist16[0],0,sizeof(aflist16));

	t_aflist ** pointer_to_aflist = (t_aflist **)calloc(3,sizeof(t_aflist));
	pointer_to_aflist[0] =(t_aflist *)calloc(8,sizeof(t_aflist)); 
	pointer_to_aflist[0][5] = aflist16[0][5];

	pointer_to_aflist[0][5].a = 10;
	t_aflist t = pointer_to_aflist[0][5];
подпись
liljon вне форума Ответить с цитированием
Старый 14.03.2010, 17:21   #5
Sergey.Voloxov
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 11
По умолчанию

Ведь весь трюк в том, что не выделяется память на новый массив. А массивы aflist16 и aflist32 инициализируются в начале программы.

Последний раз редактировалось Sergey.Voloxov; 14.03.2010 в 17:27.
Sergey.Voloxov вне форума Ответить с цитированием
Старый 14.03.2010, 17:35   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Проблема в способе размещения и взятия элементов, они различны для статичных прямоугольных массивов и массивов в виде указателя на указатель.
t_aflist aflist16[3][8] - это одномерный массив(можете проверить сравнив адреса aflist16 и aflist16[0]), строки по 8 столбиков расположены друг за другом.
t_aflist** pointer_to_aflist ожидает, что pointer_to_aflist указывает на массив указателей, каждый из которых указывает на отдельный столбик. То есть при обращении к элементу происходит два разыменования, в то время как в первом примере одно.
Отсюда и выходит AV
netrino вне форума Ответить с цитированием
Старый 14.03.2010, 17:38   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

.................

и поэтому указатель на такой массив нужно объявить как int (*pMass)[8];

Код:
#include <stdio.h>

int main()
{
	int i, j;
	int mass[2][2] = {
		{1, 2},
		{3, 4}
	};

	int (*pMass)[2] = mass;

	for (i = 0; i < 2; ++i) {
		for (j = 0; j < 2; ++j) {
			printf("%d ", pMass[i][j]);
		}
		printf("\n");
	}

	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.03.2010, 17:47   #8
Sergey.Voloxov
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 11
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Проблема в способе размещения и взятия элементов, они различны для статичных прямоугольных массивов и массивов в виде указателя на указатель.
t_aflist aflist16[3][8] - это одномерный массив(можете проверить сравнив адреса aflist16 и aflist16[0]), строки по 8 столбиков расположены друг за другом.
t_aflist** pointer_to_aflist ожидает, что pointer_to_aflist указывает на массив указателей, каждый из которых указывает на отдельный столбик. То есть при обращении к элементу происходит два разыменования, в то время как в первом примере одно.
Отсюда и выходит AV
Значит если создать
Код:
aflist16=new t_aflist*[3];

for(int i=0;i<3;i++)
{
aflist16[i]=new t_aflist[8]
}
проблема решится??

Спасибо за помощь.
Sergey.Voloxov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с вводом в массив prod87 Общие вопросы Delphi 1 24.11.2009 22:33
ошибка при работе с указателем Vladss Общие вопросы C/C++ 22 29.07.2009 03:58
Ошибка с указателем nusik Общие вопросы C/C++ 3 15.07.2009 14:14
Подпись под указателем мыши. Iskin Microsoft Office Excel 4 05.12.2008 11:48