我正在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++/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) 我想在我的应用程序中检查用户是否不活动.我做了一些研究,然后使用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天的建议表示赞赏.
我正在研究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) Task.ContinueWith的一些重载不采用SynchronizationContext.他们使用什么SynchronizationContext来安排新任务?
我正在尝试使用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#,我不明白类型推断和泛型如何在这种语言中工作.例如,我可以声明一个通用的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)
所以,我有几个问题:
谢谢.
enum classVisual C++ 2012中有两个相互矛盾的定义:
enumSystem::Enum派生类型,相当于ref class带有静态const积分成员的类型.enum class启用或禁用/ clr开关时更改的含义是什么?
我注意到如果我用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的错误或限制吗?有解决方法吗?
我正在尝试访问上层模块中定义的类型:
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'."
我能够使用命名空间来实现我想要的,但是可以使用模块来实现吗?