小编Zet*_*eta的帖子

小代码片段导致ghc无法终止

这个小的haskell代码片段导致ghc在编译期间不终止:

{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -O2 #-}

import qualified Data.Vector.Unboxed.Mutable as MV
import Data.Vector.Unboxed ((!))
import qualified Data.Vector.Unboxed as V
import Control.Monad (forM_)

similar :: V.Vector Char -> Int
similar v = l + sum (map (similar' 1 1) checks)
  where
    (l,checks) = let h = V.head v in V.foldl'  
        (\(i,is) c -> if c == h then (i+1,i:is) else (i+1,is)) (1,[]) (V.tail v)
    similar' !r !n !i = if i < l-1 && v!(n) == …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

在haskell在不再引用它们之后立即完成外部指针

有没有办法确保某些特定类型的对象(基本上ForeignPtr)非常积极地进行垃圾收集?我有这样一种简单的类型:

data SomePtr = SomePtr { ptr :: ForeignPtr CUChar, size :: CSize }
alloc :: CSize -> IO SomePtr
free :: SomePtr -> IO ()
free = finalizeForeignPtr . ptr
Run Code Online (Sandbox Code Playgroud)

我认为标准理论是引用计数(我自己也会这样做,比方说,C++)比ghc使用的GC慢,这就是为什么它不使用它.但对我来说问题是,当使用外部分配的对象(如GPU内存)时,最终释放它的承诺是不够的.内存非常稀缺,据我所知,ForeignPtr终结器实际上并没有被调用.我想尽快释放记忆,所以我最终打电话给finalizeForeignPtr自己.

是否有某种方法可以告诉ghc在破坏某些特定类型的对象时非常积极?

或者我是以错误的方式来做这件事的?

这是一个示例代码来说明我的意思:

哈斯克尔

{-# LANGUAGE RecordWildCards #-}
import Foreign.ForeignPtr.Safe
import Foreign.Ptr
import Foreign.Marshal.Alloc
import Foreign.Storable
import Control.Monad
import Foreign.C.Types
import Text.Printf

data FPtr = FPtr { fptr :: ForeignPtr CUChar, size :: CSize }

foreign import ccall "falloc" falloc …
Run Code Online (Sandbox Code Playgroud)

haskell

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

我有哪个套餐版本?

人们应该认为这是一个FAQ,但我无法找到这个简单问题的答案:

我的GHC安装中有哪个版本的某个软件包?

背景

我正在努力学习Haskell,为了做到这一点,我正在通过Real World Haskell.我现在已经达到了第11章,其中包括其他主题,介绍了QuickCheck.

遗憾的是,自2009年该书出版以来,QuickCheck已发生变化,似乎已经进行了各种修改.每当我寻找新的做事方式时,作为书中说明的替代方案,新的方式有时也无效.也许2012年描述了"新方式",但随后QuickCheck在当时和现在之间再次发生了变化.

最后,我将不得不弄清楚如何从文档或源代码中使用QuickCheck,但知道我应该调查哪个版本会非常有帮助.

我还没有达到我了解Cabal等的地步,所以我的问题是基于纯粹的无知.希望有一个简单的答案.

我在Windows上使用GHC,显然,QuickCheck已经捆绑到我的安装中.我已经有了QuickCheck,但我不知道哪个版本.

haskell ghc quickcheck

8
推荐指数
2
解决办法
331
查看次数

使用std :: accumulate计算均值失败

我正在尝试使用以下代码计算双精度向量的平均值(编译g++ mean.cc -std=c++0x):

// mean.cc

#include <algorithm>
#include <iostream>
#include <vector>

struct Mean {
  unsigned int n;
  Mean(unsigned int n) : n(n) {}
  double operator()(double sum, double x) {
    return sum + x/n;
  }
};

int main () {
  std::vector<double> v = {1,2,3,4,5,6};
  Mean mean(v.size());
  std::cout << "mean: " << std::accumulate(v.begin(), v.end(), 0, mean) << "\n";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

3.5我认为平均值应该是.然而该程序打印mean: 1.

如果我删除除法n,我operator()的元素总和按预期计算.我在这做错了什么?

c++ std

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

是不是"文本溢出:省略号"有效的CSS?

此代码在通过W3C CSS Validator运行时触发错误:

p{
    text-overflow: ellipsis;
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

Line     Code context      Error/Warning
2        p                 Parse Error [empty string]

它只是验证器中的一个错误,还是我错过了一些非常明显的东西?

css w3c-validation

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

如何记录与Q_PROPERTY同名的访问者功能?

TL; DR:如何为与其声明的属性同名的访问者生成doxygen文档Q_PROPERTY


Qt的属性系统可以在给定属性上使用Qt的元对象系统:

// example class and documentation
class Widget : public QObject {
  Q_OBJECT
  Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged)

public:
  Widget(QObject * parent = nullptr) : QObject(parent){}
  int size() const;

public slots:
  void setSize(int new_size);

signals:
  void sizeChanged(int); //!< signals a size change

private:
  int m_size = 0; //!< the Widget's size, see #size.
};
Run Code Online (Sandbox Code Playgroud)

如果现在在实现中使用doxygen

//! @property size is the size of our widget

//! @brief Set the widget's size …
Run Code Online (Sandbox Code Playgroud)

c++ qt doxygen

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

如何使用 CMake 从 qmake 建模 OTHER_FILES?

qmake基础项目中,可以OTHER_FILES在 QtCreator 中使用它们,例如

QT += core gui widgets
TARGET = example-program
TEMPLATE = app

HEADERS = mainwindow.h
SOURCES = main.cpp mainwindow.cpp

OTHER_FILES = README.md LICENCE examples/network/server.c
Run Code Online (Sandbox Code Playgroud)

这样人们就可以README.md轻松地在 QtCreator 中访问。具有相同目标的 CMake 文件看起来像

cmake_minimum_required(VERSION 3.5)
project(example CXX)

set(CMAKE_AUTOMOC ON)

find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)

set(HEADERS mainwindow.h)
set(SOURCES main.cpp mainwindow.cpp)
set(OTHER_FILES README.md LICENCE examples/network/server.c)

add_executable(example-program ${SOURCES} ${HEADERS})
target_link_libraries(example-program Qt5::Core Qt5::Gui Qt5::Widgets)
Run Code Online (Sandbox Code Playgroud)

但是,它们OTHER_FILES没有显示在 QtCreator 中,我必须通过“文件 > 打开”而不是项目浏览器来访问它们。有解决方法吗?

qt qmake cmake qt-creator

7
推荐指数
2
解决办法
1236
查看次数

我可以检测是否支持CSS滤镜效果?

CSS滤镜效果目前处于草稿状态,但Chrome已经支持.它提供了对图像应用效果的可能性:

CSS过滤器属性在元素显示之前提供元素渲染上的模糊或色移等效果.滤镜通常用于调整图像,背景或边框的渲染.

CSS标准中包含了几个实现预定义效果的函数.您还可以使用SVG过滤器元素的URL引用SVG中指定的过滤器.(来源)

据我所知,CSS过滤器效果仅支持Chrome 18+,但是有可能通过JavaScript或一些CSS技巧检测CSS过滤器效果的可用性吗?

javascript css css3

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

初始化时真的需要大括号吗?

根据GCC 4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5),我在以下代码中的数组初始化中缺少大括号:

#include <iostream>
#include <boost/array.hpp>
#include <array>

int main(){
  int                   plain[]   = {1,2,3,4,5};
  std::array  <int, 5>  std_arr   = {1,2,3,4,5}; // warning, see below
  boost::array<int, 5>  boost_arr = {1,2,3,4,5}; // warning, see below
  std::cout << plain[0] << std_arr[1] << boost_arr[2] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
> g++ test.cc -Wall -Wextra -pedantic --std=c++0x                                                                                  
test.cc: in function »int main()«:
test.cc:7:47: warning: curly braces missing around initialization for »std::array::value_type [5] {aka int [5]}« [-Wmissing-braces]
test.cc:8:47: warning: curly braces missing around initialization for »int [5]« [-Wmissing-braces] …

c++ gcc-warning

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

为什么我的"Hello world"程序需要几乎10秒?

我已将CUDA运行时和驱动程序版本7.0安装到我的工作站(Ubuntu 14.04,2xIntel XEON e5 + 4x Tesla k20m).我使用以下程序检查我的安装是否有效:

#include <stdio.h>

__global__ void helloFromGPU()
{
    printf("Hello World from GPU!\n");
}

int main(int argc, char **argv)
{
    printf("Hello World from CPU!\n");

    helloFromGPU<<<1, 1>>>();

    printf("Hello World from CPU! Again!\n");

    cudaDeviceSynchronize();

    printf("Hello World from CPU! Yet again!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了正确的输出,但它需要一段时间:

$ nvcc hello.cu -O2
$ time ./hello > /dev/null

real    0m8.897s
user    0m0.004s
sys     0m1.017s`
Run Code Online (Sandbox Code Playgroud)

如果我删除所有设备代码,则整体执行需要0.001秒.那么为什么我的简单程序几乎需要10秒钟?

c c++ cuda

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

标签 统计

c++ ×4

haskell ×3

css ×2

ghc ×2

qt ×2

c ×1

cmake ×1

css3 ×1

cuda ×1

doxygen ×1

gcc-warning ×1

javascript ×1

qmake ×1

qt-creator ×1

quickcheck ×1

std ×1

w3c-validation ×1