2014-09-11 116 views
-1

我有兩個數組:C++比較兩個多維數組

unsigned char channeltab1[7][12]; //array which I receive from socket(Array is the same as below) 
unsigned char equal_channeltab1[7][12] //arrays which I wants to compare with channeltab1 
{ 
    {0x10, 0x0f, 0x02, 0x02, 0x01, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x02, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x03, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x04, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x05, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x06, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
    {0x10, 0x0f, 0x02, 0x02, 0x07, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef}, 
}; 

我想比較這陣,但只有函數strcmp工作,一維數組。 我嘗試使用STRNCMP:

for(int x = 0; x<7; x++) 
{ 
    for(int i =1; x<12;i++) 
    { 
     if (strncmp (reinterpret_cast<const char*>(channeltab1[x][i]),reinterpret_cast<const char*>(equal_channeltab1[x][i]),2) == 0) 
     { 
      /*...*/ 
     } 
     else 
     { 
      /*...*/ 
     } 
    } 

} 

但是,當應用程序運行這個指令說: 內存故障

如果我使用:

for(int x = 0; x<7; x++) 
{ 
    if (strncmp (reinterpret_cast<const char*>(channeltab1[x]),reinterpret_cast<const char*>(equal_channeltab1[x]),2) == 0) 
    { 
     /*..*/ 
    } 
    else 
    { 
     /*..*/ 
    } 
} 

他們不是爲程序相同。

我該怎麼辦?

+1

'strncmp'用於字符串。字符串以'\ 0x0'結尾,你在你的數組中。 – crashmstr 2014-09-11 12:25:22

+2

使用'std :: array'可以直接執行'channeltab1 == equal_channeltab1'。 – Jarod42 2014-09-11 12:27:36

+0

ohh,thx我忘了這個,但我可以使用哪個功能? – DarthBoa 2014-09-11 12:29:22

回答

1

「STRNCMP」用於標準的「C」字符串comparsion(或ASCII的)不是數據,因爲它是在你的情況(數據和數組都是一樣的在「C++」語言中)。所以你應該使用'memcpy'來代替。所以,你的代碼將是這個樣子:

for(int x = 0; x<7; x++) 
{ 
     if (memcmp((void*)channeltab1[x],(void*)equal_channeltab1[x], 12 * sizeof(unsigned char)) == 0) 
     { 
      /*equal*/ 
     } 
     else 
     { 
      /*not equal*/ 
     } 
} 
+2

你的意思是memcmp不是memcpy – drescherjm 2014-09-11 12:47:24

+0

對不起 - 只是修復它。 – 2014-09-11 12:50:55

2

以下可能會有所幫助:

bool is_equal(const unsigned char (&lhs)[7][12], const unsigned char (&rhs)[7][12]) 
{ 
    for (int i = 0; i != 7; ++i) { 
     if (memcmp(lhs[i], rhs[i], 12) != 0) { 
      return false; 
     } 
    } 
    return true; 
} 

甚至(感謝飯能活頁夾)

bool is_equal(const unsigned char (&lhs)[7][12], const unsigned char (&rhs)[7][12]) 
{ 
    return memcmp(lhs, rhs, sizeof(lhs)) != 0; 
} 
+0

爲什麼'memcmp'不是整個數組? 'memcmp(lhs,rhs,sizeof(* lhs))'? – JimmyB 2014-09-11 12:39:01

+0

我相信因爲'lsh'和'rhs'指向指向無符號字符數組的第一個元素的指針數組的第一個元素。 – 2014-09-11 12:41:20

+0

@HannoBinder:好點。 – Jarod42 2014-09-11 12:44:18

0

使用std::Array

std::array<unsigned char, 7*12> channeltab1; 
std::array<unsigned char, 7*12> equal_channeltab1 = { 
    0x10, 0x0f, 0x02, 0x02, 0x01, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x02, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x03, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x04, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x05, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x06, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef, 
    0x10, 0x0f, 0x02, 0x02, 0x07, 0x00, 0x00, 0x06, 0x10, 0x0e, 0xff, 0xef 
}; 

和比較,現在你可以這樣做:

if (channeltab1 == equal_channeltab1){ 
    //do stuff 
} 

音符,一個array[x*y]相同的array[x][y]

2

您可以簡單地使用memcmp

(sizeof(channeltab1) == sizeof(equal_channeltab1) 
&& (memcmp(channeltab1, equal_channeltab1, sizeof(equal_channeltab1)) == 0) 

注意,你必須確保他們的大小是相等的。

2

我建議你實現一個新的比較函數,而不是試圖使用這些C函數。您可以從像這樣開始:

bool checkEquals(unsigned char** a, unsigned char** b, size_t outterSize, size_t innerSize) 
{ 
    for (size_t i = 0; i < outterSize; ++i) 
    { 
     for (size_t j = 0; j < innerSize; ++j) 
     { 
      if (a[i][j] != b[i][j]) 
      { 
       return false; 
      } 
     } 
    } 
    return true; 
} 
0

多維數組連續內存存儲所以實際上memcmp應該工作,memcmp避免了中投的失誤。

memcmp(channeltab1, equal_channeltab1, sizeof(channeltab1)) 

編輯:strncmp不起作用,因爲值中可能有零。

+0

'strncmp'確實不**工作。 – leemes 2014-09-11 13:17:03