|
|
  |
Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться massiv[x][y]? |
|
|
|
Jun 9 2009, 14:58
|

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

|
Цитата(Goodefine @ Jun 9 2009, 17:42)  Я к тому, что решение проблемы автора при обращении к флешевой памяти Вы не показали... Проблемы Автора я не вижу, ну если не считаить проблемой попытку беспорядочного нагромождения всяких выражений. Если Вам удалось понять, в чем проблема - сформулируйте. То, что Автор назвал проблемой Цитата Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться massiv[x][y] Передача указателя на двухмерный массив и работа с ним определяется исключительно возможностями языка не зависит от использования дополнительных атрибутов памяти. Как работать с указателем в таком случае - пример приведен. Дополнительные атрибуты - по вкусу и в соответствии хотя-бы со здравым смыслом.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 9 2009, 15:59
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 9 2009, 16: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; }
|
|
|
|
|
Jun 9 2009, 16:31
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 9 2009, 16:58
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(demiurg_spb @ Jun 9 2009, 19:31)  Автор спрашивал как объявить указатель на массив, если он конечно именно этого хочет... да-да... если... Автор еще с flash тыкался, а указатель во флэшевой структуре на флэшевый массив ... мне как-то непонятно, зачем нужен. Пора уже не автору народ экзаменовать, а нам его. Пусть скажет словами, чего хочет
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 9 2009, 17:26
|

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

|
Цитата(demiurg_spb @ Jun 9 2009, 19:31)  Простите, но зачем городить структуру? Если это вопрос ко мне, то, потому, что Автор городил структуру, я полагал, что посеченная до вырожденого варианта структура приведена Автором для примера. Тем паче, что в обрывках приведенных текстов встречается поминание и других элементов некой структуры.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 9 2009, 18:09
|

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

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

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

|
Цитата(demiurg_spb @ Jun 9 2009, 18:59)  to defunct: первые два совершенно разные типы. Вот пример их использования: Код pointers[0] = NULL; *pointer[0] = 10; Да как говорится что-то в глаз попало написал фигню, которую сразу же и удалил. (у Вас быстрая реакция  ) Конечно же это абсолютно два разных типа. Пример использования правда не очень очевиден, т.к. нам ничто не мешает сделать: *pointers[ 0 ] = 10; *pointer[ 0 ] = 10; Вот так будет более наглядно - sizeof ( pointers ) != sizeof( pointer )
|
|
|
|
|
Jun 9 2009, 21:23
|

кекс
     
Группа: Свой
Сообщений: 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)
|
|
|
|
|
Jun 10 2009, 08:36
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 10 2009, 09:19
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(mempfis_ @ Jun 10 2009, 11:36)  Но есть ньюансы. Во-первых размер возможных программ всегда должен быть максимальный (max_size). А о ньюансах говорилось?  1) Если программа - это набор переменного количества наборов данных, то и организовывать данные целесообразно в соответствии с иерархией. То есть array[4] - это один набор данных, а программа будет содержать массив указателей на эти наборы. Тогда эти наборы и повторяться могут, т.е. экономия места. 2) Можно кодировать последний набор данных в программе. Тогда все наборы расположить в линейный массив, а программа будет описываться указателем на первого набора данных этой программы в полном массиве наборов(или индексом в массиве). Тут экономия сложности
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 10 2009, 09:34
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Открою великую тайну  - как сделать из массива (любого) тип, который можно будет написать в параметрах функции (например). Берем исходное определение переменной - Код unsigned int __flash Program1[5][4] = {...} Меняем имя переменной на тип, удаляем = и всё после него и пишем typedef вначале, все Код typedef unsigned int __flash ProgramType[5][4]; Используем Код void func(ProgramType my_var) {...}
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|