- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为编译器生成中间代码。我在 macOS 上使用 flex-bison。当我尝试输入时出现语法错误,我不知道该语法错误从何而来。
这是我的语法:
%{
#include<stdbool.h>
#include <stdlib.h>
#include <string.h>
//#include "LinkedList.h"
#include "parser.tab.h"
char* tempString;
%}
%option yylineno
whole 0|[1-9][0-9]*
real {whole}\.(([0-9])|([0-9][0-9]*[1-9]))
divisionop [/]
noSymbol [^ \t\n\/\+\-\*\:\;\,\(\)\.]
error {noSymbol}+
%%
[ \t\n\r]+ ;
\#[-+]?{whole}/[\ :\,\;\+\-\/\*\)\n\r]|".GT."|".GE."|".EQ."|".NE."|".LT."|".LE."|":=" {
char* string = (char*) malloc(strlen(yytext));
strcpy(string, yytext + 1);
string[strlen(string)] = 0;
//printf("Found integer : %d\n", atoi(string));
//push(string,INTEGER,yylineno);
return INTEGER;}
\#[-+]?{real}/[\ :\,\;\+\-\/\*\)\n\r]|".GT."|".GE."|".EQ."|".NE."|".LT."|".LE."|":=" {
char* string = (char*) malloc(strlen(yytext));
strcpy(string, yytext + 1);
string[strlen(string)] = 0;
//printf("Found real:%s\n",string);
//push(string,REAL,0);
return REALNUM;
}
[a-zA-Z][0-9][0-9a-zA-Z]* {
//printf("Found identifier:%s\n",yytext);
//yylval.str = yytext;
//printf("****lvalue is:%s\n",yylval.str);
//push(yytext,IDENTIFIER,yylineno);
tempString = (char*) malloc(strlen(yytext));
strcpy(tempString, yytext);
return IDENTIFIER;
}
Program {
//printf("Found program :%s\n",yytext);
return PROGRAM;
}
Int {
//printf("Found int :%s\n",yytext);
return INT;
}
Real {
//printf("Found real :%s\n",yytext);
return REAL;
}
Bool {
//printf("Found bool :%s\n",yytext);
return BOOL;
}
Procedure {
//printf("Found real :%s\n",yytext);
return PROCEDURE;
}
Function {
//printf("Found function :%s\n",yytext);
return FUNCTION;
}
Begin {
//printf("Found begin :%s\n",yytext);
return BEGINN;
}
End {
//printf("Found end :%s\n",yytext);
return END;
}
If {
//printf("Found if :%s\n",yytext);
return IF;
}
Then {
//printf("Found then :%s\n",yytext);
return THEN;
}
Else {
//printf("Found else :%s\n",yytext);
return ELSE;
}
While {
//printf("Found while :%s\n",yytext);
return WHILE;
}
Do {
//printf("Found do :%s\n",yytext);
return DO;
}
For {
//printf("Found for :%s\n",yytext);
return FOR;
}
To {
//printf("Found to :%s\n",yytext);
return TO;
}
Downto {
//printf("Found downto :%s\n",yytext);
return DOWNTO;
}
Case {
//printf("Found case :%s\n",yytext);
return CASE;
}
Return {
//printf("Found return :%s\n",yytext);
return RETURN;
}
"And Then" {
//printf("Found andthen :%s\n",yytext);
//push(yytext,ANDTHEN,yylineno);
return ANDTHEN;
}
"Or Else" {
//printf("Found andthen :%s\n",yytext);
//push(yytext,ORELSE,yylineno);
return ORELSE;
}
"+" {
//printf("Found plus :%s\n",yytext);
return PLUS;
}
\- {
//printf("Found minus :%s\n",yytext);
return MINUS;
}
\* {
//printf("Found multiply :%s\n",yytext);
return MULTIPLY;
}
{divisionop} {
//printf("Found division :%s\n",yytext);
//push(yytext,DIVISION,yylineno);
return DIVISION;
}
".GT." {
//printf("Found greaterthan :%s\n",yytext);
return GREATERTHAN;
}
".GE." {
//printf("Found greaterequal :%s\n",yytext);
return GREATEREQUAL;
}
\.NE\. {
//printf("Found notequal :%s\n",yytext);
return NOTEQUAL;
}
\.EQ\. {
//printf("Found EQUAL :%s\n",yytext);
return EQUAL;
}
\.LT\. {
//printf("Found lessthan :%s\n",yytext);
return LESSTHAN;
}
\.LE\. {
//printf("Found lessequal :%s\n",yytext);
return LESSEQUAL;
}
[,] {
//printf("Found comma :%s\n",yytext);
return COMMA;
}
":=" {
//printf("Found declare :%s\n",yytext);
return DECLARE;
}
[:] {
//printf("Found semicolon :%s\n",yytext);
return COLON;
}
[;] {
//printf("Found semicolon :%s\n",yytext);
return SEMICOLON;
}
\( {
//printf("Found oppar :%s\n",yytext);
return OPPAR;
}
\) {
//printf("Found cppar :%s\n",yytext);
return CPAR;
}
False {
//printf("Found false :%s\n",yytext);
return FALSE;
}
True {
//printf("Found true :%s\n",yytext);
return TRUE;
}
{error} {
printf("Error on : **<< %s >>**\n", yytext);
//yymore();
}
\. {
printf("Error on : **<< illegal use of \" %s \" >>**\n", yytext);
//yymore();
}
%%
int yywrap(){
return 1;
}
//int main(){
// yyin = fopen("input2P.txt", "r");
// initLinkedList(table);
// while(yylex());
// printLinkedList();
// return 0;
//}
这是我的 parser.y
%{
#include<stdio.h>
#include "stack.h"
//#include "LinkedList.h"
//#include "symbol_table.h"
int currentType;
char* returnType;
extern FILE* yyin;
extern char* tempString;
struct Stack* tblptrStack;
char* new_temp(char *c) {
string name("t");
name += to_string(num);
num++;
char *what = (char *) malloc(sizeof(char) * 100);
strcpy(what, name.c_str());
symbol_table_insert(what, c);
strcpy(what, symbol_table_lookup(what).id.c_str());
return what;
}
int yylex();
void yyerror(char* error);
struct SymbolTable* secondArg(struct SymbolTable* a,struct SymbolTable* b );
%}
%union{
char *str;
struct {
int quad;
int is_boolean;
char *place;
char *code;
char *type;
} eval;
}
}
%start program
%token INTEGER
%token ZERO
%token REALNUM
%token PROGRAM
%token INT
%token REAL
%token BOOL
%token PROCEDURE
%token FUNCTION
%token BEGINN
%token END
%token IF
%token THEN
%token ELSE
%token WHILE
%token DO
%token FOR
%token TO
%token DOWNTO
%token CASE
%token RETURN
%token ANDTHEN
%token ORELSE
%token IDENTIFIER
%token PLUS
%token MINUS
%token MULTIPLY
%token DIVISION
%token GREATERTHAN
%token GREATEREQUAL
%token NOTEQUAL
%token EQUAL
%token LESSTHAN
%token LESSEQUAL
%token COMMA
%token SEMICOLON
%token COLON
%token DECLARE
%token OPPAR
%token CPAR
%token FALSE
%token TRUE
%token ERROR
%type <eval> exp
%left COMMA
%left INT BOOL REAL
%left COLON
%left IF_PREC
%left ELSE
%left ANDTHEN ORELSE
%left PLUS MINUS
%left MULTIPLY DIVISION
%left GREATERTHAN GREATEREQUAL NOTEQUAL EQUAL LESSTHAN LESSEQUAL
%%
program:
PROGRAM IDENTIFIER M SEMICOLON declist block SEMICOLON {
printf("\nin program\n"); allSymbolTablePrint( pop(tblptrStack) );
}
| PROGRAM IDENTIFIER M SEMICOLON block SEMICOLON {
printf("\nin program\n"); allSymbolTablePrint( pop(tblptrStack) );
}
;
M:
{
struct SymbolTable* t = mkTable( NULL , "program");
push(t, tblptrStack);
}
;
declist:
dec
| declist dec
;
dec :
vardec {printf("var deccc");}
| procdec
| funcdec
;
type :
INT {
currentType=4;
returnType = (char*) malloc(strlen("INT"));
strcpy(returnType, "INT");
printf("this is int");
}
| REAL {
currentType=8;
returnType = (char*) malloc(strlen("REAL"));
strcpy(returnType, "REAL");
}
|BOOL {
currentType=1;
returnType = (char*) malloc(strlen("BOOL"));
strcpy(returnType, "BOOL");
}
;
iddec :
IDENTIFIER { enterVar( tempString, currentType , 0 , top(tblptrStack) ); printf("a variable entered:%s\n",tempString); }
| IDENTIFIER { enterVar( tempString, currentType , 0 , top(tblptrStack) ); printf("a variable entered:%s\n",tempString); } DECLARE {
printf("this is declare eeee");
} exp
;
idlist :
iddec {printf("this is idlist iddec");}
| idlist COMMA iddec
;
vardec :
type idlist SEMICOLON
{printf("vardec");}
;
procdec :
PROCEDURE IDENTIFIER NP OPPAR paramdecs CPAR declist block SEMICOLON {
char* tmpc = top(tblptrStack)->name;
struct SymbolTable* tmpt = pop(tblptrStack);
enterProcFunc( tmpc , 0 , "NULL" , tmpt , top(tblptrStack) );
}
| PROCEDURE IDENTIFIER NP OPPAR paramdecs CPAR block SEMICOLON {
char* tmpc = top(tblptrStack)->name;
struct SymbolTable* tmpt = pop(tblptrStack);
enterProcFunc( tmpc , 0 , "NULL" , tmpt , top(tblptrStack) );
}
;
NP:
{
printf("inside NP\t tempString:%s\n",tempString);
struct SymbolTable* t = mkTable( top(tblptrStack) , tempString );
push(t, tblptrStack);
}
;
funcdec :
FUNCTION IDENTIFIER FN OPPAR paramdecs CPAR COLON type {
char* tmpc = top(tblptrStack)->name;
struct SymbolTable* tmpt = pop(tblptrStack);
enterProcFunc(tmpc , -1 , returnType , tmpt , top(tblptrStack) );
} declist block SEMICOLON
| FUNCTION IDENTIFIER FN OPPAR paramdecs CPAR COLON type {
char* tmpc = top(tblptrStack)->name;
struct SymbolTable* tmpt = pop(tblptrStack);
enterProcFunc(tmpc , -1 , returnType , tmpt , top(tblptrStack) );
} block SEMICOLON
;
FN:
{
printf("inside FN\t tempString:%s\n",tempString);
struct SymbolTable* t = mkTable( top(tblptrStack) , tempString );
push(t, tblptrStack);
}
;
paramdecs :
paramdec { printf("paramdecs"); }
| paramdecs SEMICOLON paramdec { printf("paramdecs\n"); }
| { printf("paramdecs\n"); }
;
paramdec :
type paramlist
;
paramlist :
IDENTIFIER
| paramlist COMMA IDENTIFIER
;
block :
BEGINN stmtlist END
| stmt
;
stmtlist :
stmt
| stmtlist SEMICOLON stmt
;
lvalue :
IDENTIFIER
;
stmt :
lvalue DECLARE exp
| IF exp THEN block %prec IF_PREC
| IF exp THEN block ELSE block %prec ELSE
| WHILE exp DO block
| FOR lvalue DECLARE exp TO exp DO block
| FOR lvalue DECLARE exp DOWNTO exp DO block
| CASE exp caseelement END
| RETURN exp
| exp {printf(stmt exp);}
;
exp :
exp ANDTHEN exp
| exp ORELSE exp
| exp PLUS exp {
printf("Rule \t\t mathlogicExpression -> mathlogicExpression KW_PLUS mathlogicExpression\n");
$$.place = new_temp($1.type);
$$.type = $1.type;
printf($1.place, $3.place, "+", $$.place);
};
| exp MINUS exp
| exp MULTIPLY exp { printf(" RULE FOR MULTIPLY\n");}
| exp DIVISION exp
| OPPAR exp CPAR
| boolexp relop boolexp
| INTEGER {printf("this is integerrrr");}
| REALNUM
| TRUE
| FALSE
| lvalue
| IDENTIFIER OPPAR explist CPAR
;
boolexp:
OPPAR exp CPAR
| INTEGER
| REALNUM
| TRUE
| FALSE
| lvalue
| IDENTIFIER OPPAR explist CPAR
;
caseelement :
INTEGER COLON block SEMICOLON
| caseelement INTEGER COLON block SEMICOLON
;
explist :
exp
| explist COMMA exp
|
;
relop :
GREATERTHAN
| GREATEREQUAL
| NOTEQUAL
| EQUAL
| LESSTHAN
| LESSEQUAL
;
%%
struct SymbolTable* popTop(struct Stack* b ){
pop(b);
top(b);
}
int main(){
//printf("hi1");
tblptrStack=createStack();
tblptrStack->top = NULL;
//printf("hi2");
yyin = fopen("input3.txt", "r");
//printf("hi3");
yyparse();
return 0;
}
void yyerror(char* error){
printf("Error : %s\n", error);
}
我试过这个输入例如:
Program p1Main;
Int i1, i2:=#-23;
Begin
i1 := i1 + i2;
End
;
我得到这个错误
a variable entered:i1
a variable entered:i2
Error : syntax error
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
我试图用 printf
来找出这个语法错误的来源,但我没有得到任何结果。我看过其他类似的问题并尝试了他们的解决方案,但没有奏效。如果你知道如何解决这个问题,请帮助我。
最佳答案
您收到语法错误,因为您的输入程序在语法上不正确,而解析器工作正常。
(修剪过的)语法将程序显示为:
program: PROGRAM IDENTIFIER M SEMICOLON declist block SEMICOLON
它显示一个 block :
block :
BEGINN stmtlist END
| stmt
;
随后的语句列表是:
stmtlist :
stmt
| stmtlist SEMICOLON stmt
;
在这里,您会看到分号是语句分隔符而不是终止符。这意味着在 END 之前永远不能有分号。不管你是怎么做的:
Begin
i1 := i1 + i2;
End
所以你必须决定哪种语言是正确的解释;你的语法或你的输入程序。初学者经常犯这个错误,有经验的程序员或老师需要几秒钟才能发现。你怎么能用 Bison 来学习这个?我将在下面添加该详细信息......
你怎么能自己找到这个?嗯,下面rules of Stack Overflow本来是一个好的开始。您没有将代码示例减少到解释问题所需的最低限度。你只是把所有的东西都扔进了你的问题中,然后就放弃了,把它交给了我们。
一个好学生怎么能简化这个问题。您可以做的一件事是简化对解析器的测试输入并尝试越来越简单的输入程序。例如,问问自己“错误是发生在声明中还是代码块中?”。 “如果我使用没有声明的更简单的程序会怎样?”。使用这种形式的推导,您可能能够推断出故障位于 BLOCK 中的某处。您可以尝试与 BLOCK 和语句列表中的不同规则相匹配的示例,以查看哪些备选方案有效,哪些无效,并最终找到导致问题的规则。
然后您可以创建一个更小的语法、词法分析器和测试程序以粘贴到 Stack Overflow 中,它解释了失败的特定语法规则的特定问题,并在此时寻求帮助。然而,通常,在创建较小示例的过程中,问题和解决方案会自行暴露。
找出导致问题的原因的一种更强大的程序化方法是使用 bison 中内置的调试功能。 Bison 有一个测试模式,它通过使用 -t 参数运行 bison 并在运行时设置 yydebug 变量来启用。这将生成详细的解析跟踪,准确显示导致错误的输入符号和规则。我将在下一期中向您展示生成的内容...
好的。在您粘贴的代码出现一些问题后,我现在已经生成了所需的输出。您错误地将无效代码粘贴到问题中。 parser.y 的第 41 行有一个额外的“}”,我不得不删除它,我们没有你的 stack.h。我不得不删除你所有的语义 Action 来显示语法调试。无论如何,在这样做并在启用 bison 调试的情况下运行后,我们得到以下结果(在我的 Mac 上):
briantompsett:~ cssbct$ gcc parser.tab.c lex.yy.c -ll -o parser
briantompsett:~ cssbct$ ./parser
Starting parse
Entering state 0
Reading a token: Program p1Main;
Int i1, i2:=#-23;
Begin
i1 := i1 + i2;
End
;Next token is token PROGRAM ()
Shifting token PROGRAM ()
Entering state 1
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 3
Reducing stack by rule 3 (line 108):
-> $$ = nterm M ()
Stack now 0 1 3
Entering state 5
Reading a token: Next token is token SEMICOLON ()
Shifting token SEMICOLON ()
Entering state 6
Reading a token: Next token is token INT ()
Shifting token INT ()
Entering state 9
Reducing stack by rule 9 (line 122):
$1 = token INT ()
-> $$ = nterm type ()
Stack now 0 1 3 5 6
Entering state 26
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 50
Reading a token: Next token is token COMMA ()
Reducing stack by rule 12 (line 133):
$1 = token IDENTIFIER ()
-> $$ = nterm iddec ()
Stack now 0 1 3 5 6 26
Entering state 51
Reducing stack by rule 15 (line 139):
$1 = nterm iddec ()
-> $$ = nterm idlist ()
Stack now 0 1 3 5 6 26
Entering state 52
Next token is token COMMA ()
Shifting token COMMA ()
Entering state 82
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 50
Reading a token: Next token is token DECLARE ()
Shifting token DECLARE ()
Entering state 81
Reducing stack by rule 13 (line 134):
-> $$ = nterm @1 ()
Stack now 0 1 3 5 6 26 52 82 50 81
Entering state 110
Reading a token: Next token is token INTEGER ()
Shifting token INTEGER ()
Entering state 7
Reading a token: Next token is token SEMICOLON ()
Reducing stack by rule 52 (line 206):
$1 = token INTEGER ()
-> $$ = nterm exp ()
Stack now 0 1 3 5 6 26 52 82 50 81 110
Entering state 124
Next token is token SEMICOLON ()
Reducing stack by rule 14 (line 134):
$1 = token IDENTIFIER ()
$2 = token DECLARE ()
$3 = nterm @1 ()
$4 = nterm exp ()
-> $$ = nterm iddec ()
Stack now 0 1 3 5 6 26 52 82
Entering state 111
Reducing stack by rule 16 (line 140):
$1 = nterm idlist ()
$2 = token COMMA ()
$3 = nterm iddec ()
-> $$ = nterm idlist ()
Stack now 0 1 3 5 6 26
Entering state 52
Next token is token SEMICOLON ()
Shifting token SEMICOLON ()
Entering state 83
Reducing stack by rule 17 (line 143):
$1 = nterm type ()
$2 = nterm idlist ()
$3 = token SEMICOLON ()
-> $$ = nterm vardec ()
Stack now 0 1 3 5 6
Entering state 27
Reducing stack by rule 6 (line 117):
$1 = nterm vardec ()
-> $$ = nterm dec ()
Stack now 0 1 3 5 6
Entering state 25
Reducing stack by rule 4 (line 113):
$1 = nterm dec ()
-> $$ = nterm declist ()
Stack now 0 1 3 5 6
Entering state 24
Reading a token: this is idlist iddecthis is declare eeeethis is integerrrrvardecvar decccNext token is token BEGINN ()
Shifting token BEGINN ()
Entering state 14
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 20
Reading a token: Next token is token DECLARE ()
Reducing stack by rule 34 (line 184):
$1 = token IDENTIFIER ()
-> $$ = nterm lvalue ()
Stack now 0 1 3 5 6 24 14
Entering state 31
Next token is token DECLARE ()
Shifting token DECLARE ()
Entering state 54
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 20
Reading a token: Next token is token PLUS ()
Reducing stack by rule 34 (line 184):
$1 = token IDENTIFIER ()
-> $$ = nterm lvalue ()
Stack now 0 1 3 5 6 24 14 31 54
Entering state 39
Next token is token PLUS ()
Reducing stack by rule 56 (line 210):
$1 = nterm lvalue ()
-> $$ = nterm exp ()
Stack now 0 1 3 5 6 24 14 31 54
Entering state 84
Next token is token PLUS ()
Shifting token PLUS ()
Entering state 57
Reading a token: Next token is token IDENTIFIER ()
Shifting token IDENTIFIER ()
Entering state 20
Reading a token: Next token is token SEMICOLON ()
Reducing stack by rule 34 (line 184):
$1 = token IDENTIFIER ()
-> $$ = nterm lvalue ()
Stack now 0 1 3 5 6 24 14 31 54 84 57
Entering state 39
Next token is token SEMICOLON ()
Reducing stack by rule 56 (line 210):
$1 = nterm lvalue ()
-> $$ = nterm exp ()
Stack now 0 1 3 5 6 24 14 31 54 84 57
Entering state 87
Next token is token SEMICOLON ()
Reducing stack by rule 46 (line 200):
$1 = nterm exp ()
$2 = token PLUS ()
$3 = nterm exp ()
-> $$ = nterm exp ()
Stack now 0 1 3 5 6 24 14 31 54
Entering state 84
Next token is token SEMICOLON ()
Reducing stack by rule 35 (line 187):
$1 = nterm lvalue ()
$2 = token DECLARE ()
$3 = nterm exp ()
-> $$ = nterm stmt ()
Stack now 0 1 3 5 6 24 14
Entering state 38
Reducing stack by rule 32 (line 180):
$1 = nterm stmt ()
-> $$ = nterm stmtlist ()
Stack now 0 1 3 5 6 24 14
Entering state 37
Next token is token SEMICOLON ()
Shifting token SEMICOLON ()
Entering state 71
Reading a token: Next token is token END ()
Error : syntax error
Error: popping token SEMICOLON ()
Stack now 0 1 3 5 6 24 14 37
Error: popping nterm stmtlist ()
Stack now 0 1 3 5 6 24 14
Error: popping token BEGINN ()
Stack now 0 1 3 5 6 24
Error: popping nterm declist ()
Stack now 0 1 3 5 6
Error: popping token SEMICOLON ()
Stack now 0 1 3 5
Error: popping nterm M ()
Stack now 0 1 3
Error: popping token IDENTIFIER ()
Stack now 0 1
Error: popping token PROGRAM ()
Stack now 0
Cleanup: discarding lookahead token END ()
Stack now 0
您会看到它现在停在 END 之前的分号处,如跟踪的这一部分所示:
Next token is token SEMICOLON ()
Shifting token SEMICOLON ()
Entering state 71
Reading a token: Next token is token END ()
Error : syntax error
Error: popping token SEMICOLON ()
这就是您以后应该如何调试。
关于c - 使用此语法在 flex/bison 中获取语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56143165/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!