2017-08-08 48 views
1

我試圖編譯下面的代碼,而我在讀取void assert (n%64==0 && l%64 == 0);行獲得兩個錯誤。一個錯誤表示「未知類型名稱n」,另一個表示「預期」)'「。這些都對我沒有意義,因爲沒有未關閉的開放圓括號,我在上面用行const unsigned n = 2048;定義'n'。「未知類型名稱N」的錯誤,即便N定義爲恆

我要指出,這個代碼來自2013年紙由丹妮拉Frauchiger,雷納託·倫納,和馬提亞特洛耶;可在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,所以我道歉,如果這是一個愚蠢的問題,但我一直無法從現有的答案回答。

+1

有時一個函數的結果鑄有作廢' (void)'(注意括號),要麼明確忽略e返回值或(可能更常見)使代碼風格工具的警告無效。但'assert'不具有返回值,所以我認爲這種情況只是一個錯誤。 –

+1

有問題的'void'不在PDF的第20頁的原始代碼示例中。以防萬一,你可能想檢查你的代碼是否有其他錯別字。 –

回答

2

void assert (n%64==0 && l%64 == 0);是試圖聲明函數alled斷言,但它是在錯誤的地方。只是刪除void,現在你調用「調試功能」 assert檢查nl滿足他們所需的限制。

void extract (uint64_t * y , uint64_t const * m, uint64_t const * x) 
{ 
    assert (n%64==0 && l%64 == 0); 
    ... 
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); 
+0

我認爲顯示的功能所需要的只是標題是''的斷言和''爲'uint64_t'類型。 –

+0

@kevin,是的,你是對的。 – Ihdina

+0

人仍下落不明'' ......雖然,想起來了,頭會造成從那些bbernicker完全不同的錯誤消息的報告。他或她可能只是沒有在M-almost_C-VE中包含'#include'語句。 –