2015-04-14 5 views
-1

Я написал следующую функцию. Эта функция получает адрес шестнадцатеричного значения, например. 0x4571 и вычисляет день, месяц и год из битовых позиций шестнадцатеричного значения.Лучший способ вернуть результат

void fat_dir_date(char *dateAr) { 

    const unsigned int MaskDayOfMonth = 0x1F; //0000000000011111 
    const unsigned int MaskMonthOfYear = 0x1E0; //0000000111100000 
    const unsigned int MaskYear = 0xFE00; //1111111000000000 

    unsigned int DayOfMonth = hex & MaskDayOfMonth; //AND Bit Operation 

    unsigned int MonthOfYear = hex & MaskMonthOfYear; //AND Bit Operation 
    MonthOfYear = MonthOfYear >> 5; //Bitshift to right position 

    unsigned int Year = hex & MaskYear; //AND Bit Operation 
    Year = Year >> 9; //Bitshift to right position 

    printf("%d.%d.%d", DayOfMonth, MonthOfYear, 1980+Year); 
} 

Расчет работает отлично. Я получаю правильные числа в целочисленном DayOfMonth, MonthOfYear и Year. Но вместо того, чтобы распечатывать их с помощью printf, я хочу вернуть значения функции звонящего. Лучше всего объединить в одном значении или строке.

Как наилучшим образом решить эту проблему в C?

+0

вопросы ищет 'best' образом не подходят для SO –

+1

Может быть, вы можете поместить их все в' struct ", который создается в куче и возвращает адрес этой' struct'. Просто мое мнение. – sps

+2

У вас есть странное определение «отлично работает». Код даже не компилируется. –

ответ

1

У вас есть несколько вариантов там:

  • Создать struct что имеет три поля и возвращает их,
  • Позвольте абоненту передать вам struct, который вы заполните,
  • Позвольте вызывающему абоненту передать вам строковый буфер t o, который вы печатаете с использованием sprintf, или
  • Создайте строку динамически, распечатайте ее и верните.

Первый вариант чист и понятен. Это требует копирования, но она прекрасно подходит для небольших структур, как тот, что вам нужно:

struct DateTime { 
    int DayOfMonth; 
    int MonthOfYear; 
    int Year; 
}; 
struct DateTime fat_dir_date(unsigned int hex) { 
    struct DateTime res; 
    res.DayOfMonth = ... 
    res.MonthOfYear = ... 
    res.Year = ... 
    return res; 
} 
+1

Почему бы не 'void fat_dir_date (unsigned int, unsigned int *, unsigned int *, unsigned int *)'? Почему «вернуть» значение? – user3528438

+1

@ user3528438 Поскольку эти три значения связаны. Они представляют собой одну логическую вещь, поэтому имеет смысл объединить их в одну «структуру». – dasblinkenlight

+0

Возможно, еще один вариант, а не как одобренный, но тем не менее действительный. Объявите 'fat_dir_date' как' char * 'и объявите статический буфер в' fat_dir_date' соответствующего размера (например, 'static char buf [12] = {0};'). Затем, используя 'sprintf' или вашу любимую процедуру преобразования, заполните и верните' buf'. Объявляя 'buf' как' static', 'buf' продолжает существовать и обеспечивает действительный возврат. –

-2

Если вам нужно распечатать данные, и вы не должны использовать числовые значения, я думаю, что это:

char * fat_dir_date(char *dateAr,unsigned int hex) { 

    const unsigned int MaskDayOfMonth = 0x1F; //0000000000011111 
    const unsigned int MaskMonthOfYear = 0x1E0; //0000000111100000 
    const unsigned int MaskYear = 0xFE00; //1111111000000000 

    unsigned int DayOfMonth = hex & MaskDayOfMonth; //AND Bit Operation 

    unsigned int MonthOfYear = hex & MaskMonthOfYear; //AND Bit Operation 
    MonthOfYear = MonthOfYear >> 5; //Bitshift to right position 

    unsigned int Year = hex & MaskYear; //AND Bit Operation 
    Year = Year >> 9; //Bitshift to right position 

    sprintf(dateAr,"%02u.%02u.%4u", DayOfMonth,MonthOfYear, 1980+Year); 
    return dateAr; 
} 

int main(void) 
{ 
    char dateAr[11]; 
    unsigned int hex=0x1010; //Random :) 

    printf("%s\n" , fat_dir_date(dateAr,hex)) 

    return 0; 
} 
+0

Никогда не указывайте указатель без размера, используйте snprintf –

+0

Да, может быть, лучше !!! Для безопасности лучше также не использовать printf и компанию! –

Смежные вопросы