小编eph*_*ent的帖子

用于C/Unix的参数解析助手

我知道以下内容:

  • 令人尊敬的 getopt(3)
  • 扩展 getopt_long
  • glibc argp用于Unix风格的参数向量的解析器
  • 来自GNOME项目的popt(或其在Glib中的精神继承者)

我确信还有更多我没有使用过甚至没有听过的; 快速谷歌搜索显示Gopt,argtableOptlist.

就个人而言,我argp最喜欢,并且我使用getopt/ 编写的每个程序getopt_long(超出某个复杂的基线)都已转换为使用argp.它比所有GNU风格的约定更加广泛可用popt,比getopt_long文档更强大,更灵活.在缺点方面,它远非最容易使用(由于非常灵活),并且支持它的代码非常冗长(C中的许多内容也是如此).

你用了什么,为什么?

是的,我的意思是C而不是C++.有大量的C++解析器,但我不使用C++.

约翰米利金指出,popt不再维持.我列出它是因为许多程序仍在使用它 - 包括AbiWord,rpm,rsync和samba - 尽管Gnome努力迁移.但我现在也添加了一个指向Glib的参数解析器的链接.


对于C++参数解析,请参阅问题C++有哪些参数解析器库?

c command-line parsing

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

通过HTTPS隧道

在我的工作场所,交通拦截器/防火墙越来越糟糕.我无法连接到22端口的家用机器,缺少ssh访问让我感到难过.我以前能够通过将其移动到端口5050来使用SSH,但我认为最近的一些过滤器现在将此流量视为IM并将其重定向到另一个代理,也许.这是我最好的猜测; 在任何情况下,我的ssh连接现在在我登录之前终止.

这些天我一直在通过HTTPS使用Ajaxterm,因为端口443仍然没有被干扰,但这远非理想.(Sucky终端仿真,缺少端口转发,我的浏览器以惊人的速度泄漏内存......)我尝试设置mod_proxy_connect在上面mod_ssl,CONNECT localhost:22 HTTP/1.1我想通过HTTPS 发送请求,然后我会全部设置.可悲的是,这似乎不起作用; HTTPS连接有效,直到我完成发送请求为止; 然后SSL疯了.看起来好像mod_proxy_connect接管整个连接而不是继续通过mod_ssl,混淆了HTTPS客户端.

有没有办法让这个工作?我不希望通过纯HTTP执行此操作,原因如下:

  • 留下一个像胖子一样大胖的开放代理
  • 一个大胖开放代理也不比HTTPS好,但是需要身份验证才对我感觉良好
  • HTTP通过一个代理 - 我不太关心我的流量被嗅探,因为它是通过隧道将"明白"的ssh - 但它更可能被破坏比HTTPS,从根本上不能被代理

要求:

  • 必须在端口443上工作,而不会干扰其他HTTPS流量(即我不能将ssh服务器放在端口443上,因为我将无法再通过HTTPS提供页面)
  • 我有或可以编写一个在Windows(或Cygwin)下运行的简单端口转发器客户端

编辑

DAG:我已经向我指出了隧道SSH over HTTP(S),但它没有帮助:在文章的最后,他们提到了错误29744 - CONNECT无法通过现有的SSL连接工作,从而阻止通过HTTPS进行隧道传输,我遇到的问题.此时,我可能正在查看一些CGI脚本,但如果有更好的解决方案,我不想将其列为要求.

apache ssh https proxy tunnel

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

为什么内存中A*指数的复杂性?

维基百科在A*复杂性上说如下(链接在这里):

比时间复杂度更有问题的是A*的内存使用率.在最坏的情况下,它还必须记住指数数量的节点.

我没有看到这是正确的,因为:

假设我们探索节点A,后继B,C和D.然后我们将B,C和D添加到开放节点列表中,每个节点都附带一个A的引用,我们将A从开放节点移动到关闭节点.

如果在某个时候我们找到另一条到B的路径(比如通过Q),这比通过A的路径更好,那么所需要的只是将B的引用改为A以指向Q并更新其实际成本g(在逻辑上f).

因此,如果我们在节点中存储其名称,其引用节点名称及其g,h和f分数,那么存储的最大节点数量是图表中的实际节点数量,不是吗?我真的不明白为什么算法在任何时候都需要在内存中存储一​​定数量的节点,这些节点指向最佳(最短)路径的长度.

有人可以解释一下吗?


编辑正如我现在理解的那样阅读你的答案,我是从问题的错误观点推理出来的.我认为给定的图是理所当然的,而指数复杂性是指仅由"分支因子"定义的概念图.

algorithm complexity-theory artificial-intelligence graph a-star

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

语法错误:文件结束意外(期待"fi")

我正在用bash编写一个makefile,我有一个目标,我试图找到一个文件是否存在,即使我认为语法是正确的,我仍然给我一个错误.

这是我试图运行的脚本

read: 
        if [ -e testFile] ; then \ 
        cat testFile\ 
        fi
Run Code Online (Sandbox Code Playgroud)

我正在使用制表符,这不是问题.

错误是(当我输入:"make read")

if [ -e testFile] ; then \
        cat testFile \
        fi
/bin/sh: Syntax error: end of file unexpected (expecting "fi")
make: *** [read] Error 2
Run Code Online (Sandbox Code Playgroud)

bash makefile

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

在C(或C++)中取消引用指针的语法

我有一位同事在C中检查这样的代码(语法#1):

(*(*(*p_member).p_member).p_member).member
Run Code Online (Sandbox Code Playgroud)

当我问他为什么不使用 - >(语法#2)时:

p_member->p_member->p_member->member
Run Code Online (Sandbox Code Playgroud)

他得到了真正的防守,指出语法#2比#1更复杂......我最终改变了他的代码,因为我不得不修改它,不能读它,然后他就疯了,我居然感动呢?

SO社区更喜欢哪种语法?两者都有效,但我发现语法#2更具可读性.

由于问题是主观的,我将此设置为社区维基.

c c++ syntax pointers

11
推荐指数
6
解决办法
3550
查看次数

跨不同框架版本的.NET序列化的稳定性

我正在处理的项目需要在关闭之前序列化数据结构,并在重新启动时从此序列化数据恢复其状态.

去年,我们正在为.NET 1.1构建,并遇到了一个棘手的问题

  • 我们的代码在.NET 2.0上运行
  • 一个客户升级了一些软件,以某种方式将1.1设置为默认值
  • 我们的代码在.NET 1.1上运行,无法反序列化其存储状态

这个特定的问题是通过禁止特定的软件升级而"解决"的,现在我们的目标是.NET 2.0框架(因此我们不能在1.1上运行)应该不是问题.

这个序列化再次在2.0和更新的框架之间再次发生变化的可能性有多大?如果我们使用<supportedVersion>将代码修改为2.0.50727,那么2.0.50727.1434和2.0.50727.nnnn(未来某个版本)之间的变化几率是多少?被序列化的数据结构是来自标准类库的数组,映射,字符串等.

此外,是否可以保证即使在进一步的.NET升级后,也将始终安装2.0.50727框架?微软文档的指针欢迎.

.net serialization versions upgrade stability

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

g ++或gcc选项,用于获取带有警告ID的警告消息

默认情况下,gcc/g ++仅显示包含行号的警告消息.我正在寻找g ++或gcc将构建警告消息与警告ID相关联的选项,以便可以轻松识别警告消息(无需解析).还有更多选项可以获得更详细的警告信息吗?(虽然我认为每个警告信息本身都是解释性的,但只是好奇)

谢谢.

compiler-construction gcc warnings

6
推荐指数
2
解决办法
7793
查看次数

Scala类型推断问题

当我正在思考在以下情况下发生的事情的时候,我只是对托尼·莫里斯对猫咪的优秀演习进行了喋喋不休的讨论 ......

def cata[X](some: A => X, none: => X): X
Run Code Online (Sandbox Code Playgroud)

现在让我称这个方法如下:

def isDefined: Boolean = cata( _ => true, false)
Run Code Online (Sandbox Code Playgroud)

我想知道的类型是否inferencer确定的类型的_ => trueA => BooleanAny => Boolean.由于输入参数Function1反变量的事实,以下两个编译都很好:

def isDefined: Boolean = cata( (_: A) => true, false)    //#1
def isDefined: Boolean = cata( (_: Any) => true, false)  //#2
Run Code Online (Sandbox Code Playgroud)

所以问题是,类型推断器是出现#1还是#2?

scala type-inference catamorphism

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

头文件中的C/C++私有数组初始化

我有一个名为Cal的类,它是.cpp和.h对应的

头文件有

class Cal {
    private:
        int wa[2][2];

    public:
        void do_cal();
};
Run Code Online (Sandbox Code Playgroud)

.cpp文件有

#include "Cal.h"
void Cal::do_cal() {
   print(wa) // where print just itterates and prints the elements in wa
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何初始化数组wa?我似乎无法让它工作.

我尝试过:

int wa[2][2] = {
                {5,2},
                {7,9}
               };
Run Code Online (Sandbox Code Playgroud)

在头文件但我得到错误说我不能这样做因为它反对iso..something.

试图wa在构造函数中初始化数组,但也没有工作..我错过了什么?

谢谢

c++ arrays initialization header

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

如何将vector <int>转换为int*

我必须维持一个自2004年以来没人接触过的计划.

class CSolver
{  
 ...  
 ClauseIdx add_clause (int * lits, int n_lits);
}

void and2 (CSolver & solver)   
{  
vector <int> lits;  
...  
solver.add_clause(lits.begin(), lits.size());  
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说:

错误:没有匹配函数来调用'CSolver :: add_clause(__ gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>,size_t)'

我试着去投它

solver.add_clause((int*)lits.begin(), lits.size());
Run Code Online (Sandbox Code Playgroud)

但仍有一个抱怨:

错误:从类型'__gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>>'输入无效,以输入'int*'

我想快速解决这个问题,因为改变CSolver的界面会导致改变整个程序.

提前致谢.

c++

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