Что я делаю не так с этим модульным тестом? - PullRequest
2 голосов
/ 04 марта 2010

ОБНОВЛЕНИЕ: извинения за неправильное место, которое я выбрал, чтобы положить вещи. Я не заметил этих добавлений, упомянутых @Sinan, возможно, они были заблокированы моим браузером. Во всяком случае, я удалил ссылки сейчас. и спасибо вам ребята :) 1001 *

В моем [предыдущем посте] [1] @daotoad упомянул встроенный модуль. Теперь я играю с этим. Ну, на самом деле, за исключением Perl, я практически ничего не знаю ни о каких других языках программирования. Сценарий написан для чистого удовольствия. Я хочу посмотреть, смогу ли я просто добавить в свой Perl-скрипт код, написанный на другом языке программирования, и каким-то образом заставить его работать.

Ну, я скопировал исходный код CPP, который я нашел в сети, в мой Perl-скрипт, и я пытался заставить его работать, но все, что я получаю, - это скрин с сообщением об ошибке: Похоже, что-то подозрительно с импортированной библиотекой CPP, но я не уверен. Следующая информация является частью информации об ошибке, которая попалась мне на глаза:

E:/solarlunar.h:53: error: expected identifier before "false"
E:/solarlunar.h:53: error: expected `}' before "false"
E:/solarlunar.h:53: error: expected unqualified-id before "false"
E:/solarlunar.h:53: error: expected declaration before '}' token
In file included from _3_pl_62cb.xs:19:
E:/solarlunar.h:1:1: unterminated #ifndef
NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0x1'
Stop.

A problem was encountered while attempting to compile and install your Inline
CPP code. The command that failed was:
  nmake > out.make 2>&1

Я проверил 53-ю строку файла solarlunar.h и после небольшого гугла о том, что это может означать, я думаю, что эта строка выглядит довольно невинно, но, как и полный новичок в C ++, я не уверен:

**typedef enum boolean { false = 0, true = 1 } boolean;** 

Я попытался скомпилировать и протестировать код C ++ с помощью DEV-C ++, и все заработало, как и ожидалось.

Мой скрипт (обновленный) такой:

    #Inline-Test.pl
 use warnings;
 use Inline 'CPP' => Config => LIBS => 'E:/';
    use Inline 'CPP' => Config => INC  => 'E:/';
 use Inline 'CPP';

    my $args = <STDIN>;     
 chomp $args;
    my $result = main($args); 
    print $result;

__END__
__CPP__


#include <stdio.h>
#include <stdlib.h>
#include "solarlunar.h"
#include "solarlunar.c"

/**//* input format: sl -[s|l]   year.month.day */
/**//* the lunar calendar date range is limited by solarlunar.h: 1899/12/1 ~ 2099.12.30 */

static void usage(void);

int main(int argc, char *argv[])
{
    int year, month, day;
    int i;
    /**//* convert flag, 0: solar convert to luanr. 1: lunar convert solar */
    int convert_f = 0;
    solar_calendar so;
    lunar_calendar lu;

    /**//* input check */
    if( argc < 3 || argv[1][0]!= '-' ||
         !(argv[1][2] == 's' || argv[1][3] == 'l')) {
        usage();
        exit(1);
    }

    /**//* get convert flag */
    convert_f = (argv[1][4] == 's' ? 0 : 1);

    /**//* converting */
    for(i = 2; i < argc; i++) {
        sscanf(argv[i], "%d.%d.%d", &year, &month, &day);
        switch(convert_f) ...{
            case 0:
                so = solar_creat_date(year, month, day);
                lu = solar2lunar(so);
                printf("%d.%d.%d ", lunar_get_year(lu), lunar_get_month(lu), lunar_get_day(lu));
                break;
            case 1:
                lu = lunar_creat_date(year, month, day);
                so = lunar2solar(lu);
                printf("%d.%d.%d ", solar_get_year(so), solar_get_month(so), solar_get_day(so));
                break;
            default :
                exit(2);
        }
    }
        return 0;
}


static void usage(void)
{
    printf("sl -[s|l] year1.month1.day1 year2.month2.day2 ... "
            "-s: solar calendar date convert to lunar calendar date. "
            "-l: lunar calendar date convert to lunar calendar date.");
}

Необходимую библиотеку можно скачать с [здесь] и [здесь]. Извините, неправильное место, чтобы положить вещи. ссылки теперь удалены.

1 Ответ

3 голосов
/ 04 марта 2010

Ваша проблема связана с тем, что вы пытаетесь скомпилировать исходный код на C как C ++. Автор этой глупой программы, похоже, хочет логический тип в C и поэтому определяет его, используя перечисление:

typedef enum boolean { false = 0, true = 1} boolean; 

Теперь это отключает компилятор C ++, потому что этот язык имеет тип bool, а true и false являются значениями для этого типа. Назначение false = 0 недопустимо C ++.

Интересно, что слово boolean встречается только в одном месте в solarlunar.c:

boolean is_leap_year(const int year)
{
    return LEAP(ABS(year));
}

Изменение типа возвращаемого значения этой функции на int и избавление от typedef в solarlunar.h должны решить немедленную проблему. Компиляция исходного кода как C с использованием gcc не привела к ошибкам даже без этих изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...