小编Pas*_*uoq的帖子

返回语句之前/期间的C分段错误

我在返回语句之前打印我正在返回的值,并告诉我的代码打印函数调用后立即返回的值.但是,在我的第一个print语句之后和第二个print语句之前,我得到了一个分段错误(也有趣的是,这总是在第三次调用函数时发生;从不是第一次或第二次,从不第四次或更晚).我尝试打印出我正在处理的所有数据,看看我的其余代码是否正在做一些它可能不应该做的事情,但到目前为止我的数据看起来很好.这是功能:

int findHydrogen(struct Amino* amino, int nPos, float* diff, int totRead) {

    struct Atom* atoms;
    int* bonds;
    int numBonds;
    int i;
    int retVal;
    int numAtoms;

    numAtoms = (*amino).numAtoms;

    atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms);
    atoms = (*amino).atoms;

    numBonds = atoms[nPos].numBonds;

    bonds = (int *) malloc(sizeof(int) * numBonds);
    bonds = atoms[nPos].bonds;

    for(i = 0; i < (*amino).numAtoms; i++)
        printf("ATOM\t\t%d  %s\t0001\t%f\t%f\t%f\n", i + 1, atoms[i].type, atoms[i].x, atoms[i].y, atoms[i].z);

    for(i = 0; i < numBonds; i++) 
        if(atoms[bonds[i] - totRead].type[0] == …
Run Code Online (Sandbox Code Playgroud)

c segmentation-fault

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

为什么freetype的渲染文本总会有一些噪音?

我正在编写一个使用freetype2作为文本渲染引擎的opengl程序.

使用它的LCD子像素渲染,我发现渲染结果中总是有一些噪声像素,为什么会发生这种情况?此外,虽然它的手册说LCD模式会产生宽度为3的倍数的缓冲区,我经常发现宽度为3n + 1或3n + 2,与之不一致face->glyph->bitmap->width.

在此输入图像描述

c opengl freetype

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

用于跟踪OCaml中游戏板的数据结构

我是OCaml的新手,我想要实现一个类似于四线的游戏.我需要的是一些保持游戏状态的数据结构.游戏板是一个4x4的正方形,共有16块瓷砖.我正在寻找OCaml中的表示,这将使得在整个列,行或对角线中检索(或执行某些操作)所有元素变得容易和快速.我将在这个游戏上进行极小极大搜索,这就是为什么速度很重要.

到目前为止,我已经考虑过一维列表.列表的问题在于难以弄清楚哪些元素属于每个行/列/对角线,然后使用List.map例如检索它们.

我想过要用Array.make 4 (Array.make 4 Empty);;.这对于行来说绝对是完美的.很容易得到它们并在其上进行模式匹配.但是在单个列和对角线上进行模式匹配是一件苦差事.

我想要做的是有一个功能,它采用游戏板并返回包含所有行/列/对角线的列表.我想做,例如,match (rows,columns,diagonals) with (Empty, Empty, Empty, Empty) -> something.

arrays ocaml

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

在OCaml中构建AST

我正在使用OCaml为Scheme的子集构建递归下降解析器.这是语法:

    S -> a|b|c|(T)
    T -> ST | Epsilon
Run Code Online (Sandbox Code Playgroud)

所以说我有:

   type expr = 
       Num of int | String of string | Tuple of expr * expr
Run Code Online (Sandbox Code Playgroud)

伪代码

这些函数必须返回expr类型来构建AST

parseS  lr =
   if head matches '(' then
     parseL lr
   else
     match tokens a, b, or c
Run Code Online (Sandbox Code Playgroud)

使用第一组S作为标记和'(':

parseL lr = 
   if head matches '(' or the tokens then
       Tuple (parseS lr, parseL lr)
  else
       match Epsilon
Run Code Online (Sandbox Code Playgroud)

我的问题是"我怎么回到Epsilon部分因为我不能回来()?".OCaml函数需要相同的返回类型,即使我为Epsilon部分留空,OCaml仍然采用单元类型.

grammar parsing ocaml

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

为什么OCaml使用子类型进行多态变体?

我刚刚读到了关于行多态性以及它如何用于可扩展记录和多态变体的内容.

但是,Ocaml使用子类型来处理多态变体.为什么?它比行多态更强大吗?

ocaml subtyping

6
推荐指数
2
解决办法
1847
查看次数

可影响double的最大小数位数

考虑形式为d1.d2d3d4d5 ... dnExxx的十进制表示形式,其中xxx是任意指数,d1和dn都是非零的.

是否已知最大n,使得存在十进制表示d1.d2d3d4d5 ... dnExxx,使得间隔(d1.d2d3d4d5 ... dnExxx,d1.d2d3d4d5 ...((dn)+1)Exxx)包含IEEE 754双?

n应至少为17.问题是17岁以上多少.

这个数字n与在十进制到双重转换中足够考虑的位数有关,例如strtod().我查看了David M. Gay实现的源代码,希望在那里找到答案.有一个暗示"40",但不清楚这是否是一个合理的数学结果或只是一个统计上安全的界限.此外,关于"截断"的注释使其听起来像0.50000000000000000000000000000000000000000000000000000001可以在向上舍入模式中转换为0.5.

Musl的实现似乎读取了大约125*9位数,这是很多.然后它切换到"粘性"模式:

if (c!='0') x[KMAX-4] |= 1;
Run Code Online (Sandbox Code Playgroud)

最后,当用"包含两个连续IEEE 754双打的中点"替换"包含IEEE 754双"时,答案如何变化?

floating-point ieee-754

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

FFT归一化

我知道这个问题被问到令人作呕,但不知何故我无法使其正常工作。我创建了一个具有单位幅度的 440 Hz 的单个正弦波。现在,在 FFT 之后,440 Hz 的 bin 具有明显的峰值,但该值不正确。我希望看到 0 dB,因为我正在处理单位幅度正弦波。相反,计算出的功率远高于 0 dB。我使用的公式很简单

for (int i = 0; i < N/2; i++) 
{  
    mag = sqrt((Real[i]*Real[i] + Img[i]*Img[i])/(N*0.54)); //0.54 correction for a Hamming Window

    Mag[i] = 10 * log(mag) ;      
}
Run Code Online (Sandbox Code Playgroud)

我可能应该指出时域中的总能量等于频域中的能量(Parseval 定理),所以我知道我的 FFT 程序很好。

任何帮助深表感谢。

signal-processing fft normalization

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

OCaml将标记函数作为参数/标记函数类型等价

假设函数g定义如下.

utop # let g ~y ~x = x + y ;;
val g : y:int -> x:int -> int = <fun>
utop # g ~x:1 ;;
- : y:int -> int = <fun>
utop # g ~y:2 ;;
- : x:int -> int = <fun>
utop # g ~x:1 ~y:2 ;;
- : int = 3
utop # g ~y:2 ~x:1 ;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

现在有另一个功能 foo

utop # let foobar (f: x:int -> y:int …
Run Code Online (Sandbox Code Playgroud)

ocaml type-theory functional-programming

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

当表示为binary64时,π和π/ 10如何看起来具有相同的相对误差?

假设您很快想要确定当以IEEE 754二进制64格式表示时π或π/ 10中哪一个具有最大相对误差.此外,您只有一个C编译器.

您可以编写下面的C程序,或者更简洁的版本:

#include <stdio.h>
#include <math.h>

volatile long double pil = 3.14159265358979323846L;
volatile double pi = 3.14159265358979323846;

volatile long double tpil = 0.314159265358979323846L;
volatile double tpi = 0.314159265358979323846;

int main() {

  volatile long double abs = pil - pi;

  printf("%La\n%La\n%La\n", pil, (long double)pi, abs);

  printf("pi:   abs err %La -> rel %La\n", abs, abs / pil);

  volatile long double abst = tpil - tpi;
  printf("pi/10: abs err %La -> rel %La\n", abst, abst / tpil);

}
Run Code Online (Sandbox Code Playgroud)

有趣的是,这个程序显示π和π/ 10的相对误差是相同的:

0xc.90fdaa22168c235p-2 …

floating-point

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

在批处理中杀死流程并报告成功

我有以下批处理文件,它终止iTunes程序,如果我连接我的iPod,它不会同步它.(我知道你可以在iTunes中设置它.)

@echo off
:kill
cls
taskkill /F /IM itunes.exe >nul
if %errorlevel%==1 {
echo iTunes not found.
} else {
echo iTunes is killed.
}
goto kill
Run Code Online (Sandbox Code Playgroud)

但是,>nul不响应命令; 所以它只给出了默认的命令文本.所以,是的,我想做的事:

如果找不到iTunes,如命令所示,则应显示

iTunes未找到

如果找到并终止,

iTunes被杀了

救命?错误级别不起作用,这似乎是nul不工作的错误.

windows cmd batch-file errorlevel

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