我正在开发一种脚本语言,它可以编译自己的虚拟机,这是一个简单的脚本语言,可以处理某些数据,如点,向量,浮点数等等.内存单元以这种方式表示:
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) 我想知道如何在用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) 我正在尝试着色通过的四边形顶点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)
因此使用顶点数组对象.我正在尝试修改传递的对象的单个顶点颜色,它似乎工作但是有一个毛刺,如下图所示:

在这里,我试图改变左下和右下顶点的颜色.结果是不同的,我想这是因为四边形被渲染为一对三角形,共享斜边位于从左下顶点到右上顶点的对角线上.所以这可能导致不同的结果.
现在我想对第一个案例也有第二个结果.有没有办法获得它?
我试图理解为什么在编译用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++ 类将排序数组转换为 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) 我有如下结构:
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,它承担了将所有东西粘合在一起的负担,但要付出代价,否则 …
我只是想知道,如果一个线程处于关键部分,它是否可以被抢占?
如果线程A抢占,并且互斥锁被线程A卡住,那么可以做些什么呢?
我正在开发一种编程语言,我想提供一种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)
||联合在哪里,&&是交叉点.
现在,他们的实现,如前所述,只是一个列表..我知道存在一个更合适的数据结构(区间树)但是现在我更关心从其他列表的联合/交集构建新列表.
哪些是实现这两个功能的最先进算法?
提前致谢
我正在开发一款游戏,我发现了一个问题,我必须解决这个问题来处理一个类似于包装问题的组件布局.
总结一下我需要做的事情,假设我有一个类似于下面的空间:
+------------+---------+------------+
| 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个)之外的其他区块我怎么能比新的区块优先考虑这些区块?(我的意思是在达到填充阈值之前不使用附加块)
当然我正在寻找一般的想法,没有实现:)
对于编译器中的一个项目,我在语法分析器中有一个问题,当我在符号表中添加一个符号时,我在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作为价值......
有任何想法吗?