2
votes

Types incompatibles lors de l'affectation au type 'char * [length]' à partir du type 'char *' (matrice + structure)

Je fais mes devoirs. Nous devons créer une matrice avec un nouveau type de structure.

#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
}

Quand j'essaye de la compiler, cela montre des erreurs

[Erreur] types incompatibles lors de l'attribution du type 'char * [10]' à partir du type'char * '

Comment y remédier?

c

6 commentaires

Vous ne pouvez pas attribuer comme ça. Utilisez strcpy .


De plus, votre déclaration devrait probablement être String Name; sinon vous avez un tableau de pointeurs et non un tableau de caractères.


@Tiara dans ma réponse vous avez 3 façons de le "réparer"


Ne cachez jamais les pointeurs derrière un typedef. Et ne prenez jamais la classe CS50 ...


@JohnnyMopp: String Name; signifie que Name est un pointeur vers char , un char * < / code> et " pas un tableau de caractères ".


@JohnnyMopp j'ai écrit String Name; et cela résout mon problème. Je vous remercie


3 Réponses :


-2
votes

Vous ne pouvez pas le faire de cette façon car votre NAME et votre ID sont des tables de pointeurs vers le caractère

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
}

ou

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
}

ou

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
}


0 commentaires

3
votes

Je pense que votre typedef ne vous aide pas à comprendre le problème.

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

Ici, vous avez écrit String Name [10] qui est l'équivalent de char * Nom [10] qui est un tableau de pointeur sur char.

typedef char* String;
String Name[10];

Ici, vous assignez la valeur Charles (qui peut être compris comme un caractère *) à une variable de type char * []

De plus si vous souhaitez attribuer une valeur de char * (en supposant que vous avez résolu le premier problème), vous pouvez utiliser strcpy ou strdup par exemple, (si vous utilisez strcpy n'oubliez pas de malloc )

J'espère que vous comprenez


1 commentaires

Oui, mais strcpy ne résoudra pas non plus ce problème particulier. De son côté, bien que strdup puisse convenir ici, il ne produit pas de résultat plus assignable à user [0] [0] .Name qu’une chaîne littéral.



0
votes

Comme @KillianG. déjà répondu, il semble que vous ayez peut-être brouillé le problème en définissant et en utilisant le type String . En général, il a tendance à être plus nuisible qu'utile de définir des types qui masquent la nature du pointeur, comme celui-là.

Je pense que le problème le plus profond ici est que vous avez défini votre structure de données différemment de ce que vous vouliez faire. Étant donné le type

data user[3][3];

// This:
strcpy(user[0][0], "Charles");

Vous pourriez écrire un code comme celui-ci ...

  char Name[10];

... mais votre structure n'est pas analogue:

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

Vous avez défini le membre Name comme étant un tableau de String s , donc dix pointeurs, alors que cela semble probable que vous voulez plutôt un tableau de char , adapté pour contenir une chaîne C:

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

Alternativement, peut-être que vous voulez Name code > pour être une seule chaîne, auquel cas vous devez la déclarer de cette façon:

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

Il n'y a pas besoin ni possibilité de définir une longueur de chaîne maximale dans ce dernier cas, car une telle chose n'est pas un attribut d'un char * ; la longueur d'une chaîne C est une fonction des données de caractères, pas du tableau les contenant.

Supposons que vous choisissiez la première alternative,

String a_name = "Alice";

Maintenant, vous devez gérer le fait que C ne fournit pas d'opérateur pour la copie d'un tableau entier. En particulier, l'opérande de gauche d'un opérateur = ne peut pas être un tableau entier. Au lieu de cela, vous pouvez remplir des tableaux élément par élément, ou via diverses fonctions qui ont cet effet ( memcpy , memmove ). Il existe une sous-famille de ces fonctions spécifiques à la copie de données de chaîne: strcpy , strncpy , etc. .. Étant donné que la chaîne String ! ) "Charles" est connu pour ne nécessiter que 8 caractères, y compris son terminateur, la manière idiomatique de copier ces données dans des données existantes Le membre Name de l'objet serait via strcpy():

typedef char* String;


0 commentaires