小编Bil*_*nch的帖子

我无法在Boost Spirit的词法分析器功能中进行语义操作来编译

所以,我正在使用boost 1.47.0并且我一直在尝试组合一个词法分析器.

我的目标是为我的词法分析器的一些标记添加一个包含语义的动作 spirit::lex::_pass = spirit::lex::pass_flags::pass_ignore.但是,我无法编译任何语义操作.我在下面添加了一个(或多或少)最小的例子.我正在编译OS X 10.7.1上的clang.

编译命令

clang++ -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -c input.cc
Run Code Online (Sandbox Code Playgroud)

编译的代码

#include <boost/phoenix.hpp>
#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>

namespace phoenix = boost::phoenix;
namespace spirit = boost::spirit;

struct vhdl_lexer : spirit::lex::lexer< spirit::lex::lexertl::lexer<> > {
    vhdl_lexer() {
        num = "[0-9]";
        any = ".";

        this->self
                = num
                | any
                ;
    }

    spirit::lex::token_def<> num, any;
};
Run Code Online (Sandbox Code Playgroud)

不编译的代码

#include <boost/phoenix.hpp>
#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>

namespace phoenix = boost::phoenix;
namespace spirit = boost::spirit;

struct vhdl_lexer : spirit::lex::lexer< spirit::lex::lexertl::lexer<> > {
    vhdl_lexer() …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-lex

1
推荐指数
1
解决办法
641
查看次数

如果资源获取可能失败,如何实施RAII

我想在RAII的帮助下实现一个课程.资源应该在构造函数中获取,但是acquistition可能会失败.我将在下面使用FILE给出一个示例:

class file {
public:
    file(const char* filename) {
        file_ = fopen(filename, "w+");
        if(!file_) {
          // Okay
        }
        else {
          // ERROR
        }
    }

    ~file() {
        if (fclose(file_)) {
           // ERROR
        }
    }

    void write(const char* str) {
        if (EOF == fputs(str, file_)) {
            throw runtime_error("file write failure");
        }
    }
private:
    FILE* file_;
};
Run Code Online (Sandbox Code Playgroud)

那么,如果fopen返回NULL,那么处理错误的最佳方法是什么?因为它是构造函数,所以我也无法返回NULL.

我希望有人能给我一个如何处理这些错误的提示!

谢谢您最好的问候,

闪光

c++ raii

1
推荐指数
1
解决办法
1255
查看次数

Prog错误:用"%20"替换空格

下面是编译用"%20"替换空格的编程,但是当我运行它时,输出窗口显示空白并显示消息"arrays5.exe发生了一个概率"

#include <iostream>
#include<cstring>

using namespace std;

void method(char str[], int len)               //replaces spaces with "%20"
{

    int spaces, newlen,i;

    for (i=0;i<len;i++)
        if(str[i]==' ') spaces++;
    newlen=len+spaces*2;
    str[newlen]=0;
    for (i=len-1;i>=0;i--)
    {
        if(str[i]==' ')
        {
            str[newlen-1]='0';
            str[newlen-2]='2';
            str[newlen-3]='%';
            newlen=newlen-3;
        }
        else
        {
            str[newlen-1]=str[i];
            newlen=newlen-1;
        }
    }
}
int main()
{
    char str[20]="sa h ";
    method(str,5);
    cout <<str<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请帮我找错.谢谢

c++

1
推荐指数
1
解决办法
356
查看次数

只有在将数组设为私有后才能进行多线程加速

我正在尝试使用openmp学习多线程编程.

首先,我测试了一个带有大量数组访问操作的嵌套循环,然后将其并行化.我附上下面的代码.基本上,我在内部循环中有这个相当大的数组tmp,如果我让它共享以便每个线程都可以访问和更改它,我的代码实际上会随着线程数量的增加而减慢.我写了它,以便每个线程将完全相同的值写入数组tmp.当我将tmp设为私有时,我的速度与线程数成正比.没有.在这两种情况下,我认为操作完全相同.为什么在共享tmp时速度会变慢?是因为不同的线程试图同时访问同一个地址吗?

int main(){
    int k,m,n,dummy_cntr=5000,nthread=10,id;
    long num=10000000;
    double x[num],tmp[dummy_cntr];
    double tm,fact;
    clock_t st,fn;

    st=clock();
    omp_set_num_threads(nthread);
#pragma omp parallel private(tmp)
    {
        id = omp_get_thread_num();
        printf("Thread no. %d \n",id);
#pragma omp for
        for (k=0; k<num; k++){
            x[k]=k+1;
            for (m=0; m<dummy_cntr; m++){
                tmp[m] = m;
            }
        }
    }
    fn=clock();
    tm=(fn-st)/CLOCKS_PER_SEC;
}
Run Code Online (Sandbox Code Playgroud)

PS:我知道在这里使用clock()并没有真正给出正确的时间.我必须将它除以否.在这种情况下,线程获得"time ./a.out"给出的类似输出.

c multithreading openmp

1
推荐指数
1
解决办法
211
查看次数

在C++中获取类的所有对象

有没有办法可以在C++中获取类的所有对象.就像在Python中一样,我们可以做到

class_name.objects.all() 
Run Code Online (Sandbox Code Playgroud)

得到一个类的所有对象.如果它存在,它在C++中的模拟是什么?

c++ class object

1
推荐指数
2
解决办法
3238
查看次数

这种未定义的行为?

我在代码库中找到了以下代码.我的同事认为这没关系,但看起来像UB一样可疑.是不是UB?

class A {
   //some stuff
};

class B : public A {
   int a;
   int b;
   int c;
}

void foo( std::vector<A>& a ) {

   std::vector<B> b;
   for(size_t i = 0 ; i < a.size(); ++i ){
      b.push_back( *(B*)(&a[i]) );
   }

   //remove some elements from b

   for(size_t i = 0 ; i < b.size(); ++i ){
      a.push_back( *(A*)(&b[i]) );
   }

}
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior

1
推荐指数
1
解决办法
123
查看次数

触发器实现与过程.[VHDL]

我的问题是关于以下代码:

library ieee;
use ieee.std_logic_1164.all;

entity exam is port (
    I,CLK,RESET : in std_logic;
    Q : out std_logic
);
end entity;

architecture exam_arc of exam is
    signal temp_sig : std_logic;
begin
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK='1' then
            temp_sig <= I;
        end if;
        Q <= temp_sig;
    end process;
end exam_arc;
Run Code Online (Sandbox Code Playgroud)

似乎这段代码模拟了一个D触发器,它在时钟的上升沿工作,但是这个问题的答案是[这个问题来自于考试]这个问题声称这个D触发器在时钟的下降沿工作.

这个VHDL代码模拟什么样的触发器?

vhdl

1
推荐指数
1
解决办法
3335
查看次数

turbo c中的二进制表示

我有一个非常基本的查询.对于以下代码:

int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler
Run Code Online (Sandbox Code Playgroud)

它不应该只是放下负号或者它是否包围了极限?

c c++ turbo-c

1
推荐指数
1
解决办法
183
查看次数

使用 echo 和 system 在 C 中运行软件

我正在尝试运行一个名为 BLASTP 的生物程序,它接收两个字符串(代码中的 fasta_GWIDD 和 fasta_UNIPROT)并比较它们。我遇到的问题是在代码中使用了 echo/system。谁能建议我错过了什么?

    for(i=0;i<index1;i++)
    {
        sprintf(fasta_GWIDD,">%s\\n%s\n",fasta_name1[i],fasta_seq1[i]);
        setenv("GwiddVar", fasta_GWIDD, 1) ;
        sprintf(fasta_UNIPROT,">%s\\n%s\n",fasta_name2[i],fasta_seq2[i]);
        setenv("UniprotVar", fasta_UNIPROT, 1) ;
        system("blastp -query <(echo -e $GwiddVar) -subject<(echo -e $UniprotVar)");
    }
Run Code Online (Sandbox Code Playgroud)

错误是:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `blastp -query <(echo -e $GwiddVar) -subject<(echo -e $UniprotVar)'
Run Code Online (Sandbox Code Playgroud)

c shell blast

1
推荐指数
1
解决办法
524
查看次数

VHDL 中的并发语句非法?

我一直在尝试学习如何在 VHDL 中使用条件信号分配(我相信哪些是 WHEN ELSE 语句?),并提出了应该是一个简单的代码。但 ModelSim 不让它编译并一直告诉我我有一个非法的并发语句。在哪里?为什么?我尝试在进程内执行 IF ELSIF ELSE 语句,但仍然遇到完全相同的错误,所以我现在比开始时更困惑......

Library ieee;
Use ieee.std_logic_1164.all;

Entity Q59122 is port (
    A, B : IN  STD_LOGIC;
    Y    : OUT STD_LOGIC
);
End Entity Q59122;

ARCHITECTURE csa OF Q59122 IS
BEGIN
    Y <= '0' WHEN A = '0'
    ELSE Y <= '0' WHEN B = '0'
    ELSE Y <= '1';
END csa;
Run Code Online (Sandbox Code Playgroud)

基本上我正在尝试使用条件信号分配来模拟与门。我知道您可以在 VHDL 中使用“and”命令,但这会达不到目的。我在这里先向您的帮助表示感谢。

vhdl

1
推荐指数
1
解决办法
2万
查看次数