有关如何让这个程序工作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) 我正在扭曲我的大脑,试图理解如何将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) 当我编译下面的一小段代码(我们在其中定义一个字符串,然后使用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) 我正在通过一些介绍性的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允许我们使用>>=这两个函数呢?
换句话说,我可以使用什么语法(如果有的话)代替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) 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
好的,很酷; 到现在为止还挺好 …
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,robotName和resetName.
mkRobot 生成一个实例 Robot robotName生成并"返回"未命名的唯一名称Robot(即,robotName不覆盖预先存在的名称); 如果Robot已有名称,则只返回现有名称resetName 用新的名称覆盖预先存在的名称.在这个特定的练习中,有7个测试.测试检查:
robotName生成符合指定模式的名称(名称长度为5个字符,由两个字母后跟三个数字组成,例如AB123,XQ915等)robotName是持久性的(即,假设我们创建机器人A并使用它来为他(或她)分配名称robotName; robotName第二次调用(在机器人A上)不应该覆盖他的名字)robotName为不同的机器人生成唯一的名称(即,它测试我们实际上是随机化过程)resetName生成符合指定模式的名称(类似于测试#0)resetName是持久的我的目标是编写一个函数来计算低于某个数字'n'的最大Collatz数.(对于那些熟悉的人来说,这是一个项目欧拉问题.)
某些上下文:给定整数的Collatz数等于该整数的Collatz序列的长度.整数的Collatz序列计算如下:序列中的第一个数字("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,...)
我正在尝试编写一个函数("maxCollatzUnder"),当传递一个整数"m"时,它返回一个整数(小于或等于m),它具有最长的Collatz序列(即最大的Collatz数).例如,maxCollatz 20(即,低于(包括)20的整数具有最长的拼贴序列?)应该返回19(数字19具有长度为21的Collatz序列:[19,58,29,88,44,22, 11,34,17,52,26,13,40,20,10,5,16,8,4,2,1]).
在下面的代码中,"collatz"和"collatzHelper"函数可以正确编译和运行.我在使用"maxCollatzUnder"功能时遇到了麻烦.该函数旨在(I)为每个整数x创建一个2元组(x,y)的列表,范围从1到m(其中m是函数参数),其中y表示整数x的Collatz数,然后( II)查看列表中最高的Collatz数(即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) 我正在尝试在Windows PowerShell中设置一个"gcc99"别名,它等于"gcc -std = C99 -pedantic -Wall".我们的想法是使用更少的击键来确保GCC以c99模式运行.(我已尽力使以下帖子中的指南适应Windows PowerShell:在GCC中设置std = c99标志)
当我在设置这样的别名(下面的图1)后尝试编译时,我收到一个错误.作为参考,如果我使用扩展命令进行编译,我不会收到此错误(参见下面的图2).作为测试,我尝试将gc99设置为"gcc"的别名(没有其他值)并且它工作正常(参见下面的3).请忽略我在代码中尚未解决的许多警告:)
有什么建议?
(我不确定为什么我的标题没有出现在下面的图片中.我正在使用自动创建的图片格式,例如,对于第一张图片:" 标题 "后面跟着" 1:链接"下一行.)



这是更长的版本.(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) 我正在阅读有关镜头的教程,在介绍中,作者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) 在下面的代码中,我定义了一个代数数据类型,我(尝试)使它成为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)
编辑:对不起完全不相关的帖子标题 - 现在改了.
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)