CodeVisionAVR и указатели

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Вопщем такая задача. Есть двумерный массив типа long. Мне нужно получить указатель на этот массив. А чтот я не могу понять что кодвижн голову морочит.

По идее должно работать так:

Код: Выделить всё

long a[4][4];
long** p;
p=a;// так не компилируется
p=(long **)a; //так компилируется
long t;
t = p[2][2]; // тут вместо значения a[2][2] хранится некий хлам, но не значение

[/quote][/list]
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

хм. как-то сложно совсем.
может так?

Код: Выделить всё

long *a[4][4]; 
long  t; 
t=*a[2][2];
но как в твоем коде - точно не получится.
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

имя массива есть указатель на первый его элемент.

Код: Выделить всё

long a[10][10];
long *ptr = a; // вот вам указатель на массив
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ARV, так я конечно пробовал, но кодвижн отмораживает:
A value of type long[4][20] can't be used to initialize an entity of type 'long *'
С одномерным массивом так проходит, с двумерным почему то нет

adrenocrome, тут можно успешно убрать зведдочку и будет работать))
мне нужн указатель, ибо у меня много массивов, и я хочу сделать массив указателей для их непосредственной адресации
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

BCluster писал(а):ARV, так я конечно пробовал, но кодвижн отмораживает:
A value of type long[4][20] can't be used to initialize an entity of type 'long *'
С одномерным массивом так проходит, с двумерным почему то нет

adrenocrome, тут можно успешно убрать зведдочку и будет работать))
мне нужн указатель, ибо у меня много массивов, и я хочу сделать массив указателей для их непосредственной адресации
И правильно он отмораживает!
Пытаемся указателю присвоить значение массива.
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну так обманите компилятор

Код: Выделить всё

long *ptr = (void*)a;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

adrenocrome писал(а):И правильно он отмораживает!
Пытаемся указателю присвоить значение массива.
в каком это месте? элемент массива обозначается а[1][1], а просто а - указатель.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

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

int a[10];
p=a;
это эквивалентно записи p=&a[0];
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

По непроверенной информации кодвижн не поддерживает указатели на указатели, отсюда и ноги по ходу. Эх.

Как еще можно адресовать кучу массивов, без switch..case?)
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

BCluster писал(а):По непроверенной информации кодвижн не поддерживает указатели на указатели
погодите, вам указатель на массив или указатель на указатель на массив? обратил внимание, что в первом посте у вас long **p определен...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Указатель на двумерный массив можно предстваить массив указателей на строки массива. Я указал long **p для того, чтоб я мог иметь доступ к ячейкам через [][].

Но мне уже чесн гря по боку, как будет, лишь бы было
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

BCluster писал(а):Указатель на двумерный массив можно предстваить массив указателей на строки массива.
хрен там! двумерный массив - это простой одномерный массив, в котором после первой строки следует вторая, потом третья и т.д. на счет того, строка там или столбец - не уверен, но суть такая: просто идущие подряд числа, никаких указателей!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я вообще не понял, что вы там затеваете. нафига такие лыжи - есть массив, ну и обращайтесь к нему, как к массиву. зачем указатели приплетать?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

етсь массивы reg1, reg2, reg3,...... в зависимости от условий нужно использовать разные массивы, если адресовать их по именам - нужно кучу if..else али switch..case, если же сделать массив указателей - все будет просто)

Насчет массивов, вот вырезка из книги
Указатели на многомерные массивы в языке СИ - это массивы массивов, т.е. такие массивы, элементами которых являются массивы. При объявлении таких массивов в памяти компьютера создается несколько различных объектов. Например при выполнении объявления двумерного массива int arr2[4][3] в памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес массива из трех элементов типа int, и, следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Единственное что я могу себе предложить в этом случае, это сделать вместо кучи двумерных массивов один трехмерный)
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

мда. сейчас посимулировал, что-то странно как-то кодвижн с указателями и адресами работает.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Вопщем как то заработали они ) токльо адресовать надо *(w*y+x), а как я хотел не получилося)

но таким образом мне надо знать размерность массива, эт несколько проблематично, но всеж
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Сообщение zebrox »

BCluster писал(а):Как еще можно адресовать кучу массивов, без switch..case?)
Была похожая задачка.
У меня было 80 массивов, разной длинны, в памяти они все друг за дружкой располагались.
Я сделал еще один одномерный массив чаров из 80 ел-м, и в этом массиве храню длины каждого из 80 массивов. Потом получаю указатель на певый массив из 80, и увеличиваю его (указателя) адрес на сумму всех елементов стоящих в массиве длинн перед номером нужного мне массива. Надеюсь понятно объяснил :)

Я думаю что массив указателей делать дороже получится, т.к. указатель вроде два байта занимает, в итоге сделал через доп. массив длинн.
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Возможно и дешевле, только потом я сам не разберусь в своем коде, ну его)
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

BCluster писал(а):По непроверенной информации кодвижн не поддерживает указатели на указатели, отсюда и ноги по ходу.
Почему непроверенная? При попытке передать в функцию указатель на строку двумерного массива, при компиляции, он мне так прямым текстом и написал в ерроре (вольный перевод):
Версия 1.25.5 компилятора CVAVR не поддерживает использование указателя на указатель
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»