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

Résolu/Fermé
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 - 20 juin 2011 à 14:47
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 juin 2011 à 00:34
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
22 juin 2011 à 00:34
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 vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
21 juin 2011 à 20:07
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