Как изменить член массива структуры в C - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь запрограммировать микроконтроллер для связи с внешней микросхемой флэш-памяти, которая использует SPI.Код операции (код операции), за которым следуют байты адреса, затем байты данных должны быть отправлены по порядку.Вместо того, чтобы определять эти байты каждый раз для разных команд, я хочу создать структуру, которая содержит этот конкретный порядок.Также я хочу изменить весь массив внутри структуры.

Я попытался создать структуру, которая имеет три члена, такие как код операции, адрес и данные.

void main (void)
{
//Defining Structure
struct Command_order {
    unsigned char opcode;
    unsigned char address[3];
    unsigned char data[5];
 };

 while(1)
 {
   struct Command_order temp = {0x02, {0x00,0x17,0x00} , {0x01,0x02,0x03,0x04,0x05}}; //Initialization of structure

   temp.address = {0x1F,0x03,0xC2}; //Trying to change only address 

 }
}

Однако это не будет работать, Я неправильно понимаю структуру или синтаксис.Я новичок в этой концепции.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Массивы не имеют оператора присваивания.Вы должны скопировать элементы одного массива в другой массив.

Для этого вы можете использовать, например, составной литерал и стандартную функцию memcpy, объявленную в заголовке <string.h>.

Здесьдемонстрационная программа

#include <stdio.h>
#include <string.h>

int main( void )
{
    struct Command_order 
    {
        unsigned char opcode;
        unsigned char address[3];
        unsigned char data[5];
    };    

    struct Command_order temp;

    memcpy( temp.address, ( unsigned char[] ) { 0x1F, 0x03, 0xC2 }, 3 * sizeof( unsigned char ) );
}    

Или вы можете переписать вызов memcpy следующим образом, если число инициализаторов равно количеству элементов в массиве

memcpy( temp.address, ( unsigned char[] ) { 0x1F, 0x03, 0xC2 }, sizeof( temp.address ) );
1 голос
/ 10 июля 2019

Вы не можете назначить массив в целом. Вам необходимо присвоить каждому элементу массива.

temp.address[0] = 0x1F;
temp.address[1] = 0x03;
temp.address[2] = 0xC2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...