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

 
 
> Вопрос по размеру массива
Vladimir_T
сообщение Mar 17 2009, 16:53
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Здравствуйте, уважаемые коллеги, помогите пожалуйста. В функции мне нужно знать количество элементов массива, делаю это с помощью макроса SizeObj, а он в данной функции не работает. Компилятор - Кейл. Можно было бы передавать размер массива в саму функцию, но это не то. Вызывается эта функция часто и для массивов разной длины, потому хотелось лаконичнее, да еще бы с передачей в функцию указателя на массив, но по указателю на массив я не могу определить размер. Как бы решить эту задачку.

Код
typedef struct
{
  int X;
  int Y;
  char  dX;
  char  dY;
} TG_Buttons;

TG_Buttons G_But [] = {
                              Bt_Menu_X, Bt_Menu_Y, Bt_Menu_L, Bt_Menu_H,
                              Bt_Prn_X, Bt_Prn_Y, Bt_Prn_L, Bt_Prn_H,
                              Bt_Rec_X, Bt_Rec_Y, Bt_Rec_L, Bt_Rec_H
                          
                       };


#define     SizeObj(a) (sizeof(a) / sizeof(a[0]))

void Set_Arr_But (TG_Buttons G_Bt [])
{ INT16U i;
  TG_Buttons *pG_But = &G_Bt [0];
  float k_Y;
      
   k_Y = (float)Max_TSC_Y / LCD_YSIZE;  

for (i=0; i < SizeObj(G_Bt); i++)
  {
    pG_But->Y = ceil ((pG_But->Y + pG_But->dY/2) * k_Y);             //
    pG_But ++;
  }
} // Set_Arr_Buttons (void)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zhevak
сообщение Mar 18 2009, 05:14
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Vladimir_T @ Mar 17 2009, 21:53) *
Можно было бы передавать размер массива в саму функцию, но это не то.

Да кто Вам такое сказал? Как раз то самое. Самое простое и самое широкоиспользуемое явление -- передавать в функцию указатель вместе с размерностью массива. Посмотрите на библтотечные функции и убедитесь, что это так и делается.

Цитата
Вызывается эта функция часто и для массивов разной длины, потому хотелось лаконичнее, да еще бы с передачей в функцию указателя на массив

А эта "хотелка" (требование) еще раз подтверждает, что Вам надо делать именно так, как сказано выше -- передавть в функцию два параметра.

Вы видели как дети рисуют картины? Чем детские картины отличаются от картин взрослых? -- Дети стремятся выразить себя не в точности отображения, а в насыщеености и яркости красок. Ни один художник не станет писать свою картину флуоресцентными маркерам. Хотя, в жизни иногда встречваются типа Малевичей... Не важно. Вы понимаете о чем я толкую? Выпендрежный стиль программирования говорит не крутости программиста, а скорее о его кудрявости. Чем больше всяких трюков, тем сложнее (== дольше) отлаживать прогу и сопровождать ее после выхода в свет. Если Вы "играетесь", и результат Вашей работы не имеет никакого значени, то можете делать все что Вам заблагорассудится. Если же Вы намерены делать "по-взрослому", забудьте про витееватость. Делайте как можно проще и понятнее. А свои секреты ппрограммирования защищайте другими способами.

Возвращаясь к вашему коду, скажу, что sizeof -- это оператор, а не функция. Т.е. после компиляции на его месте Вы не найдете вызова какой-то функции, там будет готовая константа, число. sizeof вычисляется на этапе компиляции. Поэтому, если в Вашей программе размеры передаваемых в функцию массивов одинаковые, то использовать вычисления размера не имеет смысла. Если же размеры массивов разные, то вычисление размера следует производит пере вызовом функции и передвать его как еще один параметр.

Конечно, если Вам Ваша религия запрещает использовать дополнительные параметры при вызове функции, то, в принципе, у Вас еще есть две возможности сказать функции о размере массива.
1. Создать глобальную переменную (или локальную файловую перемменную, если все действие у Вас производится в одном и том же файле) и через нее сообщать вызываемой функции размерность массива.
2. Создать еще одну структуру из двух элементов: 1) указателя на массив и 2) числа -- размерности этого массива. И затем передавать в свою функцию эту структуру.

Замечу, что эти два способа работать будут. Но это не есть "кошерно", хотя смотртся круто.

Делайте как можно проще и понятнее. Такой подход выгоднее со всех точек зрения. И это подтверждается практикой.

Мы все когда были на Вашем месте, и тоже не знали как правилно делать. Почитайте K&R, почитайте Страуструпа. И удачи Вам в освоении языка!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Mar 18 2009, 11:39
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(zhevak @ Mar 18 2009, 00:14) *
Делайте как можно проще и понятнее. Такой подход выгоднее со всех точек зрения. И это подтверждается практикой.

Yep, это называлось KISS-принцип в одной книжке --- Keep It Simple, Silly smile.gif

Еще один + к вашему посту.

ps/ Я вообще в шоке от того, что начинающего программера пустили программировать на ембеддед девайс....

Сообщение отредактировал ar__systems - Mar 18 2009, 11:42
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение Mar 18 2009, 16:39
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Цитата(ar__systems @ Mar 18 2009, 14:39) *
ps/ Я вообще в шоке от того, что начинающего программера пустили программировать на ембеддед девайс....


Скажите, как мне это удалось? Шокировать ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vladimir_T   Вопрос по размеру массива   Mar 17 2009, 16:53
- - sergeeff   При передаче указателя на массив в функцию информа...   Mar 17 2009, 17:18
- - Qwertty   Передавайте размер. sizeof не функция, а скорее ма...   Mar 17 2009, 17:34
- - meister   Цитата(Vladimir_T @ Mar 17 2009, 20:53) К...   Mar 17 2009, 18:44
- - sergeeff   Результат компиляции в Visual Studio 6.0 ЦитатаC:...   Mar 17 2009, 19:50
|- - meister   Цитата(sergeeff @ Mar 17 2009, 23:50) Рез...   Mar 17 2009, 19:54
- - sergeeff   Да, действительно, в VS2008 - без проблем. Изящно...   Mar 17 2009, 20:38
|- - ar__systems   Цитата(sergeeff @ Mar 17 2009, 15:38) Да,...   Mar 18 2009, 02:07
- - VAI   Добавьте в "TG_Buttons G_But []" признак...   Mar 18 2009, 04:50
|- - Сергей Борщ   Цитата(zhevak @ Mar 18 2009, 07:14) Если ...   Mar 18 2009, 08:49
|- - _Pasha   Цитата(zhevak @ Mar 18 2009, 08:14) Самое...   Mar 18 2009, 08:50
|- - zhevak   Цитата(ar__systems @ Mar 18 2009, 16:39) ...   Mar 18 2009, 15:37
|- - _Pasha   Цитата(ar__systems @ Mar 18 2009, 15:39) ...   Mar 18 2009, 15:48
||- - ar__systems   Цитата(_Pasha @ Mar 18 2009, 10:48) Зато ...   Mar 18 2009, 17:11
||- - _Pasha   Цитата(ar__systems @ Mar 18 2009, 21:11) ...   Mar 18 2009, 17:20
- - richie   +1, zhevak. Сказал, то что я не мог сказать с утра...   Mar 18 2009, 08:34
|- - zhevak   Цитата(richie @ Mar 18 2009, 13:34) Поэто...   Mar 18 2009, 09:40
- - Vladimir_T   Спасибо всем за дельные советы. Понял, что в прост...   Mar 18 2009, 14:24


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

 


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


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