小编Dav*_*sky的帖子

对于C中的整数常量,科学记数法是否安全?

有一段时间,我一直用科学记数法表示常量中10的大功率,所以我不需要计算零.例如

#define DELAY_USEC 1e6
Run Code Online (Sandbox Code Playgroud)

一位同事指出这不安全,因为它不是一个整数,并且不能保证总是完全等于1000000 .文档似乎证实了这一点,但我想知道它的实用性是否真实.有没有办法用速记安全地声明十次幂的整数?将它强制转换为定义中的int是否安全?

c c++ gcc

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

Delphi/pascal:使用不同的原型重载构造函数

我正在尝试创建一个子类的TForm

  1. 某些案例的特殊构造函数,以及
  2. 一个默认构造函数,它将保持与当前代码的兼容性.

这是我现在的代码:

interface
  TfrmEndoscopistSearch = class(TForm)
  public
    /// original constructor kept for compatibility
    constructor Create(AOwner : TComponent); overload; override;
    /// additional constructor allows for a caller-defined base data set
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload;
  end;
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但我总是得到编译器警告:

[Warning] test.pas(44): Method 'Create' hides virtual method of base type 'TCustomForm'
  • 添加"过载"; 在第二个构造函数之后将无法编译."[错误] test.pas(44):"创建"声明与之前的声明不同".
  • 使第二个构造函数的一个类函数编译时没有任何错误或警告,但在运行时死于访问冲突(所有成员变量都是零).

delphi constructor overloading

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

循环存在于C中之后使用'for'循环迭代器

多年来,我已经习惯了for在循环退出后不使用循环迭代器的值.我本可以发誓我这样做,因为它曾经产生编译器警告,但在我最近的代码审查中遇到挑战后,我被证明是错误的.

例如,我总是这样做(注意:我们的代码标准禁止使用"break"关键字):

int i, result;
bool done = false;
for (i=0; i<10 && !done; i++) {
    if (some_condition) {
        result = i;
        done = true;
    }
}
// Value of i may be undefined here
Run Code Online (Sandbox Code Playgroud)

现在,显然result可以删除变量,如果我可以依赖i的值.我认为,由于编译器优化,你不能依赖循环迭代器的值.我只记得幻影教学吗?或者这是标准(特别是关于GNU C)?

c for-loop c99

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

GIT:在几次提交后附加补丁

我使用git来跟踪我们的开发团队所做的更改并将其提交到我们的中央cvs样式的存储库中.由于它的cvs,它跟踪文件而不是提交,因此有时很难确切地说出哪些文件构成了bug补丁的完整补丁.我刚刚遇到一个并做了以下事情:

1)拖曳,检查CVS日志并将它们作为完整补丁提交给git

A--B--C--D
Run Code Online (Sandbox Code Playgroud)

2)发现了另一个实际用于票证(B)的文件更改,因此我将当前分支重置为B.

git reset --soft <sha1 ID for commit B>
Run Code Online (Sandbox Code Playgroud)

3)我复制更改,并将其附加到提交(B)

git commit --amend
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,树现在读了

A--B
Run Code Online (Sandbox Code Playgroud)

仅在工作树中提交(C)和(D).他们的详细信息已从日志中删除,我认为我无法取回它们.我哪里做错了?我唯一的选择是在(D)之上进行额外的提交,并且只知道它真的是(B)的一部分吗?

git version-control dvcs

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

如何说服管理层质量保证是重要的?

我在一家拥有不到10名程序员的小型软件公司工作.我们的软件安装在世界各地的数十个地方.我们的代码库非常庞大,主要原因是设计不佳和大量代码重复(IMO).我们有大约30个不同的项目,每个项目总共约600个KLOC,其中约200个KLOC是我们自己开发的代码.当我在2006年到达那里时,这段代码甚至没有受到版本控制.我已经设法说服权力它的重要性,我们现在使用代码控制系统(cs-rcs,不是我的选择,但它比nothin更好),以及一个bug跟踪系统.巨大的缺失是整个过程中完全缺乏质量保证.我们的发布过程在纸上是不存在的,并且在实践中它包括"命中ctrl-F9,将二进制文件复制到客户端,声明问题已修复".

任何人都可以向我指出一些官方文件或PHB语言文件或文章,可以解释这个过程中公然的疯狂吗?我相信老板可以聘请一些顾问告诉他这个,然后他可能会相信.但我只是一名软件工程学士学位的维护人员.我的种族对我也没有帮助.在这种情况下使用的最佳弹药是什么?

testing qa

5
推荐指数
0
解决办法
2232
查看次数

在GNU/Linux/C中使用多播(224.0.0.12)发现DHCP服务器

这个问题可能源于对IP多播的基本误解,所以如果我不在基础,请纠正我.

我正在尝试编写C代码来查找网络上所有DHCP服务器的IP地址.用例是这样的:

  1. 客户端广播DHCP发现.
  2. 我的专有中继代理接收数据包,添加一些基本信息,然后将UNICAST转发到已知IP地址的DHCP服务器.

我遇到的问题是告诉中继代理DHCP服务器在哪里.我发现IANA为DHCP服务器保留了多播地址224.0.0.12,所以我想我只是将服务器配置为侦听该多播流量.但每当我将IP套接字选项配置为IP_ADD_MEMBERSHIP到224.0.0.12时,它都使用IGMP,这是一个完全独立的协议,我不想实现它.

我只是误解了多播是如何工作的?我不应该能够从中继代理发送ping到224.0.0.12并让它从所有DHCP服务器返回ping响应吗?


附加信息:

  • 当我这样做时,所有盒子上的接口都有MULTICAST列出 ifconfig
  • 我已ip route add 224.0.0.0/4 dev eth0在所有框中添加了多播路由

c linux dhcp multicast

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

DELPHI:如何在循环或案例之外使用"break"?

考虑以下delphi pascal代码:

var
  tc: TComponent
begin
{ do something to get tc }
repeat
  if(tc is TDBEdit)then begin
    if(check_something_about_edit(tc))then break;
    do_something_else_edit(tc);
    break;
  end else if(tc is TBMemo) then begin
    if(check_something_about_memo(tc))then break;
    do_something_else_memo(tc);
    break;
  end;
  raise exception.create('invalid component type');
until(true); {single iteration look required to use break }
Run Code Online (Sandbox Code Playgroud)

我知道我可以用TComponent做一些多态的东西,但这不是我的问题.我想知道是否有办法摆脱单次迭代repeat-until语句.没有它,我不能在处理块的任何地方使用break语句,我需要随时停止处理.

delphi syntax pascal break

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

PHP5:调用外部函数和记录错误

我是PHP的新手,并试图在我的本地网站上设置phpBB.我有一个apache2和php5的股票debian安装.phpBB安装程序运行正常,连接到数据库并创建其所有表没有问题.但是当我尝试打开登录页面时,我得到了一个0字节的响应.

一点点挖掘表明它永远不会超过对mysql_pconnect()的调用.php二进制文件只是退出而没有错误或消息.什么都没有.我尝试运行以下代码:

<?php
$id = @mysql_pconnect('localhost','myusername', 'mypassword', true);
print "id=".$id."\n";
?>
Run Code Online (Sandbox Code Playgroud)

并且"id ="字符串永远不会打印.它什么都不做.我不知道在哪里可以看到发生了什么错误,或者发生了什么.所有我安装的都是使用pear的"mysql"...也许我错过了其他的东西?

这必须是某个地方的路径问题.mysql扩展很好地构建了

/usr/lib/php5/20060613+lfs/mysql.so
Run Code Online (Sandbox Code Playgroud)

回答:

jishi:告诉我"@"运算符会抑制输出,包括错误消息(@echo off,any?)

tomhaigh:必须在php.ini文件中显式启用扩展.将行"extension = mysql.so"添加到php.ini后,以下代码运行正常:

% cat d.php 
<?php
ini_set('display_errors', true);
error_reporting(E_ALL | E_NOTICE);
$id = mysql_pconnect('localhost','myusername', 'mypassword', true);
print "id=".$id."\n";
?>
% php -c /etc/php5/apache2/php.ini  d.php
id=Resource id #4
Run Code Online (Sandbox Code Playgroud)

喜悦!

php mysql pear

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

MySql:事务没有检测到死锁?

请考虑以下perl代码:

$schema->txn_begin();

my $r = $schema->resultset('test1')->find({id=>20});

my $n = $r->num;
$r->num($n+1);
print("updating for $$\n");
$r->update();

print("$$ val: ".$r->num."\n");

sleep(4);

$schema->txn_commit();
Run Code Online (Sandbox Code Playgroud)

我期望由于更新受到事务的保护,如果两个进程尝试更新"num"字段,则第二个应该失败并出现一些错误,因为它丢失了竞争.Interbase将此称为"死锁"错误.然而,MySQL会在update()调用上暂停,但在第一个调用commit之后会很乐意继续.然后第二个进程具有num的"old"值,导致增量不正确.注意:

$ perl trans.pl  & sleep 1 ; perl trans.pl 
[1] 5569
updating for 5569
5569 val: 1015
updating for 5571
5571 val: 1015
[1]+  Done                    perl trans.pl
Run Code Online (Sandbox Code Playgroud)

两种情况下的结果值都是"1015".这怎么可能是正确的?

mysql perl transactions dbix-class

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