这个小的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) 有没有办法确保某些特定类型的对象(基本上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) 人们应该认为这是一个FAQ,但我无法找到这个简单问题的答案:
我的GHC安装中有哪个版本的某个软件包?
我正在努力学习Haskell,为了做到这一点,我正在通过Real World Haskell.我现在已经达到了第11章,其中包括其他主题,介绍了QuickCheck.
遗憾的是,自2009年该书出版以来,QuickCheck已发生变化,似乎已经进行了各种修改.每当我寻找新的做事方式时,作为书中说明的替代方案,新的方式有时也无效.也许2012年描述了"新方式",但随后QuickCheck在当时和现在之间再次发生了变化.
最后,我将不得不弄清楚如何从文档或源代码中使用QuickCheck,但知道我应该调查哪个版本会非常有帮助.
我还没有达到我了解Cabal等的地步,所以我的问题是基于纯粹的无知.希望有一个简单的答案.
我在Windows上使用GHC,显然,QuickCheck已经捆绑到我的安装中.我已经有了QuickCheck,但我不知道哪个版本.
我正在尝试使用以下代码计算双精度向量的平均值(编译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()的元素总和按预期计算.我在这做错了什么?
此代码在通过W3C CSS Validator运行时触发错误:
p{
text-overflow: ellipsis;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
Line Code context Error/Warning 2 p Parse Error [empty string]
它只是验证器中的一个错误,还是我错过了一些非常明显的东西?
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) 在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 中,我必须通过“文件 > 打开”而不是项目浏览器来访问它们。有解决方法吗?
根据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] … 我已将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++ ×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