2017-07-01 55 views
0

我將使用一個Arduino發揮旋律,被分割成存儲在陣列稱爲筆記在Arduino的二維數組不同行大小

這11件的代碼:

String notes[0][]={"do", "re", "mi", "fa"}; 
String notes[1][]={"so", "rest", "mi", "do", "rest", "so", "rest", "fa", "re", "rest", 
        "fa", "rest", "re", "ti", "rest", "fa", "rest", "mi", "do", "rest"}; 
String notes[2][]={"rest", "si,", "do", "fa", "mi", "so", "do", "rest", "mi" 
        "fa", "mi", "fa", "mi", "fa", "mi", "do", "re"}; 
String notes[3][]={"la,", "la", "so", "fa", "mi", "fa", "so", "do", "do", 
       "rest", "mi", "fa", "mi", "do", "fa", "mi", "do", "la", "so", "rest"}; 
String notes[4][]={"rest", "so,", "so,", "fa", "mi", "re", "mi", "do"}; 
String notes[5][]={"la", "ti", "so", "fa", "so", "fa", 
        "fa", "mi", "re", "mi", "re", "do", "ti,", "do", "ti,", "la,", "so,"}; 
String notes[6][]={"rest", "do", "ti,", "do", "so,", "rest"}; 
String notes[7][]={"do", "ti,", "do", "mi", "rest"}; 
String notes[8][]={"fa", "mi", "re", "do", "fa", "mi", "re", "do", "do", "re", "re", "do`", "re`"}; 
String notes[9][]={"rest", "do", "ti,", "do", "so", "fa", "fa", "fa", "fa", "fa", "mi", "re", "mi", 
        "rest", "re", "mi", "fa", "mi", "mi", "mi", "re", "do", "mi", "rest"}; 
String notes[10][]={"la,", "ti,", "do", "re", "la,", "la,", "ti,", "do", "re", "do", "so"}; 

當我試圖編譯它,它會返回一個錯誤消息說,

申報的「註釋」多維數組必須有 所有尺寸範圍除了第

因此,如果我想保持數組中的內容不變,該怎麼辦?

+0

數組的每一行必須具有相同的大小。你可以用大括號括住所有的小數組來聲明整個數組,例如'String notes [] [] = {{..},{..},{..}}'。 – Grifplex

+0

@Grifplex否,必須指定最後一個維度 –

+0

@MM如果我將最後一個維度的大小定義爲例如10,如果一行只有5個項目,那麼如果將最後一個維度的大小定義爲行? –

回答

0

「拉拉啦」對我來說聽起來像是我在學校學習40(40)年前的事情。我問谷歌,發現Solmization

因此,我的第一個結論:我們在學校學到的一切都會在一天之內(遲早)得到回報。

當我讀到一些關於(浪費)存儲(行間)的擔憂時,我想如何使它更緊湊一點。 (使用一些聰明的壓縮技術會變得更加緊湊,但這超出了我想要在這裏展示的內容。)

由於存在一組有限的音節並且沒有太多不同的值,我打算將它們存儲爲字節。由於字節可以表示爲字符,字節序列可以簡單地定義爲常量C字符串。常量C字符串免費提供一個結束標記(0終止符)。即使它們具有不同的長度(因爲數組實際上只存儲指向字符串的指針),也可以聲明/初始化常量C字符串的數組。最後但並非最不重要的一點,我利用了多個雙引號序列作爲一個字符串常量連接的事實(如果僅用空格分隔)。

此外,我做了一些「宏魔法」來簡化代碼的寫作。這不是很優雅,但在「日常使用」中非常方便。 (「設計目的」是爲了使源代碼對錯別字風頭正勁的notes的定義以及保持它「可讀性」。)

我的樣品solmization.cc

#include <cassert> 
#include <cstring> 
#include <iostream> 

#define C_REST '0' 
#define C_DO '1' 
#define C_RE '2' 
#define C_MI '3' 
#define C_FA '4' 
#define C_SOL '5' 
#define C_LA '6' 
#define C_TI '7' 
#define C_DI 'a' 
#define C_RI 'b' 
#define C_FI 'c' 
#define C_SI 'd' 
#define C_LI 'e' 

#define REST "0" 
#define DO "1" 
#define RE "2" 
#define MI "3" 
#define FA "4" 
#define SOL "5" 
#define LA "6" 
#define TI "7" 
#define DI "a" 
#define RI "b" 
#define FI "c" 
#define SI "d" 
#define LI "e" 

const char *notes[] = { 
    DO RE MI FA, 
    SOL REST MI DO REST SOL REST FA RE REST FA REST RE TI REST FA REST MI DO REST, 
    REST SI DO FA MI SOL DO REST MI FA MI FA MI FA MI DO RE, 
    LA LA SOL FA MI FA SOL DO DO REST MI FA MI DO FA MI DO LA SOL REST, 
    REST SOL SOL FA MI RE MI DO, 
    LA TI SOL FA SOL FA FA MI RE MI RE DO TI DO TI LA SOL, 
    REST DO TI DO SOL REST, 
    DO TI DO MI REST, 
    FA MI RE DO FA MI RE DO DO RE RE DO RE, 
    REST DO TI DO SOL FA FA FA FA FA MI RE MI REST RE MI FA MI MI MI RE DO MI REST, 
    LA TI DO RE LA LA TI DO RE DO SOL 
}; 

using namespace std; 

int main() 
{ 
    enum { n = sizeof notes/sizeof *notes }; 
    for (size_t i = 0; i < n; ++i) { 
    cout << "Line " << (i + 1) << ":" << endl; 
    const char *line = notes[i]; 
    for (size_t j = 0, m = strlen(line); j < m; ++j) { 
     switch (line[j]) { 
#define CASE(SYL) case C_##SYL: cout << ' ' << #SYL; break 
     CASE(REST); 
     CASE(DO); 
     CASE(RE); 
     CASE(MI); 
     CASE(FA); 
     CASE(SOL); 
     CASE(LA); 
     CASE(TI); 
     CASE(DI); 
     CASE(RI); 
     CASE(FI); 
     CASE(SI); 
     CASE(LI); 
#undef CASE 
     default: assert(false); // should be unreachable 
     } 
    } 
    cout << endl; 
    } 
    return 0; 
} 

測試和輸出:

$ g++ -std=c++11 -o solmization solmization.cc 

$ ./solmization  
Line 1: 
DO RE MI FA 
Line 2: 
SOL REST MI DO REST SOL REST FA RE REST FA REST RE TI REST FA REST MI DO REST 
Line 3: 
REST SI DO FA MI SOL DO REST MI FA MI FA MI FA MI DO RE 
Line 4: 
LA LA SOL FA MI FA SOL DO DO REST MI FA MI DO FA MI DO LA SOL REST 
Line 5: 
REST SOL SOL FA MI RE MI DO 
Line 6: 
LA TI SOL FA SOL FA FA MI RE MI RE DO TI DO TI LA SOL 
Line 7: 
REST DO TI DO SOL REST 
Line 8: 
DO TI DO MI REST 
Line 9: 
FA MI RE DO FA MI RE DO DO RE RE DO RE 
Line 10: 
REST DO TI DO SOL FA FA FA FA FA MI RE MI REST RE MI FA MI MI MI RE DO MI REST 
Line 11: 
LA TI DO RE LA LA TI DO RE DO SOL 

$ 

注:

  1. 我頂住了冷杉st渴望聲音輸出而不是打印輸出。

  2. 雖然我正在改造原始數據,我在字符串中實現了一些,`。我沒有考慮他們保持簡短的示例代碼。他們可能有我不知道的意思。我想,根據我的示例的想法,應該可以適當地擴展定義。

  3. 我不喜歡音節宏(對於字符常量以及字符串常量)的雙重定義,但我沒有得到更好的主意。雖然,我真的不記得像stringize字符常量存在,我一派,並在The C Preprocessor – 3.4 Stringizing發現(在GNU GCC在線文檔的一部分。):

有沒有辦法轉換宏變成一個字符常量。

相關問題