[C]- Problème sur les chaîne de caractère

Résolu
Panda jack Messages postés 54 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'éssaye de faire ceci :
int fight(int *att, int *deff){
    int retour=27, jetAtt, jetDeff, diff;
    float inter;
    char nomDeff[20]={0}, nomAtt[20]={0};
    
    nomDeff=deff[0];
    nomAtt=att[0];


concrètement att[0] (tout comme deff[0]) contiens un pointeur vers une chaine de caractère. Il me semblait donc logic de pouvoir le récupérer mais j'obtiens cette erreur :
combat.c:32: error: incompatible types in assignment
Merci d'avance aux idées constructive.
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,
int fight(int *att, int *deff){
    int retour=27, jetAtt, jetDeff, diff;
    float inter;
    char nomDeff[20]={0}, nomAtt[20]={0};
    
    nomDeff=deff[0];
    nomAtt=att[0];


Tu ne peux pas faire ça.
nomDeff est un tableau, tu ne peux donc pas modifier son adresse. Si tu veux modifier, il faut utiliser des pointeurs (et non des tableaux qui ne sont pas des lvalues).
De plus, attention deff[0] est un int et non un pointeur sur un int. Il faudrait utiliser un tableau de pointeur. Sinon cela ne sera pas portable (problème de l'endianness).
1
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Bonjour,
Je ne sais pas si c'est une bonne idée d'utiliser un type différent pour sauvegarder des adresses d'un autre type, normalement les adresses on la même taille d'après ce que j'ai compris : si cpu 32bits alors adresse est de longueur 32bits, mais il faut être sûr que le type qui les contient fasse bien 32bits, ici c'est le int, et en unsigned je pense que ce soit plus correct.
N'ai pas approfondi plus la question mais c'est faisable cependant je vous conseil d'utiliser des structures car c'est je pense pas portable de coder ainsi.
un test qui reprend ce que vous voulez faire :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void plop(unsigned int *test)
  {
    char *recup;/* un pointeur de char qui recup l'addr */
    recup=(char*)test[4];/* recup l'addr qui est à l'emplacement 4 */
    printf("%s\n",recup);/* affiche la chaine */
  }

int main(void)
  {
    unsigned int ti[20];
    char *str;
    str=malloc(sizeof(char)*20);
    strcpy(str,"hello world\0");/* place un truc dans str */
    ti[4]=(unsigned int)str;/* addr de str a l'emplacement 4 du tab ti */
    plop(ti);/* envoie le tab ti dans la fonc plop */
    free(str);
    return 0;
  }
0