Несовместимые типы при назначении типу 'char * [length]' из типа 'char *' (матрица + структура) - PullRequest
1 голос
/ 26 апреля 2019

Я делаю свою домашнюю работу. Мы должны сделать матрицу с новым типом структуры.

#include<stdio.h>
typedef char* String;
typedef struct{
  String Name[10];
  String ID[6];
  float yo;
}data;

int main(){
  data user[3][3];
  // some code
  // wanna assign value
  user[0][0].Name="Charles";
  user[0][0].ID="123123";
  user[0][0].yo=20;
  // another code
}

Когда я пытаюсь его скомпилировать, отображаются ошибки

[Ошибка] несовместимых типов при назначении типу 'char * [10]' из типа 'char *'

Как это исправить?

Ответы [ 3 ]

3 голосов
/ 26 апреля 2019

Я думаю, что ваш typedef не помогает вам понять проблему.

typedef char* String;
String Name[10];

Здесь вы написали String Name[10] Что эквивалентно char *Name[10] и массиву указателей на char.

user[0][0].Name="Charles";

Здесь вы присваиваете значение Charles (которое может быть указано как символ *) переменной типа char *[]

Более того, если вы хотите присвоить значение char *(при условии, что вы решили первую проблему), вы можете использовать strcpy или strdup, например, (если вы используете strcpy, не забудьте malloc)

Надеюсь, вы понимаете

0 голосов
/ 26 апреля 2019

Как @KillianG. уже ответил, похоже, что вы, возможно, замутили проблему для себя, определив и использовав тип String. В общем, определение типов, маскирующих природу указателя, как правило, более вредно, чем полезно.

Я думаю, что самая глубокая проблема здесь в том, что вы определили свою структуру данных иначе, чем вы собирались сделать. Учитывая тип

typedef char* String;

Вы можете написать код, подобный этому ...

String a_name = "Alice";

... но ваша структура не аналогична:

typedef struct{
  String Name[10];
  String ID[6];
  float yo;
}data;

Вы определили элемент Name как массив из String s , то есть десять указателей, тогда как кажется вероятным, что вместо этого вам нужен массив char, подходящий для хранения одного Строка C:

typedef struct {
  char Name[10];
  char ID[6];
  float yo;
} data;

В качестве альтернативы, возможно, вы хотите, чтобы Name была единственной строкой, и в этом случае вы должны объявить ее следующим образом:

  String Name;
  // equivalent to: char *Name;

Нет необходимости или возможности устанавливать максимальную длину строки в последнем случае, потому что такая вещь не является атрибутом char *; длина строки C является функцией символьных данных, а не массива, содержащего их.

Предположим, вы идете с первой альтернативой,

  char Name[10];

Теперь вам нужно учитывать тот факт, что C не предоставляет оператора для копирования всего массива. В частности, левый операнд оператора = не может быть целым массивом. Вместо этого вы можете заполнять массивы поэлементно или с помощью различных функций, имеющих этот эффект (memcpy, memmove). Существует подсемейство таких функций, специфичных для копирования строковых данных: strcpy, strncpy, и т. Д. .. Учитывая, что строка ( не String! ) "Charles" известно, что требуется только 8 символов, включая его терминатор, идиоматический способ скопировать эти данные в существующий элемент Name объекта data будет через strcpy():

data user[3][3];

// This:
strcpy(user[0][0], "Charles");
0 голосов
/ 26 апреля 2019

Вы не можете сделать это таким образом, поскольку ваши NAME и ID являются таблицами указателей на символ

int main(){
  data user[3][3];
  // some code
  // wanna assign value
  user[0][0].Name[0]="Charles";
  user[0][0].ID[0]="123123";
  user[0][0].yo=20;
  // another code
}

или

typedef char* String;
typedef struct{
  String Name;
  String ID;
  float yo;
}data;

int main(){
  data user[3][3];
  // some code
  // wanna assign value
  user[0][0].Name="Charles";
  user[0][0].ID="123123";
  user[0][0].yo=20;
  // another code
}

или

typedef char* String;
typedef struct{
  char Name[10];
  char ID[7];
  float yo;
}data;

int main(){
  data user[3][3];
  // some code
  // wanna assign value
  strcpy(user[0][0].Name,"Charles");
  strcpy(user[0][0].ID,"123123");
  user[0][0].yo=20;
  // another code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...