小编Nor*_*sey的帖子

应该什么时候C函数返回新分配的内存?

在其他地方的回复中,我找到了以下代码段:

一般来说,让C调用者分配内存而不是被调用者更好 - 因此在我看来strcpy是一个"更好"的函数,而不是strdup.

我可以看到这是一个有效的模式,但为什么它可以被认为更好?遵循这种模式是否有优势?或不?

最近我写了大量的代码,看起来像:

struct foo *a = foo_create();
// do something with a
foo_destroy(a);
Run Code Online (Sandbox Code Playgroud)

如果foo它不是一个扁平结构,那么我想我可以将所有初始化放在一个步骤中.另外,假设结构应该在堆上.为什么这样做会更好:

struct foo *a = malloc(sizeof(foo));
foo_init(a);
// do something with a
foo_destroy(a)
Run Code Online (Sandbox Code Playgroud)

c memory-management coding-style

14
推荐指数
4
解决办法
4439
查看次数

如何在使用GHC编译的Haskell函数中找到分配?

我正在使用GHC 7.4来编译以下函数:

nodups' :: [Int] -> Bool
nodups' = ok empty
  where ok _ [] = True
        ok seen (n:ns) = not (n `member` seen) && ok (n `insert` seen) ns
        member n word = testBit word n
        insert n word = setBit word n
        empty = 0 :: Int
Run Code Online (Sandbox Code Playgroud)

该函数在小整数列表中查找重复元素.该集合seen表示一组小整数作为位向量.分析器(运行ghc -prof -auto-all)声称该ok功能占总分配的22%.查看输出-ddump-simpl,我无法理解为什么这个代码正在分配.我检查过,据我所知,它没有为呼叫分配一个thunk insert.

我应该注意什么来识别我的代码分配部分?

haskell memory-management ghc

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

如何使用牛顿方法(代码非线性代数)找到最小的非线性,多元函数

我正在尝试进行一些参数估计,并希望选择参数估计值,以最大限度地减少预测方程中的平方误差超过约30个变量.如果方程是线性的,我只计算30个偏导数,将它们全部设为零,并使用线性方程求解器.但不幸的是,这个等式是非线性的,它的衍生物也是如此.

如果方程式超过单个变量,我只会使用牛顿方法(也称为Newton-Raphson).Web上有丰富的示例和代码来实现Newton的单个变量函数的方法.

鉴于我有大约30个变量,如何使用牛顿方法为这个问题编写数值解?我有闭合形式的方程,可以计算一阶和二阶导数,但我不知道如何从那里开始.我在网上发现了大量的治疗方法,但很快就会进入重基质表示法.我在维基百科上找到了一些适度的帮助,但我在将其转换为代码时遇到了麻烦.

我担心崩溃的地方是矩阵代数和矩阵求逆.我可以使用线性方程求解器反转矩阵,但我担心得到正确的行和列,避免换位错误,等等.

要非常具体:

  • 我想使用表将变量映射到它们的值.我可以写一个这样一个表的函数,它返回给出这样一个表作为参数的平方误差.我还可以创建相对于任何给定变量返回偏导数的函数.

  • 我对表中的值有一个合理的初始估计,所以我不担心收敛.

  • 我不确定如何编写使用估计的循环(每个变量的值表),函数和部分导数函数表来产生新的估计.

最后一点是我要帮助的.任何直接的帮助或指向好的来源将受到热烈的赞赏.


编辑:由于我有封闭形式的第一和第二衍生物,我想利用它们并避免更简单的融合方法,如单面搜索.

minimization nonlinear-functions newtons-method

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

ImageMagick/Imagick使用本机PHP API将PDF转换为JPG

我正在尝试将PDF文件转换为PNG.它在命令行中运行良好(我安装了GhostScript 8.64).但是从PHP我遇到了一个问题:

码:

$im = new Imagick($pdf_file); // this is where it throws the exception below
Run Code Online (Sandbox Code Playgroud)

输出:

Fatal error: Uncaught exception ‘ImagickException’ with message ‘Postscript delegate failed `23_1235606503.pdf’: No such file or directory @ pdf.c/ReadPDFImage/612? in get_thumbnail.php:93
Stack trace:
\#0 get_thumbnail.php(93): Imagick->__construct(’…’)
Run Code Online (Sandbox Code Playgroud)

等等

我不确定我在这里做错了什么,但我怀疑它与某处的服务器配置有关.我正在运行:Apache 2.2.11 PHP 5.2.8 ImageMagick 6.4.8-9 GhostScript 8.64

php pdf pdf-generation image ghostscript

12
推荐指数
2
解决办法
2万
查看次数

GHCi可以告诉我本地Haskell函数的类型吗?

是否有可能在ghci中查询为另一个函数内的函数推断的类型?

haskell types type-inference ghci

12
推荐指数
3
解决办法
679
查看次数

如何限制使用`malloc()`获取的内存而不限制堆栈?

我试图阻止学生代码在分配中运行,并拖延我的测试机器.我试过了

setrlimit(RLIMIT_DATA, r);
Run Code Online (Sandbox Code Playgroud)

哪个r是持有限制的结构.但不幸的是,虽然这个限制停止brk并且sbrk分配,但是C库只是故障转移mmap并保持正确分配.

我也试过了

setrlimit(RLIMIT_AS, r)
Run Code Online (Sandbox Code Playgroud)

并且这会使进程停止,但是这种补救措施太严重了 - 进程无法从ENOMEM错误中恢复,因为代码在遇到NULL返回的值时所进行的调用没有堆栈空间malloc().

我对二进制文件的控制有限,所以如果可以用系统调用,我宁愿这样做.但我需要一些方法来限制分配,而不会破坏流程的恢复能力.有没有人有建议?

更新:我找到了一个名为failmalloc的东西,但它不是很复杂,虽然我可以导致它失败,但我总是遇到gdb无法诊断的段错误.

进一步更新:我发现setrlimit(RLIMIT_AS, r) 似乎做我想要的工作,至少在被不相关的模块中发生的故障之后引起了某些情况下,该段错误.除非有人想出一些有趣的东西(或保留问题的理由),否则我可能会删除这个问题.

c malloc setrlimit

12
推荐指数
2
解决办法
1202
查看次数

如何从另一个Emacs Lisp函数调用具有前缀参数的交互式Emacs Lisp函数?

我想编写一个Emacs Lisp函数,flyspell-mode无论模式的当前状态如何,它都会打开.函数flyspell-mode-on已弃用.文档表明肯定的前缀参数将转向flyspell-mode,但遗憾的是运行

(flyspell-mode 1)
Run Code Online (Sandbox Code Playgroud)

导致错误消息:

Wrong number of arguments: (lambda (flyspell-mode 1)), 0
Run Code Online (Sandbox Code Playgroud)

如果我能弄清楚如何flyspell-mode前缀参数调用,我相信我可以解决这个问题.

我在Emacs Lisp手册中可以找到的最相关的部分是标题为"Interactive Call"的部分,它描述了这样的命令call-interactively.这显然不是我想要的.

(我试图解决的最终问题是创建一个模式挂钩,无论当前状态如何,都会打开模式.)

NB问题的标题emacs lisp调用函数与前缀参数以编程方式使它看起来是相关的,但该问题是询问如何创建交互式命令,并且问题最终通过使用来解决call-interactively.


编辑:这个问题没有实际意义; 我找到了原始问题的替代解决方案:

(add-hook 'text-mode-hook
          (function (lambda ()
                      (require 'flyspell)
                      (if flyspell-mode nil (flyspell-mode)))))
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道如何从另一个Emacs Lisp函数调用带有前缀参数的Emacs Lisp函数,没有任何交互.


更新:也许我应该问为什么我收到错误消息...

emacs elisp

12
推荐指数
2
解决办法
5518
查看次数

如何在shell脚本中分辨扫描的PDF?

我有大量的文档扫描成PDF格式,我希望编写一个shell脚本,将每个文档转换为DjVu格式.一些文件在200dpi扫描,一些在300dpi扫描,一些在600dpi扫描.由于DjVu是一种基于像素的格式,我想确保在目标DjVu文件中使用与扫描时相同的分辨率.

有谁知道我可以运行什么程序,或者我如何编写程序,以确定用于生成扫描PDF的分辨率?(像素数也可能有效,因为几乎所有文档都是8.5 x 11英寸.)


答复后的澄清:我知道布列塔尼强调的困难,我愿意承认这个问题总体上是不合适的,但我不是在询问一般的 PDF文件.我的特定文件来自扫描仪.它们每页包含一个扫描图像,每页包含相同的分辨率.如果我将PDF转换为PostScript,我可以手动搜索并轻松找到像素尺寸; 我可能会找到更多工作的图像尺寸.如果迫切需要我可以修改gs正在使用的字典堆栈; 很久以前,我为PostScript Level 1编写了一个解释器.

所有这些都是我想要避免的.


感谢收到的帮助,我在下面发布了一个答案:

  1. 使用PDF提取边界框identify,仅获取第一页的输出,并了解单位将是PostScript点,其中有72到1英寸.
  2. 使用提取第一页的图像pdfimages.
  3. 获取图像的高度和宽度.这个时间identify会给出像素数.
  4. 添加图像的总面积以获得平方的点数.
  5. 要获得分辨率,请以平方英寸计算边界框区域,将平方除以平方英寸,取平方根,并舍入到最接近的10的倍数.

脚本的完整答案如下.我在实弹射击中使用它并且效果很好.感谢Harlequin for pdfimages和Spiffeah关于每页多个图像的警报(这很少见,但我发现了一些).

pdf shell

10
推荐指数
3
解决办法
8853
查看次数

使用删除线将diff转换为markdown?

我想将diff(在Markdown文件上)的输出转换为Markdown with <strike><em>tags,这样我就可以看到从文档的新版本中删除或添加的内容.(这种处理对于法律文件来说非常普遍.)

希望输出的示例:

为什么我们学习编程语言 ,为了...

困难之一是diff的输出是面向行的,我希望看到单个词的差异.有没有人建议使用什么算法,或建立什么软件?

algorithm diff markdown

10
推荐指数
2
解决办法
1920
查看次数

如何获取"计算机语言基准游戏"(以前称为优秀语言枪战)的源代码?

我和一个学生正在建立一个新的口译员家庭,我们希望以现有的口译员为基准.我们很乐意下载包含计算机语言基准游戏中使用的所有源代码的tarball或zip文件.我已经从项目页面下载了zip文件,但它只包含一些在Debian lenny上不起作用的基础结构,以及仅包含2个基准测试的Python源代码.所有其他源代码都是MIA.

另一个问题是交互式下拉菜单似乎显示Java源,无论要求什么语言.不是说我想要通过无数的菜单; 我只想要所有的来源.

由于无法找到此源代码,我觉得自己是个完全白痴,但我不能.谁能告诉我如何下载语言基准游戏中使用的所有源代码


[NB我认为这个问题适用于SO,因为基准测试对于需要关注性能的程序员来说是一个至关重要的资源.

benchmarking programming-languages

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