小编Gre*_*ill的帖子

为什么在C/C++/C#/ Java等命令式或OO语言中不存在交换/交换运算符?

我总是想知道为什么这样一个简单而基本的操作,比如交换两个变量的内容,并不是内置于许多语言中的.

它是计算机科学课程中最基本的编程练习之一; 它在很多算法中被大量使用(例如排序); 每隔一段时间就需要它,并且必须使用临时变量或使用模板/泛型函数.

它甚至是许多处理器上的基本机器指令,因此具有临时变量的标准方案将得到优化.

已经创建了许多不太明显的运算符,例如赋值运算符(例如+ =,可能是为了反映累积的机器指令而创建的,例如添加ax,bx),或者?? C#中的运算符.

那么,原因是什么?或者它确实存在,我总是错过它?

programming-languages language-design

8
推荐指数
2
解决办法
817
查看次数

我应该如何关闭信号处理程序中的套接字?

我正在写一个非常简单的服务器,它会一直循环,直到按下Ctrl-C.我想让ctrl-c的信号处理程序关闭打开的套接字并关闭服务器,但我不知道信号处理程序的范围是什么,我不喜欢声明套接字的想法(s)我需要接近全球化.

有人可以提供建议吗?有没有一些标准的方法来做到这一点?

sockets signals interrupt

8
推荐指数
2
解决办法
7886
查看次数

Python 3的开发和分发挑战

假设我开发了一个用Python编写的通用最终用户实用程序.以前,我只有一个版本适用于Python 2.3之后的版本.可以说,"如果需要,请下载Python,然后运行此脚本".源代码管理中只有一个版本的脚本(我正在使用Git)来跟踪.

使用Python 3,这不再是必然的.在可预见的未来,我需要同时开发两个不同的版本,一个适用于Python 2.x,另一个适用于Python 3.x. 从发展的角度来看,我可以想到几个选择:

  1. 在同一分支中维护两个不同的脚本,同时对两者进行改进.
  2. 维护两个独立的分支,并在开发过程中来回合并常见的变更.
  3. 只维护脚本的一个版本,并检查将脚本从一个版本转换为另一个版本的补丁文件.如果已进行足够的更改以使修补程序不再适用,请解决冲突并创建新修补程序.

我目前倾向于选项3,因为前两个将涉及很多容易出错的单调乏味.但是选项3似乎很乱,我的源代码控制系统应该是为我管理补丁.

对于分发包装,有更多选项可供选择:

  1. 提供两个不同的下载包,一个适用于Python 2,另一个适用于Python 3(用户必须知道为他们拥有的任何Python版本下载正确的下载包).
  2. 提供一个下载包,里面有两个不同的脚本(然后用户必须知道运行正确的脚本).
  3. 一个包含两个特定于版本的脚本的下载包,以及一个可以在两个Python版本中运行的小型存根加载程序,它运行安装的Python版本的正确脚本.

我现在再次倾向于选项3,尽管我还没有尝试开发这样的存根加载器.

还有其他想法吗?

python version-control python-3.x

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

为什么valgrind在我的"测试"程序中没有检测到内存泄漏?

整个测试代码包含在main.cpp中,如下所示:

#include <iostream>

using std::cout;
using std::endl;

void f(int i) {
    int* pi = new int;

    *pi = i;

    std::cout << "*pi = " << *pi << std::endl;
}

int main(int argc, char *argv[]) {
    int i = 0;

    while (i < 10000) {
        f(i);
        ++i;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我编译没有优化-O0(来自Eclipse Qt项目):

g++ -c -pipe -O0 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -Irelease -o release/main.o main.cpp
Run Code Online (Sandbox Code Playgroud)

然后链接如下:

g++ -Wl,-O0 -o test release/main.o …
Run Code Online (Sandbox Code Playgroud)

c++ qt valgrind

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

在C中编译套接字连接代码时出现问题

struct hostent *lh               = gethostbyname(hostname);

int socketDescriptor             = socket(AF_INET,SOCK_STREAM, 0);

sockaddr_in socketInfo;

memset(&socketInfo, 0, sizeof(socketInfo));
socketInfo.sin_family            = AF_INET;
socketInfo.sin_addr.s_addr       = ((in_addr *)(lh->h_addr))->s_addr;
socketInfo.sin_port              = htons(portNumber);

connect(socketDescriptor,&socketInfo,sizeof(socketInfo));
Run Code Online (Sandbox Code Playgroud)

在尝试编译时,我收到以下错误:

error: cannot convert ‘sockaddr_in*’ to ‘const sockaddr*’ for argument ‘2’ to ‘int connect(int, const sockaddr*, socklen_t)’

事情看起来"按书",但我遗漏了一些东西(显然).它是什么?

c sockets

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

隐马尔可夫模型预测下一次观察

我对鸟的运动进行了500次观察.我想预测这只鸟的第501次运动是什么.我在网上搜索,我想这可以通过使用HMM完成,但我没有任何关于该主题的经验.任何人都可以解释用于解决此问题的算法的步骤吗?

hidden markov prediction hidden-markov-models

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

以编程方式升级应用程序权限OS X.

我已经做了一些挖掘,我看到的主要想法是使用setuid/getuid并使用授权服务(由于某种原因,在编译时给出了符号错误,但现在似乎已弃用).

我的应用程序需要能够在某一点请求root访问权限(用于访问原始磁盘驱动器),最好是使用OS X身份验证对话框(我是OS X的新手,所以我不知道该怎么称呼它).

c++ macos root

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

如何自动检测代理?

对于我的一个项目,我制作了一个QWebView.一切都运行正常,但是当我在学校使用它时,我收到一个错误,因为没有定义代理.如何在Firefox和IE中自动检测代理?

我发现了这个QNetworkProxyFactory:

setUseSystemConfiguration(bool enable)
Run Code Online (Sandbox Code Playgroud)

但我找不到如何使用它.

qt

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

#ifndef C++中包含保护的语法

我目前正在攻读CS课程的期末考试,而且我遇到了一个关于C++ #ifndef语法的小问题(可能是主要的?).

当我将#infndef用作#include后卫时,我已经查看了#infndef的语法,网上的大多数人都说:

#ifndef HEADER_H
#define "header.h"
...
#endif
Run Code Online (Sandbox Code Playgroud)

但我班级的教程幻灯片显示的例子如下:

#ifndef __HEADER_H__
#define "header.h"
...
#endif
Run Code Online (Sandbox Code Playgroud)

我想知道两者之间的差异(如果有的话).考试很可能会让我写一个#include后卫,而且我知道传统的智慧只是与教授/导师所说的一致,但如果在编译过程中存在差异,我想知道.

c++ include-guards

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

如何在python中的活动连接上启动TLS?

以下是我在端口587上连接到gmail的smtp服务器的当前代码.发出STARTTLS命令后,我将如何完成协商TLS会话并开始发出命令,如AUTH LOGIN和MAIL FROM?我已经省略了我的Base64编码的gmail用户名,并将其替换为我的代码底部附近的xxxxxxxx.

我这个程序的输出是:

220 mx.google.com ESMTP y10sm3296641yhd.6

250-mx.google.com为您服务,[75.66.47.144]

250-SIZE 35882577

250-8BITMIME

250-STARTTLS

250 ENHANCEDSTATUSCODES

220 2.0.0准备启动TLS

from socket import *
import ssl
msg = "\r\n smtp.."
endmsg = "\r\n.\r\n"

# Mailserver hostname and port to be used.
mailserver = ("smtp.gmail.com", 587)


# Create a socket and create an active TCP connection with the mailserver
clientSocket = socket(AF_INET, SOCK_STREAM);
clientSocket.connect(mailserver)

# Read server response
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
    print '220 reply not received from server.' …
Run Code Online (Sandbox Code Playgroud)

python sockets ssl smtp

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