我有两个项目,ProjectA和ProjectB. ProjectB是一个控制台应用程序,依赖于ProjectA.昨天,一切都运转良好,但今天突然我跑了,ProjectB我得到了这个:
BadImageFormatException未处理:
无法加载文件或程序集"ProjectA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.尝试加载格式不正确的程序.
两者都只是常规项目,不依赖于任何其他非.Net项目.两者都是.Net - 没有本机代码,也没有P/Invoke.我有其他项目依赖ProjectA并仍然工作得很好.
我尝试过的事情:
但我仍然得到同样的错误.我不知道我做了什么导致这个,也不知道如何解决它.有任何想法吗?
不,这不是另一个"为什么是(1/3.0)*3!= 1"的问题.
我最近一直在读关于漂浮点的事情; 具体而言,相同的计算如何在不同的体系结构或优化设置上给出不同的结果.
对于存储重放的视频游戏来说,这是一个问题,或者是对等网络(而不是服务器 - 客户端),它依赖于每次运行程序时产生完全相同结果的所有客户端 - 一个小的差异浮点计算可能导致不同机器(甚至是同一台机器上)的游戏状态截然不同!
甚至在"跟随" IEEE-754的处理器中也会发生这种情况,这主要是因为某些处理器(即x86)使用双倍扩展精度.也就是说,它们使用80位寄存器进行所有计算,然后截断为64位或32位,导致与使用64位或32位进行计算的机器不同的舍入结果.
我在网上看到过这个问题的几种解决方案,但都是针对C++,而不是C#:
double使用_controlfp_s(Windows),_FPU_SETCW(Linux?)或fpsetprec(BSD)禁用双扩展精度模式(以便所有计算使用IEEE-754 64位).float和double完全.decimal可以用于此目的,但会慢得多,并且没有任何System.Math库函数支持它.那么,这在C#中是否也是一个问题? 如果我只打算支持Windows(而不是Mono)怎么办?
如果是,有没有办法强制我的程序以正常的双精度运行?
如果没有,是否有任何库可以帮助保持浮点计算的一致性?
我有一个值列表,我需要根据布尔值列表中的值进行过滤:
list_a = [1, 2, 4, 6]
filter = [True, False, True, False]
Run Code Online (Sandbox Code Playgroud)
我使用以下行生成一个新的筛选列表:
filtered_list = [i for indx,i in enumerate(list_a) if filter[indx] == True]
Run Code Online (Sandbox Code Playgroud)
这导致:
print filtered_list
[1,4]
Run Code Online (Sandbox Code Playgroud)
线路工作,但看起来(对我来说)有点矫枉过正,我想知道是否有更简单的方法来达到同样的目的.
以下答案中给出的两个好建议的摘要:
1-不要filter像我一样命名列表,因为它是一个内置函数.
2-不要True像我一样比较事情,if filter[idx]==True..因为这是不必要的.只是使用if filter[idx]就足够了.
我正在生成一个脚本,用于自动将更改从多个开发数据库迁移到暂存/生产.基本上,它需要一堆更改脚本,并将它们合并到一个脚本中,将每个脚本包装在一个IF whatever BEGIN ... END语句中.
但是,某些脚本需要一个GO语句,以便例如SQL解析器在创建新列后知道它.
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
Run Code Online (Sandbox Code Playgroud)
但是,一旦我将其包装在一个IF块中:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
Run Code Online (Sandbox Code Playgroud)
它失败了,因为我发送了一个BEGIN没有匹配的END.但是,如果我删除GO它,它会再次抱怨一个未知的列.
有没有办法在单个IF块中创建和更新同一列?
在塔防游戏中,你有一个NxM网格,有一个开始,一个完成和一些墙.

敌人从头到尾穿过最短路径而不穿过任何墙壁(它们通常不会被限制在网格上,但为了简单起见,我们可以说它们是.在任何一种情况下,它们都不能穿过对角线"洞")

问题(对于这个问题,至少)是将多达 K个追加墙壁最大化的敌人必须采取的路径.例如,对于K = 14

我的直觉告诉我这个问题是NP难的,如果(正如我希望的那样)我们将其概括为包括在移动到终点之前必须访问的路点,也可能没有路点.
但是,对于接近最优的解决方案,是否有任何体面的启发式方法?
[编辑]我在这里发布了一个相关的问题.
我听说过
所有这些都被解释为"完整.Net的一个子集,允许您定位多个平台".所以我的问题是
(我的具体情况:我有一个针对.Net 2.0,.Net 4.5和UWP的库.针对UWP需要创建一个新的VS项目并链接所有现有文件,这是一个巨大的痛苦.现在有人告诉我它没有不适用于PCL,从它的声音我必须再次为.Net标准!?)
我在以前的代码上遇到此错误.我没有改变代码.
这是完整的错误:
CLR无法从COM上下文0x3322d98过渡到COM上下文0x3322f08达60秒.拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息.这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积.为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息.
以下是导致它的代码:
var openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
openFileDialog1.DefaultExt = "mdb";
openFileDialog1.Filter = "Management Database (manage.mdb)|manage.mdb";
//Stalls indefinitely on the following line, then gives the CLR error
//one minute later. The dialog never opens.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
....
}
Run Code Online (Sandbox Code Playgroud)
是的,我确定对话框没有在后台打开,不,我没有任何明确的COM代码或非托管编组或多线程.
我不知道为什么OpenFileDialog不会打开 - 任何想法?
过去几天我一直在研究这个问题,到目前为止,除了教条论点或对传统的诉求之外,我还没有真正找到任何令人信服的东西(即"它是C++方式!").
如果我正在创建一个对象数组,使用时有什么令人信服的理由(除了易用性):
#define MY_ARRAY_SIZE 10
// ...
my_object * my_array=new my_object [MY_ARRAY_SIZE];
for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i]=my_object(i);
Run Code Online (Sandbox Code Playgroud)
过度
#define MEMORY_ERROR -1
#define MY_ARRAY_SIZE 10
// ...
my_object * my_array=(my_object *)malloc(sizeof(my_object)*MY_ARRAY_SIZE);
if (my_object==NULL) throw MEMORY_ERROR;
for (int i=0;i<MY_ARRAY_SIZE;++i) new (my_array+i) my_object (i);
Run Code Online (Sandbox Code Playgroud)
据我所知,后者比前者更有效(因为你没有不必要地将内存初始化为一些非随机值/调用默认构造函数),唯一的区别就在于你清理了一个:
delete [] my_array;
Run Code Online (Sandbox Code Playgroud)
另一个你清理:
for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i].~T();
free(my_array);
Run Code Online (Sandbox Code Playgroud)
我出于一个令人信服的理由.上诉的事实,这是C++(不是C),因此malloc而free不应使用不-据我可以告诉- 引人注目的一样,因为它是教条主义.是否有一些我缺少的东西new []优于malloc?
我的意思是,就我所知,你根本不能使用new []- 根本没有 - 创建一个没有默认的无参数构造函数的数组,而这个malloc方法可以这样使用.
编写一个算法来查找F(n)设置为1的位数,对于任何给定的n值,从1到n的所有数字.
复杂性应该是 O(log n)
例如:
1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
Run Code Online (Sandbox Code Playgroud)
所以
F(1) = 1,
F(2) = F(1) + 1 = 2,
F(3) = F(2) + 2 = 4,
F(4) = F(3) + 1 = 5,
etc.
Run Code Online (Sandbox Code Playgroud)
我只能设计一种O(n)算法.
我已经介绍过了,现在我正在寻找可以从我的热点中挤出一切可能的性能.
我知道[MethodImplOptions.AggressiveInlining]和ProfileOptimization类.还有其他人吗?
[编辑] 我刚刚发现了[TargetedPatchingOptOut].没关系,显然不需要一个.
c# ×5
.net ×4
algorithm ×2
.net-core ×1
c++ ×1
exception ×1
heuristics ×1
ieee-754 ×1
list ×1
malloc ×1
maze ×1
new-operator ×1
numpy ×1
optimization ×1
path-finding ×1
precision ×1
python ×1
sql ×1
sql-server ×1
t-sql ×1
uwp ×1
vb.net ×1