小编Jac*_*ack的帖子

使用JIT设计虚拟机

我正在开发一种脚本语言,它可以编译自己的虚拟机,这是一个简单的脚本语言,可以处理某些数据,如,向量,浮点数等等.内存单元以这种方式表示:

struct memory_cell
{
    u32 id;
    u8 type;

    union
    {
        u8 b; /* boolean */
        double f; /* float */
        struct { double x, y, z; } v; /* vector */
        struct { double r, g, b; } c; /* color */
        struct { double r, g, b; } cw; /* color weight */
        struct { double x, y, z; } p; /* point variable */
        struct { u16 length; memory_cell **cells; } l; …
Run Code Online (Sandbox Code Playgroud)

c++ vm-implementation

4
推荐指数
2
解决办法
3102
查看次数

如何处理yacc/bison中的变量引用(使用ocaml)

我想知道如何在用ocamlyacc和ocamllex编写语法时处理语句中的变量引用.

问题是表格的陈述

var x = y + z
var b = true | f;
Run Code Online (Sandbox Code Playgroud)

应该是正确的,但在第一种情况下,变量引用数字,而在第二种情况下,f变量是布尔变量.

在我写的语法中我得到了这个:

numeric_exp_val:
  | nint { Syntax.Int $1 }
  | FLOAT { Syntax.Float $1 }
  | LPAREN; ne = numeric_exp; RPAREN { ne }
  | INCR; r = numeric_var_ref { Syntax.VarIncr (r,1) }
  | DECR; r = numeric_var_ref { Syntax.VarIncr (r,-1) }
  | var_ref { $1 }
;

boolean_exp_val:
  | BOOL { Syntax.Bool $1 }
  | LPAREN; be = boolean_exp; RPAREN { be } …
Run Code Online (Sandbox Code Playgroud)

variables grammar ocaml yacc compilation

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

在opengl中将颜色应用于四边形中的单个顶点

我正在尝试着色通过的四边形顶点glDrawElements,我正在使用cocos2d libray,所以我已经能够清除源代码以准确理解发生了什么,代码如下:

glBindVertexArray( VAOname_ );
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(indices_[0])) );
glBindVertexArray(0);
Run Code Online (Sandbox Code Playgroud)

因此使用顶点数组对象.我正在尝试修改传递的对象的单个顶点颜色,它似乎工作但是有一个毛刺,如下图所示:

在此输入图像描述

在这里,我试图改变左下和右下顶点的颜色.结果是不同的,我想这是因为四边形被渲染为一对三角形,共享斜边位于从左下顶点到右上顶点的对角线上.所以这可能导致不同的结果.

现在我想对第一个案例也有第二个结果.有没有办法获得它?

opengl colors cocos2d-iphone vertex-array-object

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

将错误与cmake链接

我试图理解为什么在编译用CMake生成的项目时会出现链接错误.

CMakeFiles.txt为项目的每个文件夹构建一个静态库,然后按以下方式将所有文件夹链接在一起:

# root CMakeLists.txt

add_subdirectory(subfolder1)
add_subdirectory(subfolder2)
add_subdirectory(...)

add_executable(target ${SOURCES})

set(LIBRARIES
  LIB_FOO
  LIB_BAR
  ...
)

target_link_libraries(target
  ${LIBRARIES}
)
Run Code Online (Sandbox Code Playgroud)

然后在每个子文件夹中我都有一个简单的CMakeLists.txt之类的

file(GLOB FOO_SOURCE *.cpp)
add_library(LIB_FOO ${FOO_SOURCE})
Run Code Online (Sandbox Code Playgroud)

现在这个工作并编译好一切但我在链接时得到一个未定义的引用,所以我试着调查一下最后是否所有内容都可用,它看起来就是这样.实际错误如下:

libLIB_WORLD.a(World.cpp.o): In function `World::generate(WorldGenOptions)':
World.cpp:(.text+0x803): undefined reference to `MapGenerator::MapGenerator(BlockMap*)'
World.cpp:(.text+0x837): undefined reference to `MapGenerator::generate(bool, WorldGenOptions)'
Run Code Online (Sandbox Code Playgroud)

现在,MapGenerator.cpp是其中的一部分LIB_MAP,所以我检查了文件是否存在并包含符号:

:~$ nm libLIB_MAP.a | grep generate
....
00000000000044dc T _ZN12MapGenerator8generateEb15WorldGenOptions

:~$ nm CMakeFiles/LIB_MAP.dir/MapGenerator.cpp.o | grep generate
....
00000000000044dc T _ZN12MapGenerator8generateEb15WorldGenOptions
Run Code Online (Sandbox Code Playgroud)

所以符号存在,此时我检查它是否被ld正确链接:

:~$ make VERBOSE=1
/usr/bin/g++  ... libLIB_MAP.a libLIB_WORLD.a ...
Run Code Online (Sandbox Code Playgroud)

所以它实际上存在于链接阶段和其他无法找到符号的库中.

有什么小事我不见了吗?我对CMake很新,所以我没有想法.

c++ linker cmake static-libraries

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

“T”不是参数“T”的有效模板类型参数

我编写了一个程序,使用 C++ 类将排序数组转换为 BST。我收到以下错误:

error C2143: syntax error : missing ';' before '*'

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

error C2065: 'T' : undeclared identifier

error C2923: 'Binary_Search_Tree' : 'T' is not a valid template type argument for parameter 'T'
Run Code Online (Sandbox Code Playgroud)

以下是我的程序:

template <class T>
class Binary_Search_Tree {
public:
    struct Bst_Node {
        T value;
        Bst_Node* left;
        Bst_Node* right;
    };

    Bst_Node* root;

    Binary_Search_Tree();

    Bst_Node* sortedarraytobst(T* A, int start, int end);
};

template <class T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates class

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

没有 RTTI 的 dynamic_cast

我有如下结构:

struct managed_object {
  virtual ~managed_object() { }
};

class trait1 {
  public: 
    virtual void myMethod() const = 0;
};

class trait2 {
  public: 
    virtual void myOtherMethod(int x) const = 0;
};

class MyType final : public managed_object, public trait1 {
 ...
};

class MyType2 final : public managed_object, public trait1, public trait2 {
 ...
};

class wrapper {
  private:
    managed_object* ptr;
  public:
    template<typename T> T* object() const { 
      return dynamic_cast<T*>(data.ptr); 
    }
};
Run Code Online (Sandbox Code Playgroud)

所以基本上我有一个managed_object基类,多个类型从中继承。这些子类型中的每一个都可以从特征的任意组合中继承,final因此我确信它们不会有更深层次的继承。

该代码的工作归功于 RTTI,它承担了将所有东西粘合在一起的负担,但要付出代价,否则 …

c++ dynamic-cast multiple-inheritance rtti c++14

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

这是什么时候发生的?线程在关键部分暂停

我只是想知道,如果一个线程处于关键部分,它是否可以被抢占?

  • 线程A:输入CR
  • 线程A:暂停
  • 线程B:想要输入CR但不能,因为线程A有锁

如果线程A抢占,并且互斥锁被线程A卡住,那么可以做些什么呢?

language-agnostic multithreading

3
推荐指数
2
解决办法
782
查看次数

范围交叉/联合

我正在开发一种编程语言,我想提供一种Range数据类型,现在通常不是具有约束条件的int值对的列表.我说并不像通常那样,因为通常一个范围只是一对,但在我的情况下它不仅仅是,允许有例如(x,y)x < y

1 to 5, 7 to 11, 13 to 22
Run Code Online (Sandbox Code Playgroud)

全部包含在一个对象中.

我想提供两个函数来生成并集和两个范围的检测,这两个范围应该包含来自几个范围的最少数量的非重叠区间...例如

1 to 5 || 3 to 8 = 1 to 8
1 to 5 && 3 to 8 = 3 to 5
(1 to 3, 4 to 8) && 2 to 6 = (2 to 3, 4 to 6)
Run Code Online (Sandbox Code Playgroud)

||联合在哪里,&&是交叉点.

现在,他们的实现,如前所述,只是一个列表..我知道存在一个更合适的数据结构(区间树)但是现在我更关心从其他列表的联合/交集构建新列表.

哪些是实现这两个功能的最先进算法?

提前致谢

language-agnostic algorithm union intersection range

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

重新审视包装问题

我正在开发一款游戏,我发现了一个问题,我必须解决这个问题来处理一个类似于包装问题的组件布局.

总结一下我需要做的事情,假设我有一个类似于下面的空间:

+------------+---------+------------+
| 0          | 1       | 2          |
|            |         |            |
|            |         |            |
|            |         |            |
+------------+---------+------------+
| 3          | 4       | 5          |
|            |         |            |
|            |         |            |
+------------+---------+------------+
| 6          | 7       | 8          |
|            |         |            |
|            |         |            |
|            |         |            |
+------------+---------+------------+
Run Code Online (Sandbox Code Playgroud)

其中每个角单元为4x4,而中心单元为3x3(因此其余角单元为3x4和4x3).然后我有一组元素放在这些块中,可以从1x1到3x3不等(我认为还不需要任何4x4,但它不应该改变任何东西).当然,这些元素不能跨越线条,必须完全位于一个块内.

哪个可能是分配它们的最佳方式?如果没有必要,我宁愿不让它们全部粘在一起(例如,如果周围有足够的空间将它们分开,则不要将两个元素放在一起).我正在寻找一个简单的算法,也因为情况非常有限..

奖金问题:假设除了这9个(可能是其他3-4个)之外的其他区块我怎么能比新的区块优先考虑这些区块?(我的意思是在达到填充阈值之前不使用附加块)

当然我正在寻找一般的想法,没有实现:)

language-agnostic algorithm packing knapsack-problem

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

yylineno在yacc文件中始终具有相同的值

对于编译器中的一个项目,我在语法分析器中有一个问题,当我在符号表中添加一个符号时,我在yylineno中总是采用相同的值...

我在开始时这样做了:

%{

    int yylex(void);
    int yyerror(char* yaccProvidedMessage);    
    extern int yylineno;     //i declare yylineno from the lexical analyzer
    extern char *yytext;
    extern FILE *yyin;       

    int scope=0;  
    int max_scope;
%}
Run Code Online (Sandbox Code Playgroud)

在语法中我去符号表中添加一些内容:

lvalue: ID {

        printf("<-ID");     
        add_data_to_symbol_table((char*)($1),scope,yylineno);
        printf("lineNO:%d",yylineno);

        }
        ;
Run Code Online (Sandbox Code Playgroud)

在输出中,当我给出不同行的输入时,它不识别新行

if(x<=2)
{

    if(t<1)
    {
        k=2;   
    }
}
Run Code Online (Sandbox Code Playgroud)

lineNO永远不会改变,总是有1作为价值......

有任何想法吗?

c compiler-construction yacc

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