小编Lit*_*rum的帖子

1511
推荐指数
11
解决办法
72万
查看次数

IORef和MVar有什么区别?

我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦.有人可以帮我解决这个问题吗?他们似乎解决了同样的问题.MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数.

谢谢!

multithreading haskell ioref

18
推荐指数
1
解决办法
1490
查看次数

为什么这段代码除以零?

我有一个小的Haskell程序,很好奇为什么在运行它时会抛出除零异常(GHC 7.0.3)

import qualified Data.ByteString.Lazy as B
import Codec.Utils

convert :: B.ByteString -> [Octet]
convert bs = map (head . toTwosComp) $ B.unpack bs

main = putStrLn $ show $ convert $ B.pack [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

谁能帮我理解这里发生了什么?

haskell divide-by-zero

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

在Haskell中返回特定类型

关于Haskell的类型系统,我有一个相当普遍的问题.我正在努力熟悉它,我有以下功能:

getN :: Num a => a
getN = 5.0 :: Double
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到以下错误:

Couldn't match expected type `a' against inferred type `Double'
  `a' is a rigid type variable bound by
      the type signature for `getN' at Perlin.hs:15:12
In the expression: 5.0 :: Double
In the definition of `getN': getN = 5.0 :: Double
Run Code Online (Sandbox Code Playgroud)

据我了解,该函数设置为"返回"类Num中的类型.Double是在这个类中(http://www.zvon.org/other/haskell/Outputprelude/Num_c.html),所以我原本预计在这种情况下"返回"Double是可以的.

有人可以解释一下吗?

haskell types type-systems compiler-errors typeclass

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

Swift中的矢量SIMD类型

我想知道是否可以使用Swift中定义的SIMD类型<simd/simd.h>(例如vector_float3).我似乎无法找到一种方法来做到这一点.

谢谢!

types vector simd swift

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

如何使用Windows运行时使用C#实现C++ API?

我正在使用一个原生C++应用程序,它有一个插件系统,它将在LoadLibrary()/ GetProcAddress().dll上调用函数.我想实现其中一个插件,在插件中我想使用持久性框架来保存/加载一个复杂的对象图到磁盘.

看起来Windows上支持最多的ORM是实体框架,这个页面说实体框架核心是最现代的风格.这个页面好像说,为了使用Entity Framework Core,你的数据模型必须用C#编写.

所以,听起来我必须从C++调用C#.幸运的是,似乎Entity Framework Core 支持通用Windows运行时,它应该使语言之间的调用变得容易.

此演示文稿似乎表示从C++与Universal Windows Runtime交互涉及创建Windows运行时组件,编译步骤可以从Windows运行时组件的.winmd文件生成粘合代码.

因此,我可以制作一个包含两个项目的Visual Studio解决方案:外部"C++ Windows桌面动态链接库"项目和内部"C#通用Windows运行时组件".

外部C++ Windows桌面动态链接库 内部C#通用Windows运行时组件

然后,文档说"引用Windows运行时组件的Windows运行时元数据(.winmd)文件,然后构建." 但是,当我在外部项目中添加引用时,当我尝试选择内部项目时出现错误,并且没有选项可以浏览以选择任意项.winmd.

尝试添加对内部项目的引用时出错

即使我进入解决方案管理器并删除除x86两个项目之外的所有平台,也会发生此错误.

这是令人惊讶的,因为这篇Windows博客帖子明确表示本机代码应该能够通过添加对该引用的引用来调用UWP代码.winmd(尽管帖子使用较旧的C++/CX语法).

如果我重新开始并使用"C++/WinRT Windows运行时组件"而不是"C++ Windows桌面动态链接库"项目,我仍然有问题.

外部C++/WinRT Windows运行时组件

如果我这样做,我可以添加参考就好了.

成功的参考

但是,当我尝试构建时,我遇到了构建失败.

1>------ Build started: Project: InnerCSharp, Configuration: Debug x86 ------
1>  InnerCSharp -> C:\Users\lithe\source\repos\EntityFrameworkInsideC++\InnerCSharp\bin\x86\Debug\InnerCSharp.winmd
2>------ Build started: Project: OuterC++WinRT, Configuration: Debug Win32 ------
2>MIDLRT Processing C:\Users\lithe\source\repos\EntityFrameworkInsideC++\OuterC++WinRT\Class.idl
2>Class.idl
2>MIDLRT Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\winrtbase.idl
2>winrtbase.idl
2>MIDLRT Processing …
Run Code Online (Sandbox Code Playgroud)

c# visual-studio uwp c++-winrt

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

C++ vtables中的双重间接

我写了这个非常简单的C++程序,我想知道为什么编译器会在两个指针引用之间列出vtable.这是C++程序:

class Foo {
 public:
  virtual void bar() {
  }
};

int main(int argc, char *arv[]) {
  Foo foo;
  Foo *foo_p(&foo);
  foo_p->bar();
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以看一下编译器生成的程序集:

$ g++ -ggdb -Wall -O0 -S test.cpp
Run Code Online (Sandbox Code Playgroud)

以下是相关部分:

    .loc 1 9 0 
    leaq    -16(%rbp), %rax  # put the address of 'foo' in %rax
    movq    %rax, %rdi       # use it as the first argument of the following function
    call    _ZN3FooC1Ev      # call the Foo constructor
    .loc 1 10 0
    leaq    -16(%rbp), %rax  # put the address of …
Run Code Online (Sandbox Code Playgroud)

c++ assembly pointers function-pointers vtable

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

对于制服和顶点属性,OpenGL 索引和位置是否相同?

在 OpenGL 参考页中,一些函数被标记为使用统一位置,而其他函数被标记为使用统一索引。这些是同一件事吗?

与顶点属性类似,一些函数被标记为使用顶点属性索引,而其他函数被标记为使用顶点属性位置。这些是一样的吗?

opengl opengl-es opengl-3 opengl-4 opengl-es-2.0

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

C C++链接错误

我正在用C++编写一个使用CLAPACK ATLAS库的程序.但是,我无法让程序成功链接到库.我写了一个小C程序来更好地演示这个问题.有趣的是,如果我用GCC编译它,这个小的演示程序链接就好了,但是当我尝试用G ++编译时,我得到了相同的链接器错误.我希望有人可以帮我弄清楚G ++和GCC究竟在做什么,以便将原始程序链接起来(原始程序是一个C++程序,我不能只是"使用GCC")

这是一个小型演示程序:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <cblas.h>
#include <clapack.h>

// a is a column-major array of all the values in the matrix to invert
// The matrix's height and width are the same because it is a square matrix.
void invertMatrix(float *a, unsigned int height)
{
    int info, ipiv[height];
    info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv);
    info = clapack_sgetri(CblasColMajor, height, a, height, ipiv);
}

void displayMatrix(float *a, unsigned int height, unsigned int width) …
Run Code Online (Sandbox Code Playgroud)

gcc g++ lapack atlas

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

可可绑定不会反向更新

我试图了解可可绑定的方向性。特别是,我已经编写了这个小程序来演示绑定,但是我不确定为什么会输出它的作用。这是程序:

@interface SimpleClass : NSObject
@property (retain) NSString *s; 
@end

@implementation SimpleClass
@end

int main(int argc, char *argv[]) {
    SimpleClass *simpleClass1 = [[SimpleClass alloc] init];
    SimpleClass *simpleClass2 = [[SimpleClass alloc] init];

    [simpleClass1 bind:@"s" toObject:simpleClass2 withKeyPath:@"s" options:nil];

    //[simpleClass1 willChangeValueForKey:@"s"];
    simpleClass1.s = @"Hello, World!";
    //[simpleClass1 didChangeValueForKey:@"s"];

    NSLog(@"%@", simpleClass1.s);
    NSLog(@"%@", simpleClass2.s);

    simpleClass2.s = @"Something else!";

    NSLog(@"%@", simpleClass1.s);
    NSLog(@"%@", simpleClass2.s);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行该程序时,输出为:

Hello, World!
(null)
Something else!
Something else!
Run Code Online (Sandbox Code Playgroud)

这使我相信绑定是单向的。不过,我已经遇到这个这个,这两个似乎是说,绑定应该是双向的(虽然也不是很清楚)。取消注释willChangeValueForKey和didChangeValueForKey行不会影响输出。

我的结论是正确的,绑定是单向的吗?还是有一些方法可以在绑定创建时指定它是双向的?

macos cocoa objective-c cocoa-bindings

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

声明类型类的所有实例都在另一个类型类中,而不修改原始类声明

crypto-api包中有一个Crypto.Random API,用于指定"伪随机数生成器"的含义.

我使用System.Random的RandomGen类的实例,即StdGen实现了这个API:

instance CryptoRandomGen StdGen where
  newGen bs = Right $ mkStdGen $ shift e1 24 + shift e2 16 + shift e3 8 + e4
    where (e1 : e2 : e3 : e4 : _) = Prelude.map fromIntegral $ unpack bs
  genSeedLength = Tagged 4
  genBytes n g = Right $ genBytesHelper n empty g
    where genBytesHelper 0 partial gen = (partial, gen)
          genBytesHelper n partial gen = genBytesHelper (n-1) (partial `snoc` nextitem) newgen
            where (nextitem, newgen) = …
Run Code Online (Sandbox Code Playgroud)

haskell subclass instance typeclass

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