Как передать в функцию имя массива?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение 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 (1,8,3,81,5)" передавать уже конкретное имя массива, чтобы в функции LCD_PUTCM его можно было сразу использовать?
Умные книжки читал, в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

hsl писал(а):в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
... а нужно очевидно понять, что такое указатели.
Реклама
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

ChipKiller писал(а):
hsl писал(а):в инете искал, но очевидно я неправильно формулирую вопрос, потому что находится несколько не то что нужно.
... а нужно очевидно понять, что такое указатели.
Согласен, но вот не понимаю на данный момент, чтож тут поделать, ткните плиз в нужное место или подскажите как сделать.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение 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); // печать массива
}
всегда помните, что идентификатор МАССИВА - это УКАЗАТЕЛЬ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

ARV писал(а):всегда помните, что идентификатор МАССИВА - это УКАЗАТЕЛЬ.
На первый элемент массива. :))
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Реклама
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

ARV суть построения Вашей конструкции понятна, и она работает пока "unsigned char massiv..." но если массив "flash unsigned char massiv..." то компилятор ругается на вызов функции в таком видет "function(massiv);"
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

hsl писал(а):ARV суть построения Вашей конструкции понятна, и она работает пока "unsigned char massiv..." но если массив "flash unsigned char massiv..." то компилятор ругается на вызов функции в таком видет "function(massiv);"
Эито значит, что вот здесь:

Код: Выделить всё

void function(unsigned char *m){
Нужно сделать так:

Код: Выделить всё

void function(flash unsigned char *m){
А компилятор правильно ругается, так как это совсем разные области памяти и способы получения конкретного значения разные.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение 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;
    }
}
[url=http:///]:-)[/url]
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

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

РадиоЛоматель с этим

Код: Выделить всё

void function(flash unsigned char *m){
понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
... через указатель можно работать с массивом любой размерности - почитайте книжку по Си и разберитесь, и "загвоздочка" исчезнет.
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

ChipKiller писал(а):
hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
... через указатель можно работать с массивом любой размерности - почитайте книжку по Си и разберитесь, и "загвоздочка" исчезнет.
А я думал, что форумы для того и существуют, когда в книжках что то непонятно, можно живых людей спросить, чтоб на пальцах и конкретной ситуации разъяснили, а по Вашим постам создается весма превратное впечатление, уж не буду описывать какое, не об этом речь, но к счастью есть люди реально помогающие, а не... как Вы, и спасибо им за это.
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

hsl писал(а):понятно, так опят же работает, но опять же загвоздочка, так работает только с одномерными массивами, не подскажите, что нужно еще поправить чтобы работало и с двухмерными массивами?
Двумерных массивов в C нет, есть только массивы указателей на массивы(именно они и объявляются char name[5][5]). Тип элементов массива массивов будет char *(в случае других типов элементов массивов естественно тип будет другой). А сам указатель на этот массив - char ** .

Если хочется всё-таки двумерный массив, то нужно делать одномерный и обращаться к его элементам так: [индекс1*размерность_индекса2+индекс2].
hsl писал(а):А я думал, что форумы для того и существуют, когда в книжках что то непонятно, можно живых людей спросить, чтоб на пальцах и конкретной ситуации разъяснили, а по Вашим постам создается весма превратное впечатление, уж не буду описывать какое, не об этом речь, но к счастью есть люди реально помогающие, а не... как Вы, и спасибо им за это.
Для начала всё равно стоит почитать книжки, а не спрашивать, для того чтобы то что там написано повторили уже на форуме.
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

Murav я читал, может быть не то и не там, но из прочитанного я не понял как сделать конкретный пример...
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Самый простой способ-это получить указатель на первый элемент массива, а потом с этим указателем манипулировать как с одномерным массивом, в котором строки двухмерного составленны одна к другой. Но для этого нужно знать длинну одной строки. Обращатся к элементу [m][n] если длинна строки L нужно будет так: [m*L+n]. Но это слишком просто :))
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
hsl
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс ноя 15, 2009 22:34:49

Сообщение hsl »

Ну вобщем понятно, с двухмерными массивами, которых с C якобы нет, но там куда меня упорно посылали, т.е. в книжку, они как бы есть, но фиг с ними, суть понятна, геморой с ними и по простому не сделать, но все равно спасибо, натолкнули на мысль, переделал массивы в одномерные.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»