реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться massiv[x][y]?
Goodefine
сообщение Jun 9 2009, 14:42
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Я к тому, что решение проблемы автора при обращении к флешевой памяти Вы не показали...


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2009, 14:58
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Goodefine @ Jun 9 2009, 17:42) *
Я к тому, что решение проблемы автора при обращении к флешевой памяти Вы не показали...

Проблемы Автора я не вижу, ну если не считаить проблемой попытку беспорядочного нагромождения всяких выражений. Если Вам удалось понять, в чем проблема - сформулируйте. То, что Автор назвал проблемой
Цитата
Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться massiv[x][y]

Передача указателя на двухмерный массив и работа с ним определяется исключительно возможностями языка не зависит от использования дополнительных атрибутов памяти. Как работать с указателем в таком случае - пример приведен. Дополнительные атрибуты - по вкусу и в соответствии хотя-бы со здравым смыслом.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 9 2009, 15:59
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вопрошающему: посторайтесь понять это и Вы найдёте ответ на свой вопрос...
Код
int *pointers[10]    - это массив указателей
int (*pointer)[10] - это переменная типа указатель на массив из десяти интов
double (*sum(double,double))[3] - функция sum возвращает указатель на массив из 3 даблов


to defunct: первые два совершенно разные типы. Вот пример их использования:
Код
pointers[0] = NULL;
*pointer[0] = 10;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 9 2009, 16:19
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Уважаемый коллега zltigo привел пример не совсем того, про что спрашивал автор топика. Он ведь хотел иметь внутри структуры указатель на двумерный массив.

Посему, привожу изменненный вариант:

Код
typedef struct {
int (*pdm)[8];
} dm_t;

int dm[8][8];

int test(dm_t *dm_ptr)
{
   printf("size pdm = %d\n", sizeof(dm_ptr->pdm));
   return(dm_ptr->pdm[3][3] );
}

dm_t  mm;
int main(int argc, char *argv[])
{
     int i = 8;
     dm[3][3] = 5;
     mm.pdm = &dm[8];
     i = test(&mm);
     printf("i = %d\n", i);
     return 1;
}
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 9 2009, 16:31
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Простите, но зачем городить структуру? Автор спрашивал как объявить указатель на массив, если он конечно именно этого хочет...
Тогда путь только один:
объявите свой тип - указатель на двумерный массив из[5][4] элементов
Код
typedef int (*pointer_to_array_5_4_t)[5][4];

И используйте его по прямому назначению! И даже делайте его членом структуры.
Код
int array[5][4] = {{0}};
pointer_to_array_5_4_t ptr = &array;
*ptr[0][0] = 33;
Когда что-либо трудно понять/написать всегда на помощь приходит typedef...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 9 2009, 16:58
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(demiurg_spb @ Jun 9 2009, 19:31) *
Автор спрашивал как объявить указатель на массив, если он конечно именно этого хочет...

да-да... если...
Автор еще с flash тыкался, а указатель во флэшевой структуре на флэшевый массив ... мне как-то непонятно, зачем нужен.
Пора уже не автору народ экзаменовать, а нам его. Пусть скажет словами, чего хочет biggrin.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2009, 17:26
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(demiurg_spb @ Jun 9 2009, 19:31) *
Простите, но зачем городить структуру?

Если это вопрос ко мне, то, потому, что Автор городил структуру, я полагал, что посеченная до вырожденого варианта структура приведена Автором для примера. Тем паче, что в обрывках приведенных текстов встречается поминание и других элементов некой структуры.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 9 2009, 18:09
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Dog Pawlowa @ Jun 9 2009, 20:58) *
... указатель во флэшевой структуре на флэшевый массив ... мне как-то непонятно, зачем нужен.
Очень даже нужен. Например структуры для меню. Массивы из указателей на структуры тоже логично держать в ПЗУ. У меня так реализовано, так что задачки могут быть очень и очень разными и интереснымиsmile.gif
To zltigo: да вопрос был к Вам. Я понял что Вы имели ввиду...

Цитата(Dog Pawlowa @ Jun 9 2009, 20:58) *
Пусть скажет словами, чего хочет biggrin.gif
Да этого точно не хватает.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2009, 18:32
Сообщение #24


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demiurg_spb @ Jun 9 2009, 18:59) *
to defunct: первые два совершенно разные типы. Вот пример их использования:
Код
pointers[0] = NULL;
*pointer[0] = 10;

Да как говорится что-то в глаз попало написал фигню, которую сразу же и удалил. (у Вас быстрая реакция smile.gif )
Конечно же это абсолютно два разных типа.

Пример использования правда не очень очевиден, т.к. нам ничто не мешает сделать:
*pointers[ 0 ] = 10;
*pointer[ 0 ] = 10;

Вот так будет более наглядно -

sizeof ( pointers ) != sizeof( pointer )
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 9 2009, 19:31
Сообщение #25


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ Jun 9 2009, 22:32) *
нам ничто не мешает сделать:
*pointers[ 0 ] = 10;
*pointer[ 0 ] = 10;
Да, но смысл уже будет другой. Я привёл пример доступа к элементу массива с индексом 0 в обоих случаях.
А пример с sizeof тоже весьма показателен.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2009, 21:23
Сообщение #26


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demiurg_spb @ Jun 9 2009, 22:31) *
Да, но смысл уже будет другой. Я привёл пример доступа к элементу массива с индексом 0 в обоих случаях.

вот потому пример и неочевиден.
К элементу массива я например привык обращаться как arr[x]; а не как *arr[ x];

Цитата
А пример с sizeof тоже весьма показателен.

угу, сразу видно что
sizeof( pointer ) == sizeof( PVOID)
sizeof(pointers ) == 10 * sizeof( PVOID)
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 10 2009, 08:36
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



name=' date='Jun 9 2009, 19:19' post='604857'

Спасибо sergeeff, ваш вариант именно то что я хотел получить.
Переделал его на свой лад. Получилось то что написано ниже.

Код
#define max_size 5
unsigned int __flash Program1[max_size][4]=
{
   {1,1,1,1},
   {2,2,2,2},
   {3,3,3,3}
};

//массив второй программы из 5ти действий
unsigned int __flash Program2[max_size][4]=
{
   {7,7,7,7},
   {8,8,8,8},
   {9,9,9,9},
   {11,11,11,11},
   {44,44,44,44}
};

//структура управления программой
typedef struct {
unsigned int __flash (*program)[max_size];
} stProgram;

stProgram Program;

//процедура инициализации структуры управления
void SetProgram(unsigned int __flash (*addr)[])
{
  Program.program = addr;
}


void main(void)
{
//настройка программы
SetProgram(&Program1[0]);

//основной цикл программы
for(;;);
}


Теперь можно обращаться к элементам программы через указатель Program.program просто переберая индексы
Program.program[1][0], Program.program[2][1] и т.д.

Но есть ньюансы.
Во-первых размер возможных программ всегда должен быть максимальный (max_size).
Во-вторых код компилируется только в режиме С.
В режиме Embedded C++ выскакивает ошибка на процедуру инициализации программы
Код
void SetProgram(unsigned int __flash (*addr)[])
Error[Pe615]: parameter type involves pointer to array of unknown bound
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 10 2009, 09:16
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(mempfis_ @ Jun 10 2009, 11:36) *
Переделал его на свой лад.

Еще раз пройтись и поубирать, например, круглые скобки неведомо зачем напиханные и почитать, как в С++ (а не C ) осуществляется передача параметров по ссылке и значению.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 10 2009, 09:19
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(mempfis_ @ Jun 10 2009, 11:36) *
Но есть ньюансы.
Во-первых размер возможных программ всегда должен быть максимальный (max_size).

А о ньюансах говорилось? smile.gif

1) Если программа - это набор переменного количества наборов данных, то и организовывать данные целесообразно в соответствии с иерархией.
То есть array[4] - это один набор данных, а программа будет содержать массив указателей на эти наборы. Тогда эти наборы и повторяться могут, т.е. экономия места.

2) Можно кодировать последний набор данных в программе. Тогда все наборы расположить в линейный массив, а программа будет описываться указателем на первого набора данных этой программы в полном массиве наборов(или индексом в массиве). Тут экономия сложности smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 10 2009, 09:34
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Открою великую тайну rolleyes.gif - как сделать из массива (любого) тип, который можно будет написать в параметрах функции (например).
Берем исходное определение переменной -
Код
unsigned int __flash Program1[5][4] = {...}

Меняем имя переменной на тип, удаляем = и всё после него и пишем typedef вначале, все
Код
typedef unsigned int __flash ProgramType[5][4];

Используем
Код
void func(ProgramType my_var) {...}
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 14:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016