我想添加-ea选项.我把它设置在Project Settings- > Compiler- > Java Compiler: Additional command line parameters.
但它造成了一个错误:invalid flag: -ea.PS:上面的错误信息可能与您的不一样,因为IntelliJ显示的是我母语的错误,而不是英语.我把它翻译成英文.
这是函数execlp的原型:
int execlp(const char *file, const char *arg, ...);
Run Code Online (Sandbox Code Playgroud)
手册页说,arg(按照惯例,"arg0" 的第一个参数应该指向与正在执行的文件相关联的文件名.)
然后我做了这些实验:
/*These three lines all produce the expected result:
. .. a.out main.c */
execlp("ls", "ls", "-a", 0);
execlp("ls", "arg0 is meaningless", "-a" , 0);
execlp("ls", "", "-a" , 0);
/*But this one does not work:
a.out main.c */
execlp("ls", "-a" , 0);
Run Code Online (Sandbox Code Playgroud)
所以问题是,arg0参数在任何情况下都有意义吗?为什么界面是这样设计的?
将变量传递给函数时,为什么函数只获取变量的副本/副本?
int n=1;
void foo(int i)
{
i++;
}
Run Code Online (Sandbox Code Playgroud)
众所周知,函数foo()不能通过n使用foo(n)来改变它的值.
当然我们可以传递变量的地址来对参数变量进行一些更改.
但是你不觉得这有点不方便吗?
为什么c/c ++只是为了给函数提供重复而不是直接将"真实"变量本身赋给函数?
这种范式的优点/好处是什么?
更新:
我已经阅读了@ paxdiablo的回答.我认为他的"封装,模块化和效果本地化"的解释是好的.
但在我的方式,它也可以保留参数参数的值.它还可以实现封装.通过这种方式:(假设函数可以直接获取"真实"变量而不是默认的重复)
void foo(int n)
{
int temp=n;
//Do something to temp...
}
Run Code Online (Sandbox Code Playgroud)
在我的方式中,当你想要改变传入的参数值时,可以消除复杂的机制,例如"通过引用传递"或指针.这就是好处.
经过一段时间的思考.我意识到为什么c/c ++没有像我提出的那样设计的原因只是因为我的方式的不合理!
按照我的方式,如果一个函数有很长的变量列表,那就太可怕了.我想要的是更方便的方式实际上不方便:
你必须这样写:
void foo(int a,int b,double c,float d,char s...)
{
int temp1=a;
int temp2=b;
double temp3=c;
float temp4=d;
char temp5=s;
...
//Do something to temp{1,2,3,4,5....}
}
Run Code Online (Sandbox Code Playgroud)
因此,c/c ++的设计者引入了复杂的机制来方便地进行权衡.
我对吗?
在Perl中,可以使用Perl内置或使用system()调用shell命令来实现某个目标.问题是,对于我作为Perl初学者,有时很难找到与Linux命令相当的Perl.
以此为例:
cat file1 file2 | sort -u > file3
Run Code Online (Sandbox Code Playgroud)
我真的只想使用Perl函数来制作更多的Perlish,但我不能轻易找到如何在这种情况下避免使用system().
所以我想知道,使用Perl库函数比使用system()调用有什么好处吗?哪种方式更好?
假设我有一个方法void foo(byte[] bytes)需要一个字节数组作为参数.Howerver,Protobuf中字节数组的Java类型是ByteString.
我可以byte[] toByteArray()用来获取字节数组.但问题是这个方法使用副本构建一个新的数组,这是相对昂贵的.我宁愿它直接返回底层数组,或者返回一个视图.
是否有任何API,或性能损失是否可以接受?
这是MFC的CMap类中的默认HashKey函数.
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
??// default identity hash - works for most primitive values
??return ((UINT)(void*)(DWORD)key) >> 4;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么需要类型转换(DWORD)和(void*)?我猜(DWORD)可能与16位机器的兼容性事务有一些关系.但我对虚空*感到困惑.
我写了一个简单的计时器函数来计算start和之间经过的时间end
double mytimer(struct timeval *start, struct timeval *end)
{
return (end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec)*1e-6;
}
Run Code Online (Sandbox Code Playgroud)
gcc给出以下警告:
警告:从'__suseconds_t'转换为'double'可能会改变其值
警告:从'__time_t'转换为'double'可能会改变其值
以下是timeval的定义:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么C定义了这么多不兼容的类型而不是简单地使用原始类型如int short...?它根本不是用户友好的.
我如何对这些类型进行算术运算?
大多数人似乎忽略了我的第二个问题.什么是添加两种不同的类型,如标准的方式time_t和suseconds_t?
我的问题是在列表中找到连续的'3'.例如list('133233313333').难以理解的是只有两个相邻的'3'是有效的,三个或更多相邻的'3'不是.因此'33'是有效的,但三重'3'和'3333'无效.我首先尝试了以下内容:
try:
if l[i] == '3' and l[i+1] == '3' and l[i+2] != '3' and l[i-1] != '3':
record_current(i)
except IndexError:
pass
Run Code Online (Sandbox Code Playgroud)
我的目的是忽略比较,如果存在IndexError,它就是真的,但它不起作用.
如果list有一个类似dict.get()的方法,它返回None,那么就是KeyError,我可以把它写成(l[i+2] == None or l[i+2] != '3').
如果我现在必须完成它,我会从其他项目中特别对待第一项和最后两项.但有没有办法优雅地解决这个问题?
我正在使用Code :: Blocks并希望启用gdb python.所以我按照C :: B wiki http://wiki.codeblocks.org/index.php?title=Pretty_Printers进行配置.
我的pp.gdb与wiki中的相同,只不过我将路径替换为printer.py的路径.
python
import sys
sys.path.insert(0, 'C:/Program Files (x86)/mingw-builds/x32-4.8.1-posix-dwarf-rev3/mingw32/share/gcc-4.8.1/python/libstdcxx/v6')
from printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
Run Code Online (Sandbox Code Playgroud)
然后我测试了它:
(gdb) source C:\Program Files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\bin\pp.gdb
Run Code Online (Sandbox Code Playgroud)
并且错误消息显示:
Traceback (most recent call last):
File "<string>", line 4, in <module>
File "C:/Program Files (x86)/mingw-builds/x32-4.8.1-posix-dwarf-rev3/mingw32/
share/gcc-4.8.1/python/libstdcxx/v6/printers.py", line 911, in register_libstdcxx_printers
gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
File "c:\program files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\
share\gdb/python/gdb/printing.py", line 146, in register_pretty_printer
printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
C:\Program Files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\bin\pp.gd
b:6: Error in sourced command file:
Error while executing …Run Code Online (Sandbox Code Playgroud) 我是Vim用户,对Emacs不太了解。我对Emacs感兴趣,因为我发现在Emacs中进行调试会更加愉快。例如,它提供语法高亮显示,并且我可以使用鼠标设置断点。
除非printf遇到任何情况,否则一切正常。
用于说明的简单代码:
1 #include <stdio.h>
2
3 int main()
4 {
5 int a = 1;
6 printf("%d\n", a);
7 int b = 2;
8 return 0;
9 }
Run Code Online (Sandbox Code Playgroud)
emacs main.c
左下角单击
Mx gdb [return] [return]
(gdb)b 6
(gdb)r
到目前为止,源代码显示在上半部分,而gdb提示显示在下半部分。这正是我想要的。
(gdb)n
现在源代码消失了,上半部分用来显示stdout。这真的很不方便。我希望标准输出显示在gdb缓冲区中,而源则保留在较高的缓冲区中,就像gdb -tui模式一样。
例如,在我们定义变量之后:
int a=2;
Run Code Online (Sandbox Code Playgroud)
之后我们可以使用"a"作为2.
在我第一次学习c/c ++的时候,我认为这是理所当然的.
但在我学会了"指针"的概念和变量的地址之后,我很困惑.
如果int* p=&i;,"i"是int.我知道p具有i的地址,所以我们可以使用*p来获取i的值.但如果我们走得更远,"p"如何被访问?看来p必须用名字引用,对吗?
到目前为止,通过其地址访问变量对我来说更自然,更容易理解.
但现在,当使用最简单的方法访问变量时,我对机制感到困惑.
与情况一样int a=2;,名称"a"存储在哪里?
为什么我们使用"a",它相当于访问存储"a"或"2"的内存的行为?
有没有办法关闭这里文档中的参数扩展?
外壳命令:
$ cat > analyze.sh <<EOF
awk -F: '{print $NF}' asr.log | sort > tmp
awk -F '(' '{print $NF}' asr.log | awk '{print $1}' | sort > tmp2
EOF
Run Code Online (Sandbox Code Playgroud)
我在analyze.sh中得到了这个:
awk -F: '{print }' asr.log | sort > tmp
awk -F '(' '{print }' asr.log | awk '{print }' | sort > tmp2
Run Code Online (Sandbox Code Playgroud) 我的代码出现了_CrtIsValidHeapPointer错误.我终于找出了造成麻烦的原因.
我用下面的例子来说明它:
char* c=(char*)malloc(20*sizeof(char));
//cout<<&c<<endl;
c="hello world";
//cout<<&c<<endl; //if you uncomment the 2 clauses,you'll see the address is the same
//which means the string literal is in the heap
cout<<c<<endl;
free(c);
Run Code Online (Sandbox Code Playgroud)
1)字符串文字使用的空格似乎无法释放?为什么?
2)你用什么方法将valee分配给char数组?
ps:我使用sprintf(c,"hello world");它工作正常.但是更好的方法呢?
看完答案后.我意识到我误解了&c的含义.
我应该用printf("%p\n",c);.