Serial.println для указателей на байтовый тип данных ведет себя неожиданно

byte subkeys[16][48/8];

for (size_t address = 0; address < 16*6; address++)
    Serial.println( (byte) *(subkeys + address) ); 

Почему компилятор не справится с этим? Это говорит мне

  

cast from 'byte * {aka unsigned char *}' to 'byte {aka unsigned char}' теряет точность [-fpermissive]

Если я опускаю часть (byte), она сообщает мне

  

вызов перегруженного 'println (byte [6])' является неоднозначным

Я понятия не имею, что происходит.

2 голоса | спросил SlowerPhoton 10 FebruaryEurope/MoscowbWed, 10 Feb 2016 11:23:58 +0300000000amWed, 10 Feb 2016 11:23:58 +030016 2016, 11:23:58

1 ответ


3

A byte является маленьким, чтобы сохранить значение указателя. Вместо того, чтобы байт, вы должны указать uintptr_t, который гарантированно будет большим достаточно. На устройстве на базе AVR, таком как Uno, это то же самое, что и uint16_t или unsigned int, но uintptr_t является более общим.

Изменить . Из вашего комментария кажется, что вы хотите распечатать содержимое массива вместо адресов строк. Очевидным способом является цикл с двумя индексами:

 for (size_t i = 0; i < 16; i++) for (size_t j = 0; j < 6; j++)
    Serial.println(subkeys[i][j]);

Если вы действительно хотите использовать subkeys как 1D-массив, затем переведите его на byte *, который является типом, который 1D-массив естественным образом распадается на:

 for (size_t address = 0; address < 16*6; address++)
    Serial.println(((byte *) subkeys)[address]);
ответил Edgar Bonet 10 FebruaryEurope/MoscowbWed, 10 Feb 2016 11:32:21 +0300000000amWed, 10 Feb 2016 11:32:21 +030016 2016, 11:32:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132