|
|
  |
Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться 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 9 2009, 12:56
|

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

|
Хорошо предположим я объявлю функцию с указателем на нулевой элемент массива Код typedef struct { unsigned int __flash *program;//указатель на текущую исполняемую программу } stProgram;
stProgram Program; //экземпляр структуры void SetProgram(unsigned int __flash *program_addr) { Program.program = program_addr; } Как наиболее просто обращаться к элементам массива через Program.program[0][1] а не *(Program.program*0+1) ? Для наглядности и простоты понимания программы хочу сделать обращение именно таким образом.
|
|
|
|
|
Jun 9 2009, 13:23
|

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

|
Цитата Так прямо так и обращаться. Program.program[0][1] = ... Так не хочет. На строчку Код Program.size = Program.program[Program.step_index][size_id] компилятор выдаёт ошибку: Цитата Error[Pe142]: expression must have pointer-to-object type А строчку Код Program.size = *(Program.program+4*Program.step_index+size_id) воспринимает нормально.
|
|
|
|
|
Jun 9 2009, 13:35
|

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

|
А чего бы в таком виде не сделать: Код value_from_array=array_access(Program.program,x,y); Все довольно прозрачно...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Jun 9 2009, 13:46
|

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

|
Цитата(Goodefine @ Jun 9 2009, 16:35)  А чего бы в таком виде не сделать: Код value_from_array=array_access(Program.program,x,y); Все довольно прозрачно... Это отдельная фукция которую не хотелось-бы вводить (да и нет смысла её вводить если можно достучаться через *(......)). К сожалению через -> тоже не работает. Приду домой почитаю в книге как это можно сделать (жаль на работе её нет, так хотелось до конца рабочего дня разобраться с этим вопросом).
|
|
|
|
|
Jun 9 2009, 13:50
|

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

|
Цитата(mempfis_ @ Jun 9 2009, 16:46)  да и нет смысла её вводить если можно достучаться через *(......)). К сожалению через -> тоже не работает. У меня подозрение, что достучаться как Код Program->program[x][y] Вы сможете на плюсах. В обычном Си компиляторе это не проходит...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Jun 9 2009, 14:23
|

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

|
Цитата(mempfis_ @ Jun 9 2009, 16:46)  К сожалению через -> тоже не работает. Глупости. Вы пишите, что попало и получаете какие попало ошибки. Код typedef struct { int dm[8][8]; } dm_t;
dm_t mm;
int test( dm_t *dm_ptr ) { return( dm_ptr->dm[3][3] ); }
void xmain(void) { test( &mm ); } И не рассказывайте о том, что компилятор чего-то не понял. Цитата(Goodefine @ Jun 9 2009, 16:50)  У меня подозрение, что достучаться как Код Program->program[x][y] Вы сможете на плюсах. В обычном Си компиляторе это не проходит... Ой! Рассажите об этом Ритчи....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 9 2009, 14:29
|

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

|
Цитата(mempfis_ @ Jun 9 2009, 16:23)  Так не хочет. На строчку Код Program.size = Program.program[Program.step_index][size_id] компилятор выдаёт ошибку: Может для такого пользования (где есть некий size_id, и думаю еще какие-то другие id) выгоднее применить массив структур вместо многомерного массива?
|
|
|
|
|
Jun 9 2009, 14:34
|

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

|
Цитата(zltigo @ Jun 9 2009, 17:23)  Глупости. Вы пишите, что попало и получаете какие попало ошибки. Код typedef struct { int dm[8][8]; } dm_t; Ой! Рассажите об этом Ритчи.... А теперь добавьте волшебное слово __flash Код typedef struct { int __flash dm[8][8]; } dm_t; и Ритчи расскажет Вам: Цитата Error: ... storage modifier not allowed in this context
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|