gpt4 book ai didi

perl - 这个内联模块测试我做错了什么?

转载 作者:行者123 更新时间:2023-12-04 06:57:30 25 4
gpt4 key购买 nike

更新:为我选择放东西的错误地方道歉。我根本没有注意到@Sinan 提到的那些添加,可能它们已被我的浏览器阻止了。无论如何,我现在已经删除了链接。谢谢你们:)

在我的 [previous post][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

我检查了 solarlunar.h 文件的第 53 行,在谷歌搜索了一下这可能意味着什么之后,我认为这行看起来很无辜,但作为一个完整的 C++ 新手,我不确定:
**typedef enum boolean { false = 0, true = 1 } boolean;** 

我尝试使用 DEV-C++ 编译和测试 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.");
}

必要的库可以从[这里]和[这里]下载。
抱歉,放错地方了。链接现已删除。

最佳答案

您的问题源于您试图将 C 源代码编译为 C++。这个愚蠢程序的作者似乎想要 C 中的 bool 类型,因此使用枚举定义它:

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

现在,这会使 C++ 编译器出错,因为该语言有 bool输入和 truefalse是该类型的值。作业 false = 0不是有效的 C++。

有趣的是 boolean 这个词仅出现在 solarlunar.c 中的一处:
boolean is_leap_year(const int year)
{
return LEAP(ABS(year));
}

将该函数的返回类型更改为 int并摆脱 typedefsolarlunar.h应该解决眼前的问题。编译源代码为 C使用 gcc即使没有这些更改,也不会导致错误。

关于perl - 这个内联模块测试我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com