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

 
 
> Двумерный массив и указатель на него, Как объявить чтобы можно было обращаться 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
 
Start new topic
Ответов
sergeeff
сообщение Jun 9 2009, 16:19
Сообщение #2


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

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


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

Группа: Свой
Сообщений: 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
ReAl
сообщение Jun 10 2009, 10:23
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

И первое и второе неверно.
Код
#include <iostream>

unsigned int Program1[][4]=
{
   {1,1,1,1},
   {2,2,2,2},
   {3,3,3,3}
};

unsigned int Program2[][4]=
{
   {7,7,7,7},
   {8,8,8,8},
   {9,9,9,9},
   {11,11,11,11},
   {44,44,44,44}
};


void foo( const char *header, unsigned int pgm[][4], int size)
{
    std::cout << "======== " << header << "[" << size << "]" << std::endl;
    for( int i=0; i < size; ++i)
        std::cout << pgm[i][0] << ", " << pgm[i][1] << ", " << pgm[i][2] << ", " << pgm[i][3] << std::endl;
    std::cout << std::endl;
}

#define CALL_FOO(array) foo( #array, array, sizeof(array) / sizeof(array[0]) )

int main()
{
    CALL_FOO(Program1);
    CALL_FOO(Program2);
}

Код
gcc -Os -s foo.cpp -o foo.exe
foo.exe >foo.txt

Код
======== Program1[3]
1, 1, 1, 1
2, 2, 2, 2
3, 3, 3, 3

======== Program2[5]
7, 7, 7, 7
8, 8, 8, 8
9, 9, 9, 9
11, 11, 11, 11
44, 44, 44, 44


В смысле размер может быть переменным, но его надо или отдельно передать, или ограничить признаком, скажем, в реальной программе не бывает отрицательных чисел, тогда так
Код
unsigned int Program2[][4]=
{
   {7,7,7,7},
   {8,8,8,8},
   {9,9,9,9},
   {11,11,11,11},
   {44,44,44,44},
   {-1,-1,-1,-1}  // ограничитель и в цикле идти до него, а не по счётчику
};


Кстати, прототип функции С/С++ воспринимают как
Код
void foo(const char*, unsigned int (*)[4], int)

т.е. как функцию, принимающую указатель на 4-интовые массивы.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Wano
сообщение Jun 13 2009, 21:13
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



ЫЫЫЫЫ чего-то не катит

typedef char TypeD[5][5];

char array[5][5];

void func(TypeD * temp){
*temp[1][0]=5;//лезет не в &array+5 ,а в &array+25
}

int main (void)
{
func(&array);
return 0;
}

В disassembly видно что забит сдвиг от начала массива не на пять байт ,а на 25. Всё щастье пашет только на диапазоне *temp[0][0]....*temp[0][4] sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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
|- - 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
|- - 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
- - XVR   Открою великую тайну - как сделать из массива (л...   Jun 10 2009, 09:34
|- - defunct   Цитата(XVR @ Jun 10 2009, 12:34) Открою в...   Jun 14 2009, 03:07
|- - Wano   не рычите люди. С тем, что через void* можно броси...   Jun 14 2009, 09:16
|- - Dog Pawlowa   Цитата(Wano @ Jun 14 2009, 12:16) ...Дайт...   Jun 14 2009, 09:39
|- - Wano   Конкретней : получаем в функции указатель: void f...   Jun 14 2009, 10:04
|- - AHTOXA   Цитата(Wano @ Jun 14 2009, 16:04) Вопрос:...   Jun 14 2009, 10:12
||- - sergeeff   Цитата(AHTOXA @ Jun 14 2009, 14:12) Потом...   Jun 14 2009, 10:31
|- - Сергей Борщ   Цитата(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


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 17:17
Рейтинг@Mail.ru


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