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

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

|
Добрый день. Чтото не могу понять как правильно объявить указатель на двумерный массив чтобы компилятор не ругался. Есть такой массив: Код [b]unsigned int [/b] [i]__flash[/i] Program1[5][4] = { {0,0,0,0}, {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4} } И есть некая структура управления в которой хочу создать указатель на этот двумерный массив: Код typedef struct { unsigned int __flash **program;//указатель на текущую исполняемую программу } stProgram;
stProgram Program; //экземпляр структуры Стоит задача сделать так чтобы используя указатель Program.program обращаться к двумерному массиву наиболее понятным образом Program.program[0][1] (без использования * и всяких смещений) Определил функцию инициализации масива Код void SetProgram(unsigned int __flash **program_addr) { Program.program = program_addr; } Компилятор ругается на вызов этой функции: Код SetProgram(&Program1[0][0]); Цитата Error[Pe167]: argument of type "unsigned int __flash (*)[4]" is incompatible with parameter of type "unsigned int __flash **"
|
|
|
|
|
 |
Ответов
|
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) {...}
|
|
|
|
|
Jun 14 2009, 03:07
|

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

|
Цитата(XVR @ Jun 10 2009, 12:34)  Открою великую тайну  - как сделать из массива (любого) тип, который можно будет написать в параметрах функции (например). еще проще - написать по вкусу PVOID или PCHAR Цитата(sergeeff @ Jun 14 2009, 03:16)  Не очень изящно на С получается, перейдите на С++, сделайте себе объект - n-мерный массив (примеров - полно), Не будет изящной реализации на любом языке, когда выбран КРИВОЙ алгоритм решения задачи изначально. описать действия можно и в одномерном массиве, причем прекрасно читаемо: Код int Program_1[] = { /* step1 */ 1, 1, 1, 1, 1, 1, 1, 0, /* step2 */ 2, 2, 2, 0, /* step3 */ 3, 3, 3, 3, 3, 0, /* step4 */ 4, 4, 4, 4, 4, 0, /* step5 */ 5, 5, 0, /* end */ 0 };
int Program_2[] = { /* step1 */ 11, 11, 11, 0, /* step2 */ 44, 44, 44, 44, 0, /* end */ 0 };
int *Programs[] = { Program_1, Program_2 ... }; ; где каждый "step" может быть любой длины и отделен от остальных 0-терминатором. конец программы - step начинающийся с терминатора. далее пишем функцию для поиска очередного "step'a": Код int *FindStep( int *program, int StepId ) { if (!*program) return NULL;
while (StepId) { if (!*program++) if (!*program) return NULL; else StepId--; } return program; } Ну а потом уже и DoProgram c DoStep'ом Код DoStep( int *step) { while( *step ) { ... // делаем что надо step++ } }
DoProgram( int *program) { do { DoStep( program ) } while ( program = FindStep( program, 1 ) ); } работаем с этим как: DoProgram( Programs[ x ] );
|
|
|
|
|
Jun 14 2009, 09:39
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Wano @ Jun 14 2009, 12:16)  ...Дайте ответ на вопрос: Можно ли элементарно преобразовать указатель чего угодно, переданный в функцию, к виду [][] , а не работать со сдвигами? Зная размерность. И не трогать при это с++. ... Сдвиги то откуда взялись? И вообще - Вам шашечки (двумерный массив) или ехать (управление по программе). Если все-таки ехать, то defunct все подробно описал, когда я поленился.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 14 2009, 10:12
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Wano @ Jun 14 2009, 16:04)  Вопрос: почему, если : *(c_Uk+2)=5; и c_Uk[2]=5; синонимы, то не проходят коснтрукции типа c_Uk[1][1]=5; Потому что неизвестна первая размерность массива. Можно вот так: Код typedef char TMatrix5[][5];
TMatrix5 m5_1 = { {1,2,3,4,5}, {11,12,13,14,15}, {21,22,23,24,25}, {31,32,33,34,35}, };
char * chars = "12345678901234567890";
void test2(void * pv) { TMatrix5 * m5 = pv; (*m5)[1][2] = 3; }
int main(void) { test2(chars); }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
mempfis_ Двумерный массив и указатель на него Jun 9 2009, 12:23 777777 Цитата(mempfis_ @ Jun 9 2009, 16:23) unsi... Jun 9 2009, 12:33 zltigo Цитата(mempfis_ @ Jun 9 2009, 15:23) Чтот... Jun 9 2009, 12:43 mempfis_ Хорошо предположим я объявлю функцию с указателем ... Jun 9 2009, 12:56  MrYuran Цитата(mempfis_ @ Jun 9 2009, 16:56) Как ... Jun 9 2009, 13:03   mempfis_ ЦитатаТак прямо так и обращаться.
Program.program[... Jun 9 2009, 13:23    zltigo Цитата(mempfis_ @ Jun 9 2009, 16:23) комп... Jun 9 2009, 13:27    defunct Цитата(mempfis_ @ Jun 9 2009, 16:23) Так ... Jun 9 2009, 14:29 Goodefine А чего бы в таком виде не сделать:
Кодvalue_from_a... Jun 9 2009, 13:35 mempfis_ Цитата(Goodefine @ Jun 9 2009, 16:35) А ч... Jun 9 2009, 13:46  zltigo Цитата(mempfis_ @ Jun 9 2009, 16:46) К со... Jun 9 2009, 14:23 Goodefine Цитата(mempfis_ @ Jun 9 2009, 16:46) да и... Jun 9 2009, 13:50 mempfis_ КодВы сможете на плюсах. В обычном Си компиляторе ... Jun 9 2009, 13:58 Goodefine Цитата(zltigo @ Jun 9 2009, 17:23) Глупос... Jun 9 2009, 14:34 zltigo Цитата(Goodefine @ Jun 9 2009, 17:34) и Р... Jun 9 2009, 14:39  demiurg_spb Вопрошающему: посторайтесь понять это и Вы найдёте... Jun 9 2009, 15:59   defunct Цитата(demiurg_spb @ Jun 9 2009, 18:59) t... Jun 9 2009, 18:32    demiurg_spb Цитата(defunct @ Jun 9 2009, 22:32) нам н... Jun 9 2009, 19:31     defunct Цитата(demiurg_spb @ Jun 9 2009, 22:31) Д... Jun 9 2009, 21:23 Goodefine Я к тому, что решение проблемы автора при обращен... Jun 9 2009, 14:42 zltigo Цитата(Goodefine @ Jun 9 2009, 17:42) Я ... Jun 9 2009, 14:58 sergeeff Уважаемый коллега zltigo привел пример не совсем т... Jun 9 2009, 16:19 demiurg_spb Простите, но зачем городить структуру? Автор спраш... Jun 9 2009, 16:31  Dog Pawlowa Цитата(demiurg_spb @ Jun 9 2009, 19:31) А... Jun 9 2009, 16:58   demiurg_spb Цитата(Dog Pawlowa @ Jun 9 2009, 20:58) .... Jun 9 2009, 18:09  zltigo Цитата(demiurg_spb @ Jun 9 2009, 19:31) П... Jun 9 2009, 17:26 mempfis_ name=' date='Jun 9 2009, 19:19' post=... Jun 10 2009, 08:36  zltigo Цитата(mempfis_ @ Jun 10 2009, 11:36) Пер... Jun 10 2009, 09:16  Dog Pawlowa Цитата(mempfis_ @ Jun 10 2009, 11:36) Но ... Jun 10 2009, 09:19  ReAl Цитата(mempfis_ @ Jun 10 2009, 11:36) Во-... Jun 10 2009, 10:23   Wano ЫЫЫЫЫ чего-то не катит
typedef char TypeD[5][5]... Jun 13 2009, 21:13    AHTOXA Цитата(Wano @ Jun 14 2009, 03:13) ЫЫЫЫЫ ч... Jun 13 2009, 21:21    ReAl RE: Двумерный массив и указатель на него Jun 13 2009, 23:07     Wano Кодvoid func( unsigned size_y, unsigned size_x... Jun 13 2009, 23:44    XVR Цитата(Wano @ Jun 14 2009, 01:13) ЫЫЫЫЫ ч... Jun 15 2009, 09:18     sergeeff Цитата(XVR @ Jun 15 2009, 12:18) Мдя. Вы ... Jun 15 2009, 09:24      AHTOXA Цитата(sergeeff @ Jun 15 2009, 15:24) Зат... Jun 15 2009, 09:54     Сергей Борщ Цитата(Wano @ Jun 14 2009, 13:04) то не п... Jun 14 2009, 10:16      Wano Цитата(Сергей Борщ @ Jun 14 2009, 13:16) ... Jun 14 2009, 10:34       sergeeff Цитата(Wano @ Jun 14 2009, 14:34) если за... Jun 14 2009, 10:51        Wano Цитата(sergeeff @ Jun 14 2009, 13:51) Жут... Jun 14 2009, 10:56         sergeeff Цитата(Wano @ Jun 14 2009, 14:56) как пос... Jun 14 2009, 11:11         Сергей Борщ Цитата(Wano @ Jun 14 2009, 13:56) как пос... Jun 14 2009, 11:33          Wano Ладно шариться по массиву можно хорошо и так:
void... Jun 14 2009, 12:48           ReAl Цитата(Wano @ Jun 14 2009, 15:48) uint8_t... Jun 14 2009, 14:20            aaarrr Цитата(ReAl @ Jun 14 2009, 18:20) По пово... Jun 14 2009, 16:07           Сергей Борщ Цитата(Wano @ Jun 14 2009, 15:48) мне хот... Jun 14 2009, 16:33 sergeeff Да, блин! Все рассказали, объяснили, примеры п... Jun 14 2009, 00:16 sergeeff Не хочет народ читать книги отцов-основателей.
Дл... Jun 14 2009, 10:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|