小编Asi*_*sik的帖子

64位定点乘法错误

我正在C#中实现64位定点签名31.32数字类型long.到目前为止,添加和减法都很好.然而,乘法有一个我想要解决的烦人案例.

我当前的算法包括将每个操作数分成最高和最低有效32位,执行4次乘法到4个长度并添加这些长度的相关位.这是代码:

public static Fix64 operator *(Fix64 x, Fix64 y) {

    var xl = x.m_rawValue; // underlying long of x
    var yl = y.m_rawValue; // underlying long of y

    var xlow = xl & 0x00000000FFFFFFFF; // take the 32 lowest bits of x
    var xhigh = xl >> 32; // take the 32 highest bits of x
    var ylow = yl & 0x00000000FFFFFFFF; // take the 32 lowest bits of y
    var yhigh = yl >> 32; // …
Run Code Online (Sandbox Code Playgroud)

c# math binary fixed-point

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

这种gcroot的使用安全吗?

我需要使用C++/CLI中的非托管API.此API存储指向任意用户数据和一些回调的void指针.然后它最终调用那些回调,将用户数据作为void*传递.

到目前为止,我有一个本机类将其"this"指针作为用户数据传递,并使用该指针将API调用回此类,即:

static void __stdcall Callback(void* userData) {
    ((MyType*)userData)->Method();
}

class MyType {
public:
    MyType() { RegisterWithApi((void*)this, Callback); }
    void Method();
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用托管类来翻译它.我发现gcroot类型可以用来在本机代码中安全地存储托管引用,所以我现在就是这样做的:

// This is called by the native API
static void __stdcall Callback(void* userData) {
    // Cast back to gcroot and call into managed code
    (*(gcroot<MyType^>*)userData)->Method();
}

ref class MyType {
    gcroot<MyType^>* m_self;
public:
    MyType() { 
        m_self = new gcroot<MyType^>;
        RegisterWithApi((void*)m_self, Callback);
    }
    ~MyType() { delete m_self; }
    // Method we want called by the native API
    void …
Run Code Online (Sandbox Code Playgroud)

.net c++ interop garbage-collection c++-cli

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

GetLastInputInfo的整数环绕问题

我想在我的应用程序中检查用户是否不活动.我做了一些研究,然后使用GetLastInputInfo和Environment.TickCount,因为它看起来非常简单.不幸的是,事实证明它有点敏感.

GetLastInputInfo返回一个LASTINPUTINFO结构,其最后一个"TickCount"值为DWORD(即UInt32).从理论上讲,我想从Environment.TickCount中减去该值,这样我就知道用户已经处于非活动状态的ms.

Environment.TickCount返回一个Int32.两者都会在达到最大值时回绕,这对于Int32和UInt32是不同的.我有点不舒服处理这尤其是因为基本上无法进行测试的代码(Environment.TickCount后24.9天环绕和功能前,由于).

这是我到目前为止所做的:

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(out LastInputInfo plii);
struct LastInputInfo
{
  public uint cbSize;
  public uint dwTime;
}

//(...)
var lastInputInfo = new LastInputInfo();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
if (GetLastInputInfo(out lastInputInfo))
{
  // The next line obviously will not work when either of the terms has wrapped around
  var idleTime = Environment.TickCount - lastInputInfo.dwTime;
  if (idleTime > mTimeOut)
  {
    // user is inactive!
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的方法来处理这两个环绕,或者我应该使用另一种方法来完全检测用户的不活动?此外,任何关于如何测试这个没有专用计算机25天的建议表示赞赏.

.net c# int winapi

4
推荐指数
1
解决办法
1601
查看次数

CUDA .ptx文件是否可移植?

我正在研究cudaDecodeD3D9示例以了解CUDA的工作原理,并在编译时从.cu文件生成.ptx文件.据我所知,这个.ptx文件是一个中间表示,可以为任何特定的GPU及时编译.该示例使用类cudaModuleMgr通过cuModuleLoadDataEx加载此文件.

.ptx文件是文本格式,我可以看到它的顶部是我的机器上的一堆硬编码路径,包括我的用户文件夹,即:

    .file   1   "C:/Users/******/AppData/Local/Temp/tmpxft_00002abc_00000000-7_NV12ToARGB_drvapi.cudafe2.gpu"
    .file   2   "c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h"
    .file   3   "C:/Program Files (x86)/NVIDIA GPU Computing Toolkit/CUDA/v5.0/include\crt/device_runtime.h"
    .file   4   "C:/Program Files (x86)/NVIDIA GPU Computing Toolkit/CUDA/v5.0/include\host_defines.h"
    .file   5   "C:/Program Files (x86)/NVIDIA GPU Computing Toolkit/CUDA/v5.0/include\builtin_types.h"
    .file   6   "c:\program files (x86)\nvidia gpu computing toolkit\cuda\v5.0\include\device_types.h"
    .file   7   "c:\program files (x86)\nvidia gpu computing toolkit\cuda\v5.0\include\host_defines.h"
    .file   8   "c:\program files (x86)\nvidia gpu computing toolkit\cuda\v5.0\include\driver_types.h"
    .file   9   "c:\program files (x86)\nvidia gpu computing toolkit\cuda\v5.0\include\surface_types.h"
    .file   10  "c:\program files (x86)\nvidia gpu computing toolkit\cuda\v5.0\include\texture_types.h"
    .file …
Run Code Online (Sandbox Code Playgroud)

c++ cuda gpgpu gpu-programming

4
推荐指数
1
解决办法
760
查看次数

Task.Continue使用什么SynchronizationContext?

Task.ContinueWith的一些重载不采用SynchronizationContext.他们使用什么SynchronizationContext来安排新任务?

.net task-parallel-library

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

为什么订单在Observable.merge的使用中很重要?

我正在尝试使用F#中的Observables编写一个基本的"游戏循环".基本上我将两个流合并在一起的事件的基本输入流概念化:用户的按键操作(游戏仅使用键盘开始),以及游戏的常规刻度(例如,每秒60次).

我的问题似乎源于这样一个事实,即观察到的序列之一,即刻度,也是在Window上调用DispatchEvents()的循环,允许它处理其输入并触发按键事件,因此实际上有一个事件流如果这是有意义的,由另一个驱动.这是代码:

open System;
open System.IO
open SFML.Window
open SFML.Graphics
open System.Reactive
open System.Reactive.Linq
open System.Diagnostics

type InputEvent =
| Tick of TimeSpan
| KeyPressed of Keyboard.Key

[<EntryPoint;STAThread>]
let main _ = 

    use window = new RenderWindow(VideoMode(640u, 480u), "GameWindow")
    window.SetVerticalSyncEnabled(true)

    let displayStream = 
        Observable.Create(
            fun (observer:IObserver<TimeSpan>) -> 
                let sw = Stopwatch.StartNew()
                while (window.IsOpen()) do
                    window.DispatchEvents() // this calls the KeyPressed event synchronously
                    window.Display() // this blocks until the next vertical sync
                    window.Clear()
                    observer.OnNext sw.Elapsed
                    sw.Restart()
                observer.OnCompleted();
                { new IDisposable with …
Run Code Online (Sandbox Code Playgroud)

f# system.reactive

4
推荐指数
1
解决办法
181
查看次数

类型推断:函数与类型

我正在学习F#,我不明白类型推断和泛型如何在这种语言中工作.例如,我可以声明一个通用的min函数,并将它与不同类型的参数一起使用:

let min a b = if a < b then a else b

let smallestInt = min 3 5
let smallestFloat = min 3.0 5.0
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用类型相同的东西,它不起作用:

type Point2D(x, y) = 
    member this.X = x
    member this.Y = y

let float32Point = new Point2D(0.0f, 1.0f)
let intPoint = new Point2D(0, 1) // This expression was expected to have type 
                                 // float32 but here has type int
Run Code Online (Sandbox Code Playgroud)

所以,我有几个问题:

  • 为什么我可以为不同类型而不是类型定义重用通用函数定义?
  • 该功能是否适用于运行时的每种类型,如C#泛型?或者在编译时像C++模板一样?或者是拳击执行将每个参数视为IComparable?

谢谢.

f#

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

"枚举类"在Visual C++ 2012中的含义是什么?

enum classVisual C++ 2012中有两个相互矛盾的定义:

  • C++ 11,类型安全版 enum
  • C++/CLI System::Enum派生类型,相当于ref class带有静态const积分成员的类型.

enum class启用或禁用/ clr开关时更改的含义是什么?

.net c++ enums visual-c++ c++11

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

F#Interactive中的StructLayout限制?

我注意到如果我用StructLayout.Sequential定义一个结构,就像这样:

open System.Runtime.InteropServices

[<StructLayout(LayoutKind.Sequential, Pack=1)>]
type SomeType =
 val mutable Field1: uint32
 val mutable Field2: uint32
Run Code Online (Sandbox Code Playgroud)

这在实际程序中编译并正常工作,但FSI给出了错误 error FS0193: internal error: Could not load type 'SomeType' from assembly 'FSI-ASSEMBLY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' because field 'Field1' was not given an explicit offset.

这是FSI的错误或限制吗?有解决方法吗?

f# f#-interactive

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

如何在嵌套作用域中引用同名的类型

我正在尝试访问上层模块中定义的类型:

module MainModule

type Data = { stuff }

module XmlDeserialization =
    type Data() =
       [<XmlAttribute("stuff")>]
       member val stuff ...

       member x.ToDomainType() =
           {
               stuff = x.stuff
           } : MainModule.Data
Run Code Online (Sandbox Code Playgroud)

问题是,最后一行没有编译,因为"未定义类型'MainModule'."

我能够使用命名空间来实现我想要的,但是可以使用模块来实现吗?

f#

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