小编ice*_*man的帖子

生成从1到n的素数,崩溃n> 3亿

有关如何让这个程序工作n = 1万亿(除了升级/购买新计算机)的任何建议?

错误如下:构建后,正在执行的程序(命令行样式输出窗口弹出)然后快速关闭,我得到以下错误"ProjectPrimes.exe已停止工作(Windows正在寻找解决方案这个问题."我怀疑这与内存问题有关,因为我第一次遇到n = 2000万,但那是在我选择malloc /释放'筛'阵列之前(即我的'筛'阵列是大阵列)尺寸nx 1,每个元素由1或0组成.

该程序需要大约35秒才能完成前3亿个整数(16,252,325个素数),所以没关系,但没什么了不起的.正如我所提到的,目标是能够产生低于1万亿的质数,所以我还有很长的路要走......

如果相关,这是我的机器规格(如果在这台机器上目标恰好是不合理的):2.40ghz i5,4GB RAM,64位Windows 7.

方法概述,对于那些不熟悉的人:我们使用Sienda of Sundaram方法.在没有进入证明的情况下,我们首先使用筛选函数消除整数"n"以下的所有奇数非素数:[2*(i + j + 2*i*j)+1 | i < - [1..n/2],j < - [i..an优化上限]].然后我们交掉偶数(当然不包括两个).这让我们留下了素数.

为什么prime函数返回(指向包含数组的指针)n下面的完整素数集?那么,目标是能够识别(i)n以下的素数以及(ii)列出n以下的素数.这也是为什么我选择传递一个指针,用于将n下面的素数计数作为参数.

这是不那么令人兴奋的"主要"功能:

int main() {
    long ceiling = 300*1000*1000;
    long *numPrimes;
    long *primes;

    primes = primesToSS(ceiling+1, numPrimes);
    printf("\n\nThere are %d primes below %d.\n\n",*numPrimes,ceiling);

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

这是肉:

//n represents the ceiling, i.e., the integer below which we will generate primes
//cnt* is a pointer which will point the number of primes …
Run Code Online (Sandbox Code Playgroud)

c primes sieve-of-eratosthenes

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

构造状态Monad中的错误处理的最小Haskell示例

我正在扭曲我的大脑,试图理解如何将Statemonad与... 结合起来Maybe.

让我们从一个具体(并且故意琐碎/不必要)的例子开始,我们使用Statemonad来查找数字列表的总和:

import Control.Monad.State

list :: [Int]
list = [1,4,5,6,7,0,3,2,1]

adder :: Int
adder = evalState addState list

addState :: State [Int] Int
addState = do
  ms <- get
  case ms of
    []     -> return 0
    (x:xs) -> put xs >> fmap (+x) addState
Run Code Online (Sandbox Code Playgroud)

凉.

现在让我们修改它,以便Nothing在列表包含数字时返回a 0.换句话说,evalState addState' list应该返回Nothing(因为list包含a 0).我觉得它可能看起来像这样......

addState' :: State [Int] (Maybe Int)
addState' = do
  ms <- get
  case …
Run Code Online (Sandbox Code Playgroud)

monads haskell state-monad monad-transformers maybe

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

strdup():对警告感到困惑('隐式声明','使指针......没有强制转换',内存泄漏)

当我编译下面的一小段代码(我们在其中定义一个字符串,然后使用strdup进行复制)时,我得到3个警告:来自GCC的2个编译器警告和来自valgrind的1个运行时警告/错误.

我怀疑内存泄漏错误(由valgrind报告)也与我使用strdup有关,这就是我在下面包含相关输出的原因.

我究竟做错了什么?(我正在通过一本C书,这就是作者使用strdup的方式.)


代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
  char *string1 = "I love lamp";
  char *string2;

  string2 = strdup(string1);

  printf("Here's string 1: %s\n"
     "Here's string 2: %s\n",
     string1, string2);

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

警告/输出:

dchaudh@dchaudhUbuntu:~/workspaceC/LearnCHW/Ex17_StructsPointers$ make test
cc -std=c99    test.c   -o test
test.c: In function ‘main’:
test.c:9:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
   string2 = strdup(string1);
   ^
test.c:9:11: warning: assignment makes pointer from integer without a cast [enabled by default]
   string2 = strdup(string1);
           ^ …
Run Code Online (Sandbox Code Playgroud)

c valgrind strdup

3
推荐指数
2
解决办法
8666
查看次数

Haskell:对`>> =`运算符的类型感到困惑

我正在通过一些介绍性的Haskell材料,目前正在通过Monads.我从概念上理解>>=运算符的类型是:

(Monad m) => m a -> (a -> m b) -> m b.

在这种情况下,我很困惑为什么下面的代码工作,即为什么它不会导致类型不匹配:

main = getLine >>= \xs -> putStrLn xs
Run Code Online (Sandbox Code Playgroud)

因为我们知道getLine :: IO String,我认为它可以与类型函数"绑定" String -> IO String.但是putStrLn有不同的类型:putStrLn :: String -> IO ().

那么为什么Haskell允许我们使用>>=这两个函数呢?

monads haskell bind io-monad

3
推荐指数
2
解决办法
154
查看次数

Haskell:中缀(`:`)运算符是否有左侧标识?

换句话说,我可以使用什么语法(如果有的话)代替XXX以下的过滤器实现:

filter' :: (a -> Bool) -> [a] -> [a]
filter' _ []     = []
filter' f (x:xs) =
  let n = if f x then x else XXX
  in  n:(filter' f xs)
Run Code Online (Sandbox Code Playgroud)

我知道以下替代实现(它是递归的,只是prepends)但如果中缀运算符具有LHS身份,仍然会很奇怪.

filter' :: (a -> Bool) -> [a] -> [a]
filter' _ []     = []
filter' f (x:xs)
  | f x = x:(filter' f xs)
  | otherwise = filter' f xs
Run Code Online (Sandbox Code Playgroud)

haskell list

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

Haskell:函数组合导致类型不匹配错误

TL; DR:纯粹由于功能组成而导致GHCi中的类型不匹配错误的原因是什么?看到GHCi评估以下代码很奇怪:

foldl (a . b . c) crackle pop       <- GHCi evaluates this`
Run Code Online (Sandbox Code Playgroud)

...只是在我们尝试评估以下内容后给出错误:

let snap = a . b . c                <- GHCi evaluates this
foldl snap crackle pop              <- GHCi reports an error (!)
Run Code Online (Sandbox Code Playgroud)

版本较长:

我对GHCi中观察到的内容感到困惑,我希望有人可以解释一下(图片说明如下):

在此输入图像描述

我们在上面看到了什么?:

  • 首先,我们有一个变量b,它绑定到以下列表:[(2,["Dipak"]), (2,["Andrew"]),(2,["Keone"])]. b是类型的[(Int,[String])].(请参阅ghci>上面屏幕截图中的第一个提示和结果输出.)

  • 然后我们执行折叠b,将其转换为以下类型:Map (Integer, [String]).我们通过使用基于insertWith (++)作为empty地图的起始累加器的折叠函数来实现.该功能如下(与ghci>上面屏幕截图中的第二个提示相同.(参见ghci>上面的第二个提示.)

    foldl' (flip $ uncurry (Map.insertWith (++))) (Map.fromList []) b

  • 好的,很酷; 到现在为止还挺好 …

haskell ghci

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

如何使用IO monad中的可变结构

TL; DR:
如何确保给定语句中randomRIO(from System.Random)生成的值的持久性do
如何使用IO Monad中的可变结构?

我最初的问题是(非常)错误 - 我正在更新标题,以便将来想要理解在IO monad中使用可变结构的读者可以找到这篇文章.

更长的版本:

抬头:这看起来很长,但很多只是我概述了如何exercism.io运作.(更新:最后两个代码块是我的代码的旧版本,作为参考,以防未来的读者希望根据评论/答案跟随代码中的迭代.)

练习概述:

我正在Robot Name从(非常有教育意义的)exercism.io开始练习.练习涉及创建一个Robot能够存储名称的数据类型,该名称是随机生成的(练习Readme包括在下面).

对于那些不熟悉它的人,exercism.io学习模型基于学生生成的代码的自动测试.每个练习都包含一系列测试(由测试作者编写),解决方案代码必须能够通过所有测试.我们的代码必须通过给定练习的测试文件中的所有测试,然后我们才能进入下一个练习 - 一个有效的模型,imo.(Robot Name运动#20左右.)

在这个特殊的练习中,我们会要求创建一个Robot数据类型和三个附带功能:mkRobot,robotNameresetName.

  • mkRobot 生成一个实例 Robot
  • robotName生成并"返回"未命名的唯一名称Robot(即,robotName不覆盖预先存在的名称); 如果Robot已有名称,则只返回现有名称
  • resetName 用新的名称覆盖预先存在的名称.

在这个特定的练习中,有7个测试.测试检查:

  • 0)robotName生成符合指定模式的名称(名称长度为5个字符,由两个字母后跟三个数字组成,例如AB123,XQ915等)
  • 1)分配的名称robotName是持久性的(即,假设我们创建机器人A并使用它来为他(或她)分配名称robotName; robotName第二次调用(在机器人A上)不应该覆盖他的名字)
  • 2)robotName为不同的机器人生成唯一的名称(即,它测试我们实际上是随机化过程)
  • 3)resetName生成符合指定模式的名称(类似于测试#0)
  • 4)分配的名称resetName是持久的
  • 5) …

haskell mutable io-monad

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

Haskell初学者:"没有......来自...的错误."错误

我的目标是编写一个函数来计算低于某个数字'n'的最大Collat​​z数.(对于那些熟悉的人来说,这是一个项目欧拉问题.)

某些上下文:给定整数的Collat​​z数等于该整数的Collat​​z序列的长度.整数的Collat​​z序列计算如下:序列中的第一个数字("n0")是整数本身; 如果n0是偶数,则序列中的下一个数字("n1")等于n/2; 如果n0是奇数,那么n1等于3*n0 + 1.我们继续递归地扩展序列,直到我们到达1,此时序列结束.例如,5的折叠序列是:{5,16,8,4,2,1}(因为16 = 3*5 + 1,8 = 16/2,4 = 8/2,...)

我正在尝试编写一个函数("maxCollat​​zUnder"),当传递一个整数"m"时,它返回一个整数(小于或等于m),它具有最长的Collat​​z序列(即最大的Collat​​z数).例如,maxCollat​​z 20(即,低于(包括)20的整数具有最长的拼贴序列?)应该返回19(数字19具有长度为21的Collat​​z序列:[19,58,29,88,44,22, 11,34,17,52,26,13,40,20,10,5,16,8,4,2,1]).

在下面的代码中,"collat​​z"和"collat​​zHelper"函数可以正确编译和运行.我在使用"maxCollat​​zUnder"功能时遇到了麻烦.该函数旨在(I)为每个整数x创建一个2元组(x,y)的列表,范围从1到m(其中m是函数参数),其中y表示整数x的Collat​​z数,然后( II)查看列表中最高的Collat​​z数(即y)并返回其相关的整数(即x)

maxCollatzUnder n = foldl(\acc (i,j) -> if j > acc then i else acc) 0 
    (zip [1..n] ( map collatzLength [1..n]))
    where collatzLength n = length . collatz $ n

collatz n = map truncate $ collatzHelper n

collatzHelper 0 = [0]
collatzHelper 1 = [1]
collatzHelper n
    | (truncate n) `mod` 2 == 0 = [n] ++ collatzHelper (n/2)
    | …
Run Code Online (Sandbox Code Playgroud)

haskell collatz

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

在Windows PowerShell中设置GCC的别名

我正在尝试在Windows PowerShell中设置一个"gcc99"别名,它等于"gcc -std = C99 -pedantic -Wall".我们的想法是使用更少的击键来确保GCC以c99模式运行.(我已尽力使以下帖子中的指南适应Windows PowerShell:在GCC中设置std = c99标志)

当我在设置这样的别名(下面的图1)后尝试编译时,我收到一个错误.作为参考,如果我使用扩展命令进行编译,我不会收到此错误(参见下面的图2).作为测试,我尝试将gc99设置为"gcc"的别名(没有其他值)并且它工作正常(参见下面的3).请忽略我在代码中尚未解决的许多警告:)

有什么建议?

(我不确定为什么我的标题没有出现在下面的图片中.我正在使用自动创建的图片格式,例如,对于第一张图片:" 标题 "后面跟着" 1:链接"下一行.)

图1:尝试通过设置为

图表2:通过

图表3:通过设置为

c powershell alias gcc c99

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

C:是否有可能有一个递归函数,它将一个函数指针数组作为其参数之一?

这是更长的版本.(TL; DR版本在我的帖子标题中.)

让我们考虑一个递归quick_sort这是目前设置如下功能:(i)其有一个参数-一个链表,(ii)其按升序排序的元素,以及(iii)它返回一个排序的链表.下面的说明性代码(我可以根据要求发布实际代码 - 更长时间).

#include "list.h"  /*our linked-list implementation which includes definitions
                     for `concatenate`, which we use below*/

typedef int (*ordinal(int referenceValue, int currentValue));

int smaller(int referenceValue, int currentValue)
{
  return currentValue <= referenceValue ? 1 : 0;
}

int larger(int referenceValue, int currentValue)
{
  return currentValue > referenceValue ? 1 : 0;
}

List *getElements(List *fullList, ordinal compare)  /*let's assume this function exists*/
  /*implementation of getElements*/

List* quickSort(List* originalList)
{
  /*code to handle the two base …
Run Code Online (Sandbox Code Playgroud)

c pointers

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

使用记录语法在Haskell中编写OOP样式的"setter"函数

我正在阅读有关镜头的教程,在介绍中,作者lens通过展示我们如何使用标准Haskell实现OOP风格的"setter"/"getter"的一些示例来激发这一概念.我对以下示例感到困惑.

假设我们User根据图1(下面)定义代数数据类型.本教程(正确地)指出我们可以通过NaiveLens数据类型和nameLens函数实现"setter" 功能(也在图1中).图2给出了一个示例用法.

我很困惑为什么我们需要这样一个精心设计的构造(即NaiveLens数据类型和nameLens函数)来实现"setter"功能,当下面的(有点明显的)函数似乎同样很好地完成工作时:set' a s = s {name = a}.

但是,鉴于我的"显而易见"功能正是lambda函数的一部分nameLens,我怀疑使用下面的结构确实有一个优势,但我太密集了,看不出那个优点是什么.我希望其中一个Haskell向导可以帮助我理解.

图1(定义):

data User = User { name :: String
                 , age :: Int
                 } deriving Show

data NaiveLens s a = NaiveLens { view :: s -> a
                               , set :: a -> s -> s
                               }

nameLens :: NaiveLens User String
nameLens = NaiveLens name (\a s -> s …
Run Code Online (Sandbox Code Playgroud)

haskell record haskell-lens

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

Haskell:创建Show的实例

在下面的代码中,我定义了一个代数数据类型,我(尝试)使它成为Show的一个实例.但是,我遇到了编译时错误(包含在下面).我究竟做错了什么?

我相信我正在使用正确的语法(至少按照这篇文章).对于上下文,我正在'99 Haskell问题'中解决问题#13

data RepeatType a = Multiple (Int, a) | Single a

instance Show RepeatType where
  show (Multiple (n,x)) = "(" ++ n ++ " " ++ show x ++ ")"
  show (Single x)       = show x
Run Code Online (Sandbox Code Playgroud)

我收到以下编译时错误:

test.hs:3:15:
    Expecting one more argument to `RepeatType'
    In the instance declaration for `Show RepeatType'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

例如,目标是在GHCi中按如下方式工作:

ghci> Multiple (5,'C')
(5 C)
ghci> Single 'D'
D
Run Code Online (Sandbox Code Playgroud)

编辑:对不起完全不相关的帖子标题 - 现在改了.

haskell deriving

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

C:尽管添加了`-ldl`标志,但未定义对`dlopen` /`dlsym`的引用

TL; DR:我正在开展一个dlfcn.h用于打开共享库的C练习.尽管添加(我认为是)基于其他帖子的正确标志,我仍然会收到undefined reference to错误dlopen,dlsym并且在其中定义了一些其他函数dlfcn.h(错误消息和make文件包含在下面).

我在.c文件的开头包括以下内容:#include <dlfcn.h>

我究竟做错了什么?

详细版本:

我正在进行练习30,Learn C The Hard Way并且我很困惑我还需要做什么才能使libex29_tests.c程序(页面上的最后一段代码)正确编译.您可能已经知道,共享库/ makefile /编译器标志对我来说是新的.

到目前为止我尝试过的内容:基于以下帖子,我尝试-ldl通过添加LIBS=-ldl fPIC和/或添加LDFLAGS+=-ldl到Makefile的各个部分来添加标记,但仍然存在问题.书中的makefile版本(包含在下面,作为参考)确实包含一个-ldl标志,尽管语法略有不同.无论如何,我继续得到相同的错误消息.

有什么建议?


这些是我得到的错误.这些错误假定makefile下面包含的版本.但是,正如我所提到的,更改-ldl标志的语法会导致几乎相同的错误消息.

~/.../lchw/ex30_automated$ make
cc -std=gnu99 -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/libex29.o src/libex29.c
src/libex29.c: In function ‘fail_on_purpose’:
src/libex29.c:42:33: warning: unused …
Run Code Online (Sandbox Code Playgroud)

c makefile dlopen

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