小编Ale*_*nze的帖子

如何计算音频dB级别?

我想用电脑的麦克风计算房间的噪音水平.我将噪声记录为音频文件,但如何计算噪声dB水平?

我不知道怎么开始!

audio signal-processing

49
推荐指数
4
解决办法
8万
查看次数

当我们在C中取消引用NULL指针时,操作系统会发生什么?

假设有一个指针,我们用NULL初始化它.

int* ptr = NULL;
*ptr = 10;
Run Code Online (Sandbox Code Playgroud)

现在,程序将崩溃,因为ptr没有指向任何地址,我们正在为其分配一个值,这是一个无效的访问.那么,问题是,操作系统内部会发生什么?是否发生页面错误/分段错误?内核甚至会在页面表中搜索吗?或者崩溃发生在那之前?

我知道我不会在任何程序中做这样的事情,但这只是为了知道在这种情况下OS或编译器内部发生了什么.这不是一个重复的问题.

c null operating-system pointers

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

C:使用无符号操作数的一元减运算符行为

我似乎无法在C标准中找到完全定义带有无符号操作数的一元减运算符的行为的相关部分.

2003 C++标准(是的,C++,我用几行代表)在5.3.1c7中说: The negative of an unsigned quantity is computed by subtracting its value from 2^n, where n is the number of bits in the promoted operand.

然而,1999 C标准并未包含这样一个明确的陈述,也没有明确界定一元行为 - 在6.5.3.3c1,3和6.5c4中都没有.在后者中它说Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, ...) ... return values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types.),它排除了一元减去,事情似乎仍然含糊不清.

这个早期的问题是指K&R ANSI C一书中的A.7.4.5节The negative of an unsigned quantity …

c unary-operator

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

如何将三元运算符合并到优先爬升算法中?

我遵循"优先级爬坡"部分中给出的解释这个网页实现使用各种前缀的一元和二元中缀运算符的优先级爬坡算法算术评估.我还想包括三元运算符(即三元条件运算符?:).

网页上给出的算法使用以下语法:

E --> Exp(0) 
Exp(p) --> P {B Exp(q)} 
P --> U Exp(q) | "(" E ")" | v
B --> "+" | "-"  | "*" |"/" | "^" | "||" | "&&" | "="
U --> "-"
Run Code Online (Sandbox Code Playgroud)

如何将三元运算符合并到这个语法中?

c grammar parsing expression operator-precedence

20
推荐指数
2
解决办法
4109
查看次数

如何在运行时简化代码生成?

我正在研究一种在运行时生成汇编代码的软件.例如,这是一个非常简单的函数,它生成用于调用GetCurrentProcess函数的汇编代码(对于Win64 ABI):

void genGetCurrentProcess( char *codePtr, FARPROC addressForGetCurrentProcessFunction )
{
#ifdef _WIN64
  // mov rax, addressForGetCurrentProcessFunction
  *codePtr++ = 0x48
  *codePtr++ = 0xB8;
  *((FARPROC *)codePtr)++ = addressForGetCurrentProcessFunction;

  // call rax
  *codePtr++ = 0xFF;
  *codePtr++ = 0xD0;
#else
  // mov eax, addressForGetCurrentProcessfunction
  *codePtr++ = 0xB8;
  *((FARPROC *)codePtr)++ = addressForGetCurrentProcessFunction;

  // call eax
  *codePtr++ = 0xFF;
  *codePtr++ = 0xD0;
#endif
}
Run Code Online (Sandbox Code Playgroud)

通常我会使用内联汇编程序,但唉 - 这似乎不再适用于64位MSVC编译器.虽然我在这 - 我的代码应该与MSVC6一起使用到MSVC10和MinGW.还有更多的函数,比如genGetCurrentProcess,它们都发出汇编代码,其中许多都得到函数指针,可以作为参数传递.

令人烦恼的是,修改此代码很容易出错,我们必须手动处理ABI特定的事情(例如,在调用寄存器溢出函数之前保留32字节的堆栈空间).

所以我的问题是 - 我可以简化这段代码以便在运行时生成汇编程序代码吗?我的希望是我可以以某种方式直接编写汇编程序代码(可能在一个外部文件中然后用ml/ 汇编ml64)但是我不清楚如果汇编代码中的某些字节只在运行时知道它会如何工作(addressForGetcurrentProcessFunction例如,上例中的值).也许可以组装一些代码但是为代码中的某些位置分配"标签",以便我可以在运行时轻松修改代码然后将其复制到我的缓冲区中?

c++ windows x86 assembly visual-c++

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

RAND_MAX宏:签名还是未签名?

我已经查看了C标准(从1999年开始)并且它只说RAND_MAX至少应该是32767但是没有说明这个宏是否应该扩展为signed或unsigned int.Single UNIX Specification(链接1,链接2)和Linux man(链接)不会增加任何清晰度.

人们会认为RAND_MAX应该是一个,signed int因为这是rand()回报.

但是,我发现有些编译器将它定义为无符号:

  • 古老的Turbo C++ 1.01:#define RAND_MAX 0x7FFFU
  • 不那么古老的C++ Builder 5.5:#define RAND_MAX 0x7FFFU
  • 仍然活着的Open Watcom C/C++ 1.9:#define RAND_MAX 32767U
  • DJGPP(用于DOS的gcc 3.3.4):#define RAND_MAX 2147483647
  • MinGW(适用于Windows的gcc 4.6.2):#undefine RAND_MAX 0x7FFF
  • MS Visual Studio 2010(链接):RAND_MAX定义为值0x7fff
  • Tiny C编译器0.9.25:#define RAND_MAX 0x7FFF
  • lcc-win32 3.8:#define RAND_MAX 0x7fff
  • Pelles C 6.50:#define RAND_MAX 0x3fffffff OR #define RAND_MAX 0x7fff
  • Digital Mars C/C++ 8.52:#define RAND_MAX 32767

由于签署了未签名的促销活动,这使得看似无害的代码如下所述变得不便携并且爆炸:

cos(w * t) …
Run Code Online (Sandbox Code Playgroud)

c

14
推荐指数
2
解决办法
3805
查看次数

asm("暂停")做什么以及为什么要使用它

我在其他人的代码中看到了asm("暂停"),我想知道它是做什么的.代码由Linux上的g ++编译.

这行是在另一个线程中的循环中,如果发生更新,它会不断轮询.我怀疑它会让程序在再次轮询之前暂停一下,但我想知道(1)我的猜测是否正确(2)为什么有必要暂停?我们运行代码的机器有很多处理器,我的线程完全只是继续轮询它.

linux x86 assembly

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

C++ 03中最接近浮点值的整数

对于某些整数类型,即使浮点值远远超出整数的可表示范围,如何找到最接近某个浮点类型值的值.

或者更确切地说:

我们F是一个浮点型(可能是float,doublelong double).让I是一个整数类型.

假设两个FI有有效的专业化std::numeric_limits<>.

给定可表示的值F,并且仅使用C++ 03,如何找到最接近的可表示值I

我追求的是一个纯粹,高效且线程安全的解决方案,除了C++ 03所保证的以外,它不会对平台做任何假设.

如果不存在这样的解决方案,是否可以使用C99/C++ 11的新功能找到一个?

lround()由于报告域错误的非平凡方式,使用C99似乎是有问题的.这些域错误是否可以以便携式和线程安全的方式捕获?

注意:我知道Boost可能通过其boost::numerics::converter<>模板提供解决方案,但由于其高复杂性和冗长性,我无法从中提取必需品,因此我无法检查他们的解决方案是否成功超出C++ 03的假设.

下面的天真方法失败了,因为I(f)当C++ 03的整数部分f不是可表示的值时,结果是未定义的I.

template<class I, class F> I closest_int(F f)
{
  return I(f);
}
Run Code Online (Sandbox Code Playgroud)

然后考虑以下方法:

template<class I, class F> I closest_int(F f)
{
  if (f < std::numeric_limits<I>::min()) return std::numeric_limits<I>::min();
  if (std::numeric_limits<I>::max() < f) return std::numeric_limits<I>::max();
  return I(f);
} …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point type-conversion integral c++03

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

在C中向后读取文本文件

在C中向后读取文件的最佳方法是什么?我知道一开始你可能会认为这没用,但大多数日志等都会在文件末尾附加最新的数据.我想从文件向后读取文本,将其缓冲为行 - 即

abc
def
ghi

应该读行ghi,def,abc.

到目前为止,我尝试过:

    #include <stdio.h>
    #include <stdlib.h>

    void read_file(FILE *fileptr)
    {
        char currentchar = '\0';
        int size = 0;

        while( currentchar != '\n' )
        {
            currentchar = fgetc(fileptr); printf("%c\n", currentchar);
            fseek(fileptr, -2, SEEK_CUR);
            if( currentchar == '\n') { fseek(fileptr, -2, SEEK_CUR); break; }
            else size++;

        }
        char buffer[size]; fread(buffer, 1, size, fileptr);
        printf("Length: %d chars\n", size);
        printf("Buffer: %s\n", buffer);


    }


    int main(int argc, char *argv[])
    {
        if( argc < …
Run Code Online (Sandbox Code Playgroud)

c text stream standard-library

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

如何使用整数进行浮点计算

我有一个连接到主处理器的协处理器.某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢.

现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值.然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围.所以我的问题是,正确做到这一点的最快方法是什么.

c embedded floating-point fixed-point

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