несовместимые типы между указателем на структуру и членом массива данных - PullRequest
2 голосов
/ 12 июля 2011

Я новичок в C и получаю сообщение об ошибке при компиляции следующего:

typedef struct myStructType {
    uint8_t myArray[6];
    uint8_t x;
}myStruct;

myStruct *pmyStruct;

(*pmyStruct).myArray={1,2,3,4,5,6};   //getting error here
(*pmystruct).x=3;

Ошибка следующая: несовместимые типы при назначении типу type uint8_t [6] ’из типа‘ uint8_t * ’

Ответы [ 5 ]

2 голосов
/ 12 июля 2011

Поскольку вы используете C99 (скажем, uint8_t и // comment), вы можете попробовать составные литералы

#include <inttypes.h>
#include <stdlib.h>

struct myStructType {
  uint8_t myArray[6];
  uint8_t x;
};

int main(void) {
  struct myStructType *pmyStruct;
  pmyStruct = malloc(sizeof *pmyStruct);
  if (pmyStruct) {
    *pmyStruct = (struct myStructType){{1, 2, 3, 4, 5, 6}, 3}; // <== THIS
    free(pmyStruct);
  }
  return 0;
}
2 голосов
/ 12 июля 2011

Здесь довольно много вопросов.

Прежде всего, убедитесь, что в вашем файле #include <stdint.h>, потому что на некоторых платформах возникнет проблема с uint8_t.

Во-вторых, когда вы создаете указатель структуры, вы должны выделить место для этой структуры. Это можно сделать с помощью следующего кода:

myStruct *pmyStruct = malloc(sizeof(struct myStructType));

Как уже упоминалось, вы можете использовать {1,2,3...} только при инициализации массива. Итак, чтобы добавить элементы в массив, вам нужно:

for (int i = 0; i < 6; i++)
    pmyStruct->myArray[i] = i+1;

Когда у вас есть структурный указатель, вы получаете доступ к его элементам с операндом ->. Итак, ваша последняя строка будет:

pmyStruct->x=3;

и, наконец, вам нужен основной метод. Собираем все вместе:

#include <stdlib.h>
#include <stdint.h>

typedef struct myStructType {
    uint8_t myArray[6];
    uint8_t x;
}myStruct;

int main()
{
    myStruct *pmyStruct = malloc(sizeof (struct myStructType));

    for (int i = 0; i < 6; i++)
        pmyStruct->myArray[i] = i+1;

    pmyStruct->x=3;

return 0;
}

Как только вы закончите со всем, обязательно освободите выделенное место с помощью free(pmyStruct); И обратите внимание на заглавные буквы! pmystruct НЕ совпадает с pmyStruct.

Удачи.

1 голос
/ 12 июля 2011

(*pmyStruct).myArray={1,2,3,4,5,6};

Вы можете только инициализировать массив таким образом.Используйте это так, как это после того, как оно объявлено, приведет к ошибке.

Ваш вопрос похож на это сообщение .

0 голосов
/ 12 июля 2011

Если вы хотите, чтобы сначала все было просто, и пока не хотите иметь дело с malloc и free, вы также можете сначала создать struct-object, затем заполнить его данными, а затем установитьуказатель на него:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct myStruct {
    uint8_t myArray[6];
    uint8_t x;
} myStruct_t;

int main()
{
   //create obj
   myStruct_t myObj;

   //fill it with data
   myObj.myArray[0] = 1;
   myObj.myArray[1] = 2;
   myObj.myArray[2] = 3;
   myObj.myArray[3] = 4;
   myObj.myArray[4] = 5;
   myObj.myArray[5] = 6;

   myObj.x = 3;

   //set a pointer to it
   myStruct_t *pObj = &myObj;

   return 0;
}
0 голосов
/ 12 июля 2011

Массив может быть инициализирован при объявлении, поэтому вы можете иметь:

int myarr[] = {1,2,3,4,5,6};

но вы не можете сделать это, так как он является членом вашей структуры.

Для ваших целей здесь просто инициализируйте его с помощью цикла

 int i;
 for (i = 1;i<7;++i)
    pmyStruct->myArray = i;

(отмечая, что (*pmyStruct).myArray может использовать обозначение стрелки pmyStruct->myArray)

Для более общих наборов чисел memcpy() может использоваться вместо цикла for

(как отмечали два других автора, вы должны выделить место для своей структуры, прежде чем делать что-либо из этого, и освободить это пространство, когда закончите)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...