当我通过微软的VC 2008编译这段琐碎的代码时:
double maxDistance(unsigned long long* a, unsigned long long* b, int n)
{
double maxD = 0, currentD = 0;
for(int i = 0; i < n; ++i)
{
currentD = b[i] - a[i];
if(currentD > maxD)
{
maxD = currentD;
}
}
return maxD;
}
Run Code Online (Sandbox Code Playgroud)
编译器给了我:
警告C4244说明:从'unsigned long long'转换为'double',可能会丢失数据.在线上
currentD = b[i] - a[i]
Run Code Online (Sandbox Code Playgroud)
我知道最好以某种方式重写代码,我使用double来解释差异的可能负值,但我只是好奇,为什么在世界范围内从无符号long long转换为double会导致数据丢失,如果unsigned long long的范围从0到18,446,744,073,709,551,615,双倍是+/- 1.7E +/- 308?
我有一个带有普通 C 接口的旧 .dll,它在完成某些工作时需要回调来调用。它采用的回调类型为void (f*)(char* arg)。
我正在寻找一种在那里传递 C++ 函数对象的技巧,以便使用存储在某处的“this”指针调用回调,例如绑定,但简单的绑定不起作用
为了说明这一点: C 接口:
typedef void (f*)(char* param) Callback;
void registerCallback(Callback c);
Run Code Online (Sandbox Code Playgroud)
C++ 中的用法:
class A
{
void func1()
{
registerCallback(std::bind(&A::func2, _1, this)); // obviously doens't work
}
void func2(char* param)
{ ... }
};
Run Code Online (Sandbox Code Playgroud) 我正在使用.net Web服务创建一个研究项目,我遇到了这个问题:为了提供改变Web服务器的机会,甚至是它的性质(这是任务的一部分),我创建了一个接口.将每个可能的(Web)服务必须实现的.dll分开.说,
public interface IDataAccess
{
// Group of methods which are used for login/logout
bool isUserRegistered(string username);
bool authorize(string username, string password);
//...
}
Run Code Online (Sandbox Code Playgroud)
我让Web服务实现这个接口:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Server : System.Web.Services.WebService, IDataAccess
{
//...
}
Run Code Online (Sandbox Code Playgroud)
然后,在客户端中,我为此服务创建一个引用(名称空间WebReference),指定在所有程序集中重用类型并尝试执行以下操作:
private IDataAccess webService = (IDataAccess)(new WebReference.Server());
Run Code Online (Sandbox Code Playgroud)
但是这个赋值在运行时抛出异常,说明无法完成转换,实际上,在Reference.cs中(这是通过添加对Web Service的引用创建的内容的一部分,还有一个Server类的重新声明,它没有' t声明IDataAccessImplementation:
public partial class Server : System.Web.Services.Protocols.SoapHttpClientProtocol {
//...
}
Run Code Online (Sandbox Code Playgroud)
那么,我的问题是如何在没有手动编辑Reference.cs文件的情况下使这个参考工具成为通用接口IDataAccess?
我是初学者,我正试图重现一个rae条件,以便让自己熟悉这个问题.为此,我创建了以下程序:
#include <Windows.h>
#include <iostream>
using namespace std;
#define numThreads 1000
DWORD __stdcall addOne(LPVOID pValue)
{
int* ipValue = (int*)pValue;
*ipValue += 1;
Sleep(5000ull);
*ipValue += 1;
return 0;
}
int main()
{
int value = 0;
HANDLE threads[numThreads];
for (int i = 0; i < numThreads; ++i)
{
threads[i] = CreateThread(NULL, 0, addOne, &value, 0, NULL);
}
WaitForMultipleObjects(numThreads, threads, true, INFINITE);
cout << "resulting value: " << value << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在一个线程的函数中添加了sleep,以便重现竞争条件,我如何理解,如果我只是添加一个作为工作负载,竞争条件不会表现出来:创建一个线程,然后它运行工作负载而它碰巧在另一个迭代创建的另一个线程开始其工作负载之前完成.我的问题是工作负载内的Sleep()似乎被忽略了.我将参数设置为5秒,我希望程序运行至少5秒,但它会立即完成.当我将Sleep(5000)置于main函数内时,程序按预期运行(> 5秒).为什么Sleep内部线程被忽略?但无论如何,即使Sleep()被忽略,程序也会在每次启动时输出:
结果价值:1000
而正确答案应该是2000.你能猜出为什么会这样吗?