即使N被定义为常量,“未知类型名称N”也会出错

时间:2017-08-08 02:14:11

标签: c syntax-error

我正在尝试编译下面的代码,我在读取void assert (n%64==0 && l%64 == 0);的行上遇到两个错误。一个错误表示“未知类型名称'n'”,另一个错误表示“预期'''”。这些对我来说都没有意义,因为没有未打开的括号,我在上面用行const unsigned n = 2048;定义'n'。

我应该注意,这段代码来自Daniela Frauchiger,Renato Renner和Matthias Troyer的2013年论文;可以在https://arxiv.org/pdf/1311.4547.pdf找到。它是随机抽取器的一部分,用于硬件随机数生成器。代码不是我的,但我正在努力使其适应我正在进行的项目。

const unsigned n = 2048; // CHANGE to the number of input bits, must be multiple of 64
const unsigned l = 1792; // CHANGE to the number of output bits, must be multiple of 64

// the extraction function
// parameters:
//  y: an output array of l bits stored as l/64 64−bit integers
//  m: a random matrix of l∗n bits , stored in l∗n/64 64−bit integers
//  x: an input array of n bits stores as n/64 64−bit integers

void extract (uint64_t * y , uint64_t const * m, uint64_t const * x)
{
    void assert (n%64==0 && l%64 == 0);

    int ind=0;
    // perform a matrix−vector multiplication by looping over all rows
    // the outer loop over all words
    for (int i = 0; i < l/64; ++i) {
        y[i]=0;
        // the inner loop over all bits in the word
        for (unsigned j = 0; j < 64; ++j) {
            uint64_t parity = m[ind++] & x[0];
            // performs a vector multiplication using bit operations
            for (unsigned l = 1; l < n/64; ++l)
            parity ^= m[ind++] & x[l];
            // finally obtain the bit parity
            parity ^= parity >> 1;
            parity ^= parity >> 2;
            parity = (parity & 0x1111111111111111UL) * 0x1111111111111111UL;
            // and set the j−th output bit of the i−th output word
            y[i] |= ((parity >> 60) & 1) << j;
        }
    }
}

我对C很新,所以如果这是一个愚蠢的问题,我会道歉,但我无法从现有的答案中回答。

2 个答案:

答案 0 :(得分:2)

void assert (n%64==0 && l%64 == 0);试图声明一个函数alled assert,但是它位于错误的位置。只需删除void,现在您正在调用&#34;调试功能&#34; assert检查nl是否符合所需的约束条件。

void extract (uint64_t * y , uint64_t const * m, uint64_t const * x)
{
    assert (n%64==0 && l%64 == 0);
    ...

答案 1 :(得分:1)

在代码顶部添加关注标题:

#include <stdint.h>  // uint64_t
#include <assert.h>  // assert

更改

void assert (n%64==0 && l%64 == 0);

assert (n%6==0 && l%64 == 0);