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

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


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

Группа: Свой
Сообщений: 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 **"
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 9 2009, 12:33
Сообщение #2


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(mempfis_ @ Jun 9 2009, 16:23) *
unsigned int __flash **program;//указатель на текущую исполняемую программу

**program - это указатель ня ячейку памяти, в которой хранится другой указатель. Двумерные массивы так не передают.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2009, 12:43
Сообщение #3


Гуру
******

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



Цитата(mempfis_ @ Jun 9 2009, 15:23) *
Чтото не могу понять как правильно объявить указатель на двумерный массив....

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 9 2009, 12:56
Сообщение #4


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

Группа: Свой
Сообщений: 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) ?
Для наглядности и простоты понимания программы хочу сделать обращение именно таким образом.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 9 2009, 13:03
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(mempfis_ @ Jun 9 2009, 16:56) *
Как наиболее просто обращаться к элементам массива через Program.program[0][1] а не *(Program.program*0+1) ?

Так прямо так и обращаться.
Program.program[0][1] = ...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 9 2009, 13:23
Сообщение #6


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

Группа: Свой
Сообщений: 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)
воспринимает нормально.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2009, 13:27
Сообщение #7


Гуру
******

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



Цитата(mempfis_ @ Jun 9 2009, 16:23) *
компилятор выдаёт ошибку:

Естественно. Вы-же УКАЗАТЕЛЬ передали. Вот он Вам черным по белому и пишет.
Program->program[][]


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 9 2009, 13:35
Сообщение #8


Местный
***

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



А чего бы в таком виде не сделать:
Код
value_from_array=array_access(Program.program,x,y);

Все довольно прозрачно...


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


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

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



Цитата(Goodefine @ Jun 9 2009, 16:35) *
А чего бы в таком виде не сделать:
Код
value_from_array=array_access(Program.program,x,y);

Все довольно прозрачно...


Это отдельная фукция которую не хотелось-бы вводить (да и нет смысла её вводить если можно достучаться через *(......)).
К сожалению через -> тоже не работает.
Приду домой почитаю в книге как это можно сделать (жаль на работе её нет, так хотелось до конца рабочего дня разобраться с этим вопросом).
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 9 2009, 13:50
Сообщение #10


Местный
***

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



Цитата(mempfis_ @ Jun 9 2009, 16:46) *
да и нет смысла её вводить если можно достучаться через *(......)).
К сожалению через -> тоже не работает.

У меня подозрение, что достучаться как
Код
Program->program[x][y]

Вы сможете на плюсах. В обычном Си компиляторе это не проходит...


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


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

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



Код
Вы сможете на плюсах. В обычном Си компиляторе это не проходит...

Всегда в настройках проекта ставлю Embedded C++.
Компилятор IAR 5.10
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2009, 14:23
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2009, 14:29
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 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)
выгоднее применить массив структур вместо многомерного массива?
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Jun 9 2009, 14:34
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 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


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


Гуру
******

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



Цитата(Goodefine @ Jun 9 2009, 17:34) *
и Ричи скажет вам:

Ну-ка двайте сюда место, где про __flash у Ритчи говорится smile.gif. А заодно расскажите как там Страутструп разруливает эту проблему smile.gif smile.gif. Ну а лучше почитайте документацию на компилятор, как и для чего __flash пользоваться.
Код
typedef __flash struct {
int dm[8][8];
} dm_t;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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