LINUX.ORG.RU

Сообщения DBSR

 

Язык C, ошибка сегментирования.

Суть задания в том, что нужно написать программу, которая будет выводить текущее время римскими символами. Попытался проверить работоспособность того, что уже написал - код компилируется нормально, но при запуске программы выдает сообщение «Ошибка сегментирования (сделан дамп памяти)». Ошибка, если я правильно понял, происходит в функции «convert_dec_to_roman», но в чем конкретно я ошибся, понять не могу, поэтому прошу помощи. Заранее спасибо.

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/** convert_dec_to_roman -- преобразует целое число в строковое представление
 * 
 * Параметры:
 *   roman - строка для записи результата преобразования
 *   decimal - исходное целое
 *   n - ограничение на длину результата
 * Возвращаемое значение:
 *   функция возвращает -1 при любой ошибке
 */
int convert_dec_to_roman (char *roman, unsigned int decimal, size_t n);

/** get_roman_date -- преобразует дату в строковое представление
 * 
 * Параметры:
 *   romandate - строка для записи даты римскими числами
 *   now - структура времени
 *   n - ограничение на длину результата
 * Возвращаемое значение:
 *   функция возвращает -1 при любой ошибке
 */
int get_roman_date (char *romandate, struct tm *now, size_t n);

int main (int argc, char *argv[])
{
    struct tm *date;
    int error_check = 0;
    char romandate [100];
    int size = sizeof (romandate);

    error_check = get_roman_date (romandate, date, size);

    if (error_check == 0) {
        printf("%s\n", romandate);
    } else {
        exit (EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}

int convert_dec_to_roman (char *roman, unsigned int decimal, size_t n)
{
    const int arabar[]  = {  1,   4,    5,   9,    10,  40,  50,   90,  100, 400,  500, 900,  1000};
    const char *romanar[] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};

    int m = sizeof(arabar)/sizeof(int)-1;
    int i, z;

    i = 0;
    z = m;
    while(decimal > 0) {
        if(decimal >= arabar[z]) {
	    
            roman[i++] = *romanar[z];
            decimal -= arabar[z];

        } else {
            z--;
        }
    }

    if(i > n) {
        return -1;
    } else {
        return 0;
    }
}



int get_roman_date (char *romandate, struct tm *now, size_t n)
{
    int error_check = 0;

    error_check = convert_dec_to_roman (romandate, now->tm_wday, n);








    return error_check;
}



 ,

DBSR
()

RSS подписка на новые темы