我正在尝试编写一个解析器,它应该将Prolog列表(例如[1,2,3,4])解析到相应的Scala列表中.我使用Scalas解析组合器对解析器进行编程.
到目前为止,我的解析器看起来像这样:
class PListParser extends JavaTokenParsers{
def list:Parser[List[Any]] = "[" ~> listArgs <~ "]"
def listArgs:Parser[List[Any]] = list | repsep(args, ",")
def args:Parser[String] = "(.)*".r
}
Run Code Online (Sandbox Code Playgroud)
是否有可能将前两个解析器的类型参数转换为更具体的?类似于任意维度但具有相同底层类型的嵌套列表的一般参数.
当我尝试使用ALSA库时,我获得了C代码的奇怪行为.我使用此代码生成设备的sid
snd_mixer_selem_id_t*
getSid(){
snd_mixer_selem_id_t *sid;
snd_mixer_selem_id_alloca(&sid);
snd_mixer_selem_id_set_index(sid,0);
snd_mixer_selem_id_set_name(sid, selem_name);
return sid;
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过访问此功能
snd_mixer_t *handle = getHandle();
snd_mixer_selem_id_t *sid = getSid();
snd_mixer_elem_t *elem = snd_mixer_find_selem(handle,sid);
Run Code Online (Sandbox Code Playgroud)
getHandle()是一个获得卡处理程序的等效函数,但这个工作正常.奇怪的是,如果我在使用函数之前直接使用snd_mixer_find_selem函数代码就可以了.我不得不说我是C的新手,这是我的第一个项目之一,所以这可能是初学者对指针的错误.
错误消息是 simple.c:282: snd_mixer_selem_get_playback_volume_range: Assertion 'elem' failed.
那么有谁知道问题是什么?
这是我使用的代码的最小示例:
#include <alsa/asoundlib.h>
static const char *selem_name = "Master";
static const char *card = "default";
snd_mixer_t*
getHandle(){
snd_mixer_t *handle;
snd_mixer_open(&handle, 0);
snd_mixer_attach(handle, card);
snd_mixer_selem_register(handle, NULL, NULL);
snd_mixer_load(handle);
return handle;
}
snd_mixer_selem_id_t*
getSid(){
snd_mixer_selem_id_t *sid;
snd_mixer_selem_id_alloca(&sid);
snd_mixer_selem_id_set_index(sid,0);
snd_mixer_selem_id_set_name(sid, selem_name);
return sid;
}
void
incMasterVol(long step){ …Run Code Online (Sandbox Code Playgroud)