Страница 1 из 2
CodeVisionAVR и указатели
Добавлено: Ср июл 22, 2009 14:16:14
BCluster
Вопщем такая задача. Есть двумерный массив типа long. Мне нужно получить указатель на этот массив. А чтот я не могу понять что кодвижн голову морочит.
По идее должно работать так:
Код: Выделить всё
long a[4][4];
long** p;
p=a;// так не компилируется
p=(long **)a; //так компилируется
long t;
t = p[2][2]; // тут вместо значения a[2][2] хранится некий хлам, но не значение
[/quote][/list]
Добавлено: Ср июл 22, 2009 14:31:43
adrenocrome
хм. как-то сложно совсем.
может так?
но как в твоем коде - точно не получится.
Добавлено: Ср июл 22, 2009 14:37:28
ARV
имя массива есть указатель на первый его элемент.
Код: Выделить всё
long a[10][10];
long *ptr = a; // вот вам указатель на массив
Добавлено: Ср июл 22, 2009 14:47:07
BCluster
ARV, так я конечно пробовал, но кодвижн отмораживает:
A value of type long[4][20] can't be used to initialize an entity of type 'long *'
С одномерным массивом так проходит, с двумерным почему то нет
adrenocrome, тут можно успешно убрать зведдочку и будет работать))
мне нужн указатель, ибо у меня много массивов, и я хочу сделать массив указателей для их непосредственной адресации
Добавлено: Ср июл 22, 2009 14:56:16
adrenocrome
BCluster писал(а):ARV, так я конечно пробовал, но кодвижн отмораживает:
A value of type long[4][20] can't be used to initialize an entity of type 'long *'
С одномерным массивом так проходит, с двумерным почему то нет
adrenocrome, тут можно успешно убрать зведдочку и будет работать))
мне нужн указатель, ибо у меня много массивов, и я хочу сделать массив указателей для их непосредственной адресации
И правильно он отмораживает!
Пытаемся указателю присвоить значение массива.
Добавлено: Ср июл 22, 2009 14:57:36
ARV
ну так обманите компилятор
Добавлено: Ср июл 22, 2009 14:59:25
ARV
adrenocrome писал(а):И правильно он отмораживает!
Пытаемся указателю присвоить значение массива.
в каком это месте? элемент массива обозначается а[1][1], а просто а - указатель.
Добавлено: Ср июл 22, 2009 14:59:32
BCluster
ничего подобного, любой нормальный компилятор понимает такую запись, это раз, а два - с одномерными массивами все чудесно работает
int a[10];
p=a;
это эквивалентно записи p=&a[0];
Добавлено: Ср июл 22, 2009 15:03:23
BCluster
По непроверенной информации кодвижн не поддерживает указатели на указатели, отсюда и ноги по ходу. Эх.
Как еще можно адресовать кучу массивов, без switch..case?)
Добавлено: Ср июл 22, 2009 15:08:11
ARV
BCluster писал(а):По непроверенной информации кодвижн не поддерживает указатели на указатели
погодите, вам
указатель на массив или
указатель на указатель на массив? обратил внимание, что в первом посте у вас
long **p определен...
Добавлено: Ср июл 22, 2009 15:13:55
BCluster
Указатель на двумерный массив можно предстваить массив указателей на строки массива. Я указал long **p для того, чтоб я мог иметь доступ к ячейкам через [][].
Но мне уже чесн гря по боку, как будет, лишь бы было
Добавлено: Ср июл 22, 2009 15:16:47
ARV
BCluster писал(а):Указатель на двумерный массив можно предстваить массив указателей на строки массива.
хрен там! двумерный массив - это простой одномерный массив, в котором после первой строки следует вторая, потом третья и т.д. на счет того, строка там или столбец - не уверен, но суть такая: просто идущие подряд числа, никаких указателей!
Добавлено: Ср июл 22, 2009 15:19:06
ARV
я вообще не понял, что вы там затеваете. нафига такие лыжи - есть массив, ну и обращайтесь к нему, как к массиву. зачем указатели приплетать?
Добавлено: Ср июл 22, 2009 15:22:32
BCluster
етсь массивы reg1, reg2, reg3,...... в зависимости от условий нужно использовать разные массивы, если адресовать их по именам - нужно кучу if..else али switch..case, если же сделать массив указателей - все будет просто)
Насчет массивов, вот вырезка из книги
Указатели на многомерные массивы в языке СИ - это массивы массивов, т.е. такие массивы, элементами которых являются массивы. При объявлении таких массивов в памяти компьютера создается несколько различных объектов. Например при выполнении объявления двумерного массива int arr2[4][3] в памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес массива из трех элементов типа int, и, следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.
Добавлено: Ср июл 22, 2009 15:34:18
BCluster
Единственное что я могу себе предложить в этом случае, это сделать вместо кучи двумерных массивов один трехмерный)
Добавлено: Ср июл 22, 2009 16:02:50
adrenocrome
мда. сейчас посимулировал, что-то странно как-то кодвижн с указателями и адресами работает.
Добавлено: Ср июл 22, 2009 16:25:42
BCluster
Вопщем как то заработали они ) токльо адресовать надо *(w*y+x), а как я хотел не получилося)
но таким образом мне надо знать размерность массива, эт несколько проблематично, но всеж
Добавлено: Ср июл 22, 2009 17:06:08
zebrox
BCluster писал(а):Как еще можно адресовать кучу массивов, без switch..case?)
Была похожая задачка.
У меня было 80 массивов, разной длинны, в памяти они все друг за дружкой располагались.
Я сделал еще один одномерный массив чаров из 80 ел-м, и в этом массиве храню длины каждого из 80 массивов. Потом получаю указатель на певый массив из 80, и увеличиваю его (указателя) адрес на сумму всех елементов стоящих в массиве длинн перед номером нужного мне массива. Надеюсь понятно объяснил
Я думаю что массив указателей делать дороже получится, т.к. указатель вроде два байта занимает, в итоге сделал через доп. массив длинн.
Добавлено: Ср июл 22, 2009 17:32:51
BCluster
Возможно и дешевле, только потом я сам не разберусь в своем коде, ну его)
Добавлено: Ср июл 22, 2009 18:00:19
DrWatson
BCluster писал(а):По непроверенной информации кодвижн не поддерживает указатели на указатели, отсюда и ноги по ходу.
Почему непроверенная? При попытке передать в функцию указатель на строку двумерного массива, при компиляции, он мне так прямым текстом и написал в ерроре (вольный перевод):
Версия 1.25.5 компилятора CVAVR не поддерживает использование указателя на указатель