问题列表 - 第9385页

命名空间内函数的头文件?

在C++中,我有一个文件A.cpp,其中包含以下内容:

 namespace Foo {

     bool Bar() 
     { 
         return true; 
     }

 }
Run Code Online (Sandbox Code Playgroud)

我怎么在Ah中声明这个功能?我如何处理命名空间?

c++ namespaces header

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

Windows:避免在堆栈上推送完整的x86上下文

我已经实现了PARLANSE,这是MS Windows下的一种语言,它使用cactus栈来实现并行程序.堆栈块被分配在每个功能的基础上,并处理局部变量的大小合适,表达温度推/持久性有机污染物,并调用库(包括存储库程序工作在堆栈空间).在实践中,这样的堆栈帧可以小到32个字节,并且通常是这样.

这一切都很有效,除非代码做了一些愚蠢的事情并导致硬件陷阱......此时Windows似乎坚持在堆栈上推送整个x86机器上下文.如果包含FP/MMX /等,则大约500多个字节.寄存器,它做的.当然,32字节堆栈上的500字节推送会破坏它不应该的东西.(硬件在陷阱上推了几个字,但不是整个上下文).

[编辑2012年11月27日:请参阅测量的细节上堆叠的荒谬量Windows实际上推动 ]

我可以让Windows在其他地方存储异常上下文块(例如,到特定于线程的位置)吗?然后软件可以对线程进行异常命中并处理它而不会溢出我的小堆栈帧.

我不认为这是可能的,但我想我会问更多的观众.是否有OS标准调用/接口可能导致这种情况发生?

如果我可以让MS让我的进程可选地定义一个上下文存储位置"contextp",那么在操作系统中这样做是微不足道的,这个位置被初始化以默认启用当前的遗留行为.然后替换中断/陷阱向量代码:

  hardwareint:   push  context
                mov   contextp, esp
Run Code Online (Sandbox Code Playgroud)

...... ......

  hardwareint:  mov <somereg> contextp
                test <somereg>
                jnz  $2
                push  context
                mov   contextp, esp
                jmp $1 
         $2:    store context @ somereg
         $1:    equ   *
Run Code Online (Sandbox Code Playgroud)

保存somereg等所需的明显变化

[我现在做的是:检查每个函数的生成代码.如果它有可能生成陷阱(例如,除以零),或者我们正在调试(可能是坏指针deref等),请为FP上下文添加足够的空间到堆栈帧.堆栈帧现在最终大小约为500-1000字节,程序无法递归到目前为止,这对我们正在编写的应用程序来说有时是一个真正的问题.所以我们有一个可行的解决方案,但它使调试变得复杂]

编辑8月25日:我已经成功地将这个故事告诉了一位微软的内部工程师,他有权明确地找出MS中谁可能真正关心的人.解决方案可能有微弱的希望.

编辑9月14日:MS Kernal Group Architect听过这个故事并且很有同情心.他说MS将考虑一个解决方案(如提议的解决方案),但不太可能在服务包中.可能必须等待下一版本的Windows.(叹气......我可能会变老......)

编辑:2010年9月13日(1年后).微软没有采取任何行动.我最近的噩梦:在Windows X64上运行一个32位进程的陷阱,在中断处理程序伪造推动32位上下文之前,将整个X64上下文推送到堆栈上?那甚至更大(两倍宽的整数寄存器,两倍的SSE寄存器(?))?

编辑:2012年2月25日:( 1.5年过去了......)微软没有反应.我猜他们只是不关心我的并行性.我认为这对社区不利; MS在正常情况下使用的"大堆栈模型"限制了通过食用大量VM可以在任何一个瞬间生存的并行计算量.PARLANSE模型将允许一个应用程序在运行/等待的各种状态下具有一百万个活"谷粒"; 这在我们的一些应用程序中确实发生,其中"并行"处理了1亿个节点图.PARLANSE方案可以使用大约1Gb的RAM来实现这一点,这是非常易于管理的.如果您尝试使用MS 1Mb"大堆栈",那么您只需要10 ^ 12个字节的VM用于堆栈空间,我非常确定Windows不会让您管理一百万个线程.

编辑:2014年4月29日:( 4年过去了). 我想MS只是不读SO. 我已经在PARLANSE上完成了足够的工程设计,因此我们只需要在调试期间支付大型堆栈帧的价格,或者当FP操作正在进行时,所以我们设法找到非常实用的方法来实现这一点.MS继续令人失望; 各种版本的Windows推送到堆栈上的东西量似乎变化很大,而且非常严重地超出了对硬件环境的需求.有一些暗示,这种可变性是由于非MS产品坚持(例如防病毒)在异常处理链中嗤之以鼻; 为什么他们不能从我的地址空间之外做到这一点?任何,我们通过简单地为FP /调试陷阱添加一个大的slop因子,并等待超过该数量的字段中不可避免的MS系统来处理所有这些.

stack-overflow assembly exception cpu-registers threadcontext

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

为什么以下SQL Server在事务中运行时会插入死锁?

我目前正在将记录插入SQL Server表,然后选择自动增量ID,如下所示:

(@p0 int,@p1 nvarchar(8))INSERT INTO [dbo].[Tag]([Some_Int], [Tag])
VALUES (@p0, @p1)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 
Run Code Online (Sandbox Code Playgroud)

(这是使用Linq-to-SQL生成的).出于某种原因,当我使用具有Seri​​alizable隔离级别的TransactionScope对象在事务中运行此代码时,SQL Server会引发死锁错误.我分析了死锁图事件,发现所涉及的两个进程都在等待另一个进行转换操作,因为我了解以下信息:

<resource-list>
   <keylock hobtid="72057594101170176" dbid="5" objectname="foo.dbo.Tag" indexname="PK_Tag_1" id="lockb77cdc0" mode="RangeS-S" associatedObjectId="72057594101170176">
    <owner-list>
     <owner id="processc9be40" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc9ae38" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594101170176" dbid="5" objectname="foo.dbo.Tag" indexname="PK_Tag_1" id="lockb77cdc0" mode="RangeS-S" associatedObjectId="72057594101170176">
    <owner-list>
     <owner id="processc9ae38" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc9be40" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
  </resource-list>
Run Code Online (Sandbox Code Playgroud)

我的理解是,事务范围将阻止第二个进程执行插入,直到第一个进程完成插入和选择标识.然而,情况似乎并非如此.任何人都可以通过线程安全的方式阐明实现我需要的最佳方法吗?

- 更新 -

请注意; 我99%确定两个进程之间没有共享连接,因为每个进程都创建一个新的DataContext来与数据库通信.

- 再次更新 -

Remus Rusanu指出一些省略的信息与问题有关,我试图根据死锁图报告简化场景,但我在这里扩展了解释.在我执行插入之前,我在相关表上执行存在查询以确定标记是否已存在.如果是的话我结束了交易.如果不是插入应该继续,然后我在具有Some_Int主键的表上执行更新(此处未显示),尽管更新纯粹是针对最后修改的值.Tag表具有由auto inc ID和Some_Int组成的聚簇索引也很重要.我不认为这最后一条信息具有相关性,因为我尝试将表更改为仅将auto inc字段作为主键/聚簇索引无效.

谢谢.

c# sql-server deadlock transactionscope linq-to-sql

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

集成readline的kill-ring和X11剪贴板

在我看来.zshrc,我使用以下代码片段来集成shell的剪贴板和我的主要X11剪贴板.由于这种集成,我可以在emacs,firefox和终端上剪切和粘贴文本,而无需使用鼠标.

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y
Run Code Online (Sandbox Code Playgroud)

注意:我也在mac os x上使用这个技巧(使用pbcopy/pbpaste而不是xclip)并且由于Synergy,我的两台计算机共享一个剪贴板.整齐.但它不适用于readline.我发现自己经常使用readline,例如在(i)python,gdb,ncftp ......

所以我的问题就出现了:有没有办法将readline的剪贴板与世界其他地方集成?

当然,我在.inputrc这里想到一些巫术,但任何见解/想法都会受到欢迎.

unix shell clipboard readline

12
推荐指数
3
解决办法
2710
查看次数

这个游标有什么问题

学习显式游标并尝试创建我的第一个游标:

SET SERVEROUTPUT ON
DECLARE
 v_ename EMP.FIRST_NAME%TYPE;
 v_salary EMP.SALARY%TYPE;
 CURSOR c_emp IS SELECT first_name, salary FROM emp;
BEGIN
  OPEN c_emp;
  FETCH c_emp INTO v_ename, v_salary;
  DBMS_OUTPUT.PUT_LINE('Employee Details ' || v_ename || ' ' || v_salary)

  FETCH c_emp INTO v_ename, v_salary;
  DBMS_OUTPUT.PUT_LINE('Employee Details ' || v_ename || ' ' || v_salary)

  CLOSE c_emp;
END;
Run Code Online (Sandbox Code Playgroud)

但它给了我:

FETCH c_emp INTO v_ename, v_salary;
  *
ERROR at line 10:
ORA-06550: line 10, column 3:
PLS-00103: Encountered the symbol "FETCH" when expecting one of the following: …
Run Code Online (Sandbox Code Playgroud)

oracle cursor

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

list-style CSS属性应该去哪里?

列表样式属性应该放在ul元素还是li元素上?

我从未见过左边有不同小图标的列表(在同一个ul内),但我在旅行之前已经看过两个元素都使用过的属性.

哪一个是正确的?

html css

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

防止在较高版本上安装较低版本

我们使用Installshield 2008专业版中的InstallScript MSI Project开发了该项目.在项目中,我们添加了一个条件,以便不应在较高版本上安装旧版本.

我们面临的问题是考虑产品版本为1.0.0925.1的新项目,并添加条件以避免更高版本而不是更低版本.为了增加这个条件,我从上面的链接中得到了它; 在主要升级的Common选项卡中我已经启用了升级提示; 因为将来新设置1.0.0925.2会要求升级.

现在我将使用产品版本1.0.0925.2创建新设置,在主要升级的Common选项卡下,我将禁用提示,因为; 如果用户尝试在1.0.0925.2上安装1.0.0925.1,则不应允许; 在这种情况下它工作正常; 一个流行音乐说"已安装此产品的另一个版本.此版本的安装无法继续.要配置或删除此产品的现有版本,请使用控制面板上的添加/删除程序.{2D0E6C46-1CC2-4174-8AAC -0B39312D8ECE}"

现在几天之后会有更改,并且将再次使用版本1.0.0925.3创建另一个设置,因为将禁用升级提示.现在我尝试在1.0.0925.2上安装1.0.0925.3,显然应该升级; 但问题出现了,而不是询问"设置将执行升级",它会说"已安装此产品的另一个版本.此版本的安装无法继续.要配置或删除此产品的现有版本,请使用添加/删除控制面板上的程序.{2D0E6C46-1CC2-4174-8AAC-0B39312D8ECE}"由于我已禁用1.0.0925.2的提示,因此不允许升级.如果我启用此功能,则每次要求升级时都会运行任何设置,无论是较高版本的较低版本还是较低版本的较高版本.

即使我想在Installscript中检查产品版本,但我不知道如何处理如果我设法获得已安装设置的产品版本以及当前运行设置的方法.但是如何在运行时更改升级提示,因为它是在设计时设置的.

installshield version installshield-2008

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

Visual Studio单元测试在"当前上下文中运行测试"期间丢失

......除了没有丢失.我刚写了它,用[TestMethod]装饰它,可以在我面前看到它并编译.当在包含TestClass中运行所有TestMethods时,它不会显示在测试结果窗口中.或者当我的光标在其上时,使其成为当前上下文中的唯一测试.在这种情况下,类中的所有其他测试都将运行,但不会运行新的测试.

如果我关闭解决方案并重新打开它,它将运行并显示在测试结果中.

相反,如果我从TestClass中删除测试,测试结果窗口会警告我测试缺失了......好吧,我把它拿出来了,我根本不会错过它,因为我希望它消失了.

这种情况昨天没有发生.我曾经在不同的项目/解决方案中实现过它.

我是唯一一个?它只是VS中的一个错误而没有希望通过我的介入来弥补吗?

unit-testing visual-studio-2008

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

如何在C++中执行整数log2()?

在C++标准库中,我发现只有一个浮点日志方法.现在我使用log来查找二叉树中的索引级别(floor(2log(index))).

代码(C++):

int targetlevel = int(log(index)/log(2));
Run Code Online (Sandbox Code Playgroud)

我担心对于某些边元素(值为2 ^ n的元素),log将返回n-1.999999999999而不是n.0.这种恐惧是否正确?如何修改我的陈述以便始终返回正确的答案?

c++ logarithm floating-accuracy

41
推荐指数
7
解决办法
6万
查看次数

用C#编写驱动程序

我之前用C/C++编写过,但是目前我需要它转换成C#.

任何人都可以告诉我代码/方式如何用C#编写驱动程序?

实际上目前我用C++编写的旧应用程序存在一些问题,我们必须用C#编写LPT1,COM打印机和其他USB驱动程序的驱动程序.

c# drivers driver

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