Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C] Передача в функцию указателя на структуру  (Прочитано 15286 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tugoboss
Интересующийся

ru
Offline Offline

« : 07-01-2009 23:51 » 

Здравствуйте!

Нужно в функции сделать двоично-десятичное представление числа: отдельные цифры рассовать по ячейкам массива. Потом по цифрам выводить на ЖК дисплей. Пишу для микроконтроллера.

Подскажите, пожалуйста:
1. Разумную ли структуру данных я выбрал?
2. Так и должно быть некрасиво,  при передаче в функцию указателя на стуктуру? Я имею ввиду выражение вида:
Код:
k->bdcNumber[k->cntr] = k->number;

Вот сама структура с функцией:
Код:
struct b
{
    unsigned int number;                  // число
    unsigned int bdcNumber[10];           // число, в двоично-десятичном предствлении
    unsigned char rIdx;                   // индекс чтения буфера, чтобы знать что выводить на ЖК
    unsigned char cntr;                   // счетчик числа элементов в буфере
};

struct b buff, *pbuff = &buff;



void BDC (struct b *k)
{
    if (k->number < 9)
    {
        k->cntr = 0;
        k->bdcNumber[k->cntr] = k->number;
    }
    else
    {
        for (k->cntr = 0; k->number > 9; (k->cntr)++)
        {
            k->bdcNumber[k->cntr] = k->number % 10;
            k->number /= 10;
        }
        k->bdcNumber[k->cntr] = k->number;
    }
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 08-01-2009 06:06 » 

Цитата
k->bdcNumber[k->cntr] = k->number;
будет красивее, если сделать метод (если компилятор поддерживает, конечно)

Код:
struct b
{
    <...> //переменные

    void CopyNumToArray()
    {
       if(cntr <= размеру_массива)
       {
          bdcNumber[cntr] = number;
       }
    }
};

Цитата
Разумную ли структуру данных я выбрал
если тебе удобно - то разумную Улыбаюсь Если что то напрягает - думай, как это переделать

также везде, где идёт туча обращений к членам структуры - подумай, не сделать ли это место в виде метода структуры. А то и вообще, объявить члены структуры приватными (в идеале)
« Последнее редактирование: 08-01-2009 06:08 от Алексей1153++ » Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 08-01-2009 08:18 » 

Цитата
Код:
if (k->number < 9)
    {
        k->cntr = 0;
        k->bdcNumber[k->cntr] = k->number;
    }
Мнимое "ускорение".

Насчет структуры. это с какой стороны смотреть.
Если вывод на дисплей статический, то что-то в структуре лишнее (rIdx, например, да и number, возможно лишний)
если динамический то, возможно number лишний


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
tugoboss
Интересующийся

ru
Offline Offline

« Ответ #3 : 10-01-2009 18:01 » 

Я ведь пишу для микроконтроллера, на С. И хотя у меня компилятор поддерживает С++, коллеги крайне не рекомендовали писать на нем.

Цитата
Код:
if (k->number < 9)
    {
        k->cntr = 0;
        k->bdcNumber[k->cntr] = k->number;
    }
Мнимое "ускорение".

Насчет структуры. это с какой стороны смотреть.
Если вывод на дисплей статический, то что-то в структуре лишнее (rIdx, например, да и number, возможно лишний)
если динамический то, возможно number лишний

Вы не могли бы подробнее  пояснить, практически ничего не понял.
Что значит "мнимое ускорение"? Что я хотел сделать и что сделал?  Скромно так...
Не понятно про статический и динамический вывод на дисплей. Для светодиодного индикатора статический и динамический вывод  - понятно, но как для жидкокристаллического?
У меня дисплей LCD.
Задача учебная: каждый последующий символ числа выводится на дисплей с паузой в 0,5сек. Все число вывелось, дисплей очищается, начинаем вывод снова. Число инкрементируется.

Я в итоге сделал структуру глобальной и все функции в программе становятся void Function (void). Это плохо?
Пока пишу для микроконтроллеров с памятью программ до 8кб, но есть и до 6мб!
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 10-01-2009 18:19 » 

думаю, Sla хотел сказать, что смысла ставить такую проверку нет, это лишнее ветвление.

Кроме того, если поле number модифицируется в функции до неузнаваемости - есть ли смысл его сохранять? Может, проще подавать в функцию просто int number и указатель на структуру, содержащую массив и размер?

Я бы цикл сделал как-то так (пока сохраняю структуру как есть):
Код:
int number = k->number;
int digit = 0;
do
{
    k->bdcNumber[digit++] = number % 10;
    number /= 10;
}
while (number);
k->cntr = digit - 1;
оно как-то понятнее (по крайней мере, мне) что происходит Улыбаюсь
« Последнее редактирование: 10-01-2009 18:22 от Вад » Записан
ObamaBarak
Гость
« Ответ #5 : 10-01-2009 20:23 » 

tugoboss, если у тебя все компилируется и все получается что хотел, что еще надо то? Я вот не пойму фразу конструкции - "Так и должно быть некрасиво,  при передаче в функцию указателя на стуктуру?" Улыбаюсь
Записан
tugoboss
Интересующийся

ru
Offline Offline

« Ответ #6 : 10-01-2009 22:42 » 

Спасибо всем за помощь!

tugoboss, если у тебя все компилируется и все получается что хотел, что еще надо то? Я вот не пойму фразу конструкции - "Так и должно быть некрасиво,  при передаче в функцию указателя на стуктуру?" Улыбаюсь

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

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-01-2009 06:16 » new

Вообще хочу научиться правильно программировать, научиться хорошему вкусу, чтобы программировать быстро, безошибочно, ясно.
Кажется, Экзюпери принадлежит фраза о том, что система совершенна не тогда, когда к ней нечего прибавить, а тогда, когда от неё нечего отнять Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines