小编dul*_*shi的帖子

在IntelliJ IDEA中何处添加-ea等编译器选项?

我想添加-ea选项.我把它设置在Project Settings- > Compiler- > Java Compiler: Additional command line parameters.

但它造成了一个错误:invalid flag: -ea.PS:上面的错误信息可能与您的不一样,因为IntelliJ显示的是我母语的错误,而不是英语.我把它翻译成英文.

java intellij-idea

50
推荐指数
3
解决办法
3万
查看次数

Linux exec函数:arg0参数用于什么?

这是函数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参数在任何情况下都有意义吗?为什么界面是这样设计的?

c c++ unix linux

9
推荐指数
4
解决办法
1630
查看次数

将变量传递给函数时,为什么函数只获得变量的副本?

将变量传递给函数时,为什么函数只获取变量的副本/副本?

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 ++的设计者引入了复杂的机制来方便地进行权衡.
我对吗?

c c++

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

system("linux_command")与Perl库函数

在Perl中,可以使用Perl内置或使用system()调用shell命令来实现某个目标.问题是,对于我作为Perl初学者,有时很难找到与Linux命令相当的Perl.
以此为例:

cat file1 file2 | sort -u > file3
Run Code Online (Sandbox Code Playgroud)

我真的只想使用Perl函数来制作更多的Perlish,但我不能轻易找到如何在这种情况下避免使用system().

所以我想知道,使用Perl库函数比使用system()调用有什么好处吗?哪种方式更好?

linux perl

7
推荐指数
2
解决办法
286
查看次数

协议缓冲区:从ByteString获取字节数组而不进行复制

假设我有一个方法void foo(byte[] bytes)需要一个字节数组作为参数.Howerver,Protobuf中字节数组的Java类型是ByteString.

我可以byte[] toByteArray()用来获取字节数组.但问题是这个方法使用副本构建一个新的数组,这是相对昂贵的.我宁愿它直接返回底层数组,或者返回一个视图.

是否有任何API,或性能损失是否可以接受?

java protocol-buffers

7
推荐指数
3
解决办法
2455
查看次数

为什么需要类型铸件(UINT)(void*)(DWORD)?

这是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位机器的兼容性事务有一些关系.但我对虚空*感到困惑.

c c++ mfc casting

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

为什么C有这么多不同的类型?

我写了一个简单的计时器函数来计算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_tsuseconds_t

c type-conversion

5
推荐指数
2
解决办法
948
查看次数

Python:list的方法类似于dict.get()

我的问题是在列表中找到连续的'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').

如果我现在必须完成它,我会从其他项目中特别对待第一项和最后两项.但有没有办法优雅地解决这个问题?

python algorithm

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

gdb RuntimeError:漂亮的打印机已经注册:libstdc ++ - v6

我正在使用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)

python gdb codeblocks

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

在Emacs中使用gdb:始终显示源代码

我是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模式一样。

c c++ emacs

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

当按名称引用时,存储的名称在哪里?

例如,在我们定义变量之后:

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"的内存的行为?

c c++ variables

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

这里文档:没有参数扩展

有没有办法关闭这里文档中的参数扩展?

外壳命令:

$ 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)

linux bash shell

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

如何为堆中的char []赋值?

我的代码出现了_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);.

c c++

0
推荐指数
2
解决办法
440
查看次数