Страница 1 из 1
Как передать в функцию имя массива?
Добавлено: Вс мар 06, 2011 12:56:19
hsl
Доброго времени суток!
Помогите пожалуйста найти решение.
Исходные данные, программа для МК ATmega32, на С в CodevisionAVR.
Есть некоторое количество массивов такого вида
Код: Выделить всё
flash unsigned char massiv_1[6][84]= ...
flash unsigned char massiv_2[6][80]= ...
flash unsigned char massiv_3[3][40]= ...
Есть функция которая выводит эти массивы на дисплей
Код: Выделить всё
void LCD_PUTCM(byte x, byte y, unsigned char mass_name, unsigned char mass_str, unsigned char mass_stb)
{
byte i;
byte k;
for (k=0; k<=mass_stb; k++)
{
for(i=0; i<=mass_str; i++)
{
if (mass_name==1){LCD_PUT_BYTE(x+i, y, massiv_1[k][i]);};
if (mass_name==2){LCD_PUT_BYTE(x+i, y, massiv_2[k][i]);};
if (mass_name==3){LCD_PUT_BYTE(x+i, y, massiv_3[k][i]);};
.......
}
y+=8;
}
}
Ну а в программе собственно это дело вызывается так
Оно работает конечно, но сделано несколько коряво, по другому пока не получилось.
Подскажите пожалуйста как сделать так, чтобы в этой строке "LCD_PUTCM (1,8,3,81,5)" передавать уже конкретное имя массива, чтобы в функции LCD_PUTCM его можно было сразу использовать?
Умные книжки читал, в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
Re: Как передать в функцию имя массива?
Добавлено: Вс мар 06, 2011 13:01:32
ChipKiller
hsl писал(а):в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
... а нужно очевидно понять, что такое указатели.
Re: Как передать в функцию имя массива?
Добавлено: Вс мар 06, 2011 21:31:19
hsl
ChipKiller писал(а):hsl писал(а):в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
... а нужно очевидно понять, что такое указатели.
Согласен, но вот не понимаю на данный момент, чтож тут поделать, ткните плиз в нужное место или подскажите как сделать.
Re: Как передать в функцию имя массива?
Добавлено: Вс мар 06, 2011 21:39:47
ARV
я не очень вникал, что у вас делают все параметры функции, поэтому дам такой намек - дальше сами
Код: Выделить всё
#define CNT 6
unsigned char massiv[CNT] = {1,2,3,4,5,6};
// функция печати массива
void function(unsigned char *m){
unsigned char i;
for(i=0; i< CNT; i++)
printf("%i ", m[i]);
}
int main(void){
function(massiv); // печать массива
}
всегда помните, что идентификатор МАССИВА - это УКАЗАТЕЛЬ.
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 14:53:14
РадиоЛоматель
ARV писал(а):всегда помните, что идентификатор МАССИВА - это УКАЗАТЕЛЬ.
На первый элемент массива.

Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 14:55:13
hsl
ARV суть построения Вашей конструкции понятна, и она работает пока "unsigned char massiv..." но если массив "flash unsigned char massiv..." то компилятор ругается на вызов функции в таком видет "function(massiv);"
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 15:12:04
РадиоЛоматель
hsl писал(а):ARV суть построения Вашей конструкции понятна, и она работает пока "unsigned char massiv..." но если массив "flash unsigned char massiv..." то компилятор ругается на вызов функции в таком видет "function(massiv);"
Эито значит, что вот здесь:
Нужно сделать так:
А компилятор правильно ругается, так как это совсем разные области памяти и способы получения конкретного значения разные.
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 16:36:45
svd71
а не проще ли было сделать все в одном массиве:
Код: Выделить всё
flash unsigned char massiv[3][6][84]= ...
void LCD_PUTCM(byte x, byte y, unsigned char mass_name, unsigned char mass_str, unsigned char mass_stb)
{
//byte i;
byte k;
for (k=0; k<=mass_stb; k++)
{
//for(i=0; i<=mass_str; i++)
//{
LCD_PUT_BYTE(x+mass_name, y, massiv[mass_name][k][i]);
.......
//}
y+=8;
}
}
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 17:00:49
hsl
svd71 трехмерный массив, как я понимаю сделать не получится, опять же как я понимаю, в трех мерном массиве вторая и третья размерености должны быть всегда одинаковыми, в моем же случае массивы разные, что собственно видно из куска кода приложенного вначале.
РадиоЛоматель с этим
понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 17:30:57
ChipKiller
hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
... через указатель можно работать с массивом любой размерности - почитайте книжку по Си и разберитесь, и "загвоздочка" исчезнет.
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 18:40:40
hsl
ChipKiller писал(а):hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
... через указатель можно работать с массивом любой размерности - почитайте книжку по Си и разберитесь, и "загвоздочка" исчезнет.
А я думал, что форумы для того и существуют, когда в книжках что то непонятно, можно живых людей спросить, чтоб на пальцах и конкретной ситуации разъяснили, а по Вашим постам создается весма превратное впечатление, уж не буду описывать какое, не об этом речь, но к счастью есть люди реально помогающие, а не... как Вы, и спасибо им за это.
Re: Как передать в функцию имя массива?
Добавлено: Пн мар 07, 2011 22:27:29
Murav
hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
Двумерных массивов в C нет, есть только массивы указателей на массивы(именно они и объявляются char name[5][5]). Тип элементов массива массивов будет char *(в случае других типов элементов массивов естественно тип будет другой). А сам указатель на этот массив - char ** .
Если хочется всё-таки двумерный массив, то нужно делать одномерный и обращаться к его элементам так: [индекс1*размерность_индекса2+индекс2].
hsl писал(а):А я думал, что форумы для того и существуют, когда в книжках что то непонятно, можно живых людей спросить, чтоб на пальцах и конкретной ситуации разъяснили, а по Вашим постам создается весма превратное впечатление, уж не буду описывать какое, не об этом речь, но к счастью есть люди реально помогающие, а не... как Вы, и спасибо им за это.
Для начала всё равно стоит почитать книжки, а не спрашивать, для того чтобы то что там написано повторили уже на форуме.
Re: Как передать в функцию имя массива?
Добавлено: Вт мар 08, 2011 00:42:28
hsl
Murav я читал, может быть не то и не там, но из прочитанного я не понял как сделать конкретный пример...
Re: Как передать в функцию имя массива?
Добавлено: Вт мар 08, 2011 02:44:59
РадиоЛоматель
Самый простой способ-это получить указатель на первый элемент массива, а потом с этим указателем манипулировать как с одномерным массивом, в котором строки двухмерного составленны одна к другой. Но для этого нужно знать длинну одной строки. Обращатся к элементу [m][n] если длинна строки L нужно будет так: [m*L+n]. Но это слишком просто

Re: Как передать в функцию имя массива?
Добавлено: Вт мар 08, 2011 15:59:47
hsl
Ну вобщем понятно, с двухмерными массивами, которых с C якобы нет, но там куда меня упорно посылали, т.е. в книжку, они как бы есть, но фиг с ними, суть понятна, геморой с ними и по простому не сделать, но все равно спасибо, натолкнули на мысль, переделал массивы в одномерные.