Programme en C

Bonjour,

J'aimerais trouver d'où vient l'erreur dans mon programme; j'ai essayé toutes les possibilités qui me semblent plausibles, mais je ne parviens pas à la corriger.(elle y est plusieurs fois dans mon programme, mais c'est la même à chaque fois, via le message d'erreur invalid lvalue in assignment)

Par exemple :

char* (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités,Douze_mois_sans_incident_paiement"};

colocation(int R[],int L,char statut1,char statut2)
{ int i,h,k;

switch(statut1,statut2){

{ case(statut1=statut2 && statut2=status[5]): /* Cas 2 En place(les 2 premiers case) */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}

case(statut1=status[5] && statut2=!status[1]): /* Cas 1 En place avec n'importe qui */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}
Configuration: Linux Mandriva
Firefox 2.0.0.13

11 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Problème central : l'erreur invalid lvalue in assignment apparaît lors de la comparaison de chaînes pour des statuts en C et empêche l'exécution correcte du code. Plusieurs contributions proposent de remplacer le switch par des tests if et d'utiliser strcmp pour comparer des chaînes stockées dans status[], car status est un tableau de char*. Réponses évoquent aussi de faire attention à la comparaison des chaînes avec == et d'éviter d'aligner des pointeurs, en insistant sur la conversion et la comparaison via strcmp. En pratique, il est recommandé de convertir statut1 et statut2 en char* et d'utiliser des blocs conditionnels basés sur strcmp pour couvrir les différents cas, notamment pour deux locataires et potentiellement trois.

Bobot (l’IA à votre service)
  1. oui après ca c'est l'algo nous on l'aide juste pour le codage ^^
    1. mais c'est peut-etre justement l'algo qui fait que le codage est difficile. C'est pour cela que je demande si l'algo ne pourrait pas etre revu, car il a l'air d'avoir un algo du style

      si condiftion1 alors resultat1
      si condiftion2 alors resultat2
      si condiftion3 alors resultat1
      ...

      Alors qu'il faudrait peut etre avoir un algo

      on a resultat1 si condition1 et condition3
      on a resultat2 si condition2
      ...
    2. @zavengeroui,

      pour 2 locataires :

      si les 2 sont etudiant, alors pour tout revenu, on a "caution solidaire".
      si etudiant+CDD : si revenu (CDD)>=2*L, alors "caution solidaire".
      si revenu (CDD)<2*L, alors "impossible.

      il y a des situations où un statut domine tous les autres, 2 statuts qui sont dominés, etc...

      et ainsi de suite. le noeud de l'algorithme réside dans le fait de bien combiner le statut des 2 locataires.
      (je dois aussi faire pour 3 locataires, c'est plus complexe encore).
    3. @firkdonc tu crois pouvoir repenser ton algo?
  2. Bonjour,

    Je peux me tromper bien sur, mais je me demande si tu ne prends pas le probleme a l'envers. Ne serait il pas possible de calculer pour chaque cas final les conditions d'acceptation. Je n'ai bien sur pas les details, mais faire qque chose comme:

    AssuranceOK = condition1 ET condition2 ou conditin3
    ....

    ensuite

    faire le traitement de tous tes resultats

    Juste une idee comme cela ...
    1. Tu as bien l'idée en tête, mais il faut étudier les cas intermédiaires, et le refus de l'assurance.
      Ces 3 issues dépendent du revenu de l'agent i=1 puis 2, ainsi qu'au rapport R/L(L=loyer) s'il est<2, (>=2 && <=3) et si R/L>3.
  3. moi je te conseil

    (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­­,Douze_mois_sans_incident_paiement"};

    colocation(int R[],int L,char* statut1,char* statut2)
    { int i,h,k;

    if(strcmp(statut1,statut2) && strcmp(statut2,status[5]))
    printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n")

    else if(strcmp(statut1,status[5]) && !strcmp(statut2,status[1]))
    printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");
    }
    1. Excuse-moi, j'ai une question :

      le premier if correspond bien au cas où statut1==statut2?
    2. @firkce if la

      if(strcmp(statut1,statut2) && strcmp(statut2,status[5]))

      correspond au cas ou statut 1=statu2 et ou statu2= status[5]
    3. @kazouuquand tu dis statut1=statut2 : en français, c'est bien statut1 et statut2 sont identiques, n'est-ce pas, kazouu?
    4. @firkoui strcmp renvoi TRUE quand 2 chaine sont egal

      donc if(strcmp(chain1,chaine2)){ /* ici tu met les instruction qu'il faut excuté quand la chaine 1 est identique ( attention a la casse ) a la chaine2 */
  4. ouai et je ne vois pas la difference entre faire

    switch
    case
    case
    ...

    ou
    if
    else if
    else if
    ..

    mais bon a toi de voir
    1. C'est juste par souci d'élégance que je procède comme tel. Je dois réaliser les combinaisons de 2 agents : le cas où les 2 agents ont le même status, le cas où ils ont des statuts différents.
      C'est assez long, alors pour 3 agents, c'est encore pire!!
    2. @firkdans ce cas, si tu veux utiliser switch, il faut que tu fasses

      switch (statut1 == statut2) {

      case 0: // statuts différents

      break;

      default: // statuts identiques

      break;
      }
    3. @(Pabix)PS. sincèrement tu m’as l’air de ne pas connaître la syntaxe du C précisément, il faut absolument que tu lises un cours de C avant de continuer, car tu fais énormément d’erreurs !

      Je te conseillerais le cours en lien : http://sites.univ-provence.fr/wcpp/V2/index.htm
    4. @(Pabix)Si je fais qqch du style :

      switch(statut1==statut2){

      case(0):statut2=status[5]; /* Cas 1 En place avec n'importe qui */
      printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;

      default( );statut2==status[5]: /* Cas 2 En place(les 2 premiers case) */
      printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
      }
    5. @firkmais c'est affreux ^^
      arrête de vouloir faire un a tout prix un switch

      un switch a la base c'est pour tester les different resultat d'une expression
      donc si tu veux vraiment faire un switch faut que tu fasse

      switch(statut1==statut2){

      case(0): if(statut2=status[5]) /* Cas 1 En place avec n'importe qui */
      printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;

      mais c'est vraiment très très laid
  5. Bonjour, la structure de switch, c’est

    switch(EXPRESSION) {

    case VALEUR :
    […] break;
    etc.
    }

    statut1, statut2 est effectivement une expression, mais qui ne sert à rien, puisque l’opérateur virgule, en C, renvoie la deuxième valeur ;
    et ici, au lieu de faire des comparaisons avec ==, tu fais des affectations avec =, qui te renvoient automatiquement la valeur de droite… bref.
    1. non c'est

      strcmp(statut1,statut2) && strcmp(statut2=status[5])

      et je ne sais pas si tu a le droit de switch sur 2 variables
      1. j'ai essayé comme tu m'as proposé mais j'ai les erreurs lorsque j'insère ceci, kazouu :

        case(strcmp(statut1,statut2) && strcmp(statut2=status[5]) ):

        warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
        warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast
        warning: assignment makes integer from pointer without a cast
        warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
        error: too few arguments to function ‘strcmp’
      2. @firklis tout ce que l'on marque !

        et comme ton tableau status[] contien des char* il faut que statu1 et statu2 soit aussi des char*
        et a ce moment tu doit les comparé non pas avec un (==) mais avec un STRCMP
      3. @kazouusi je corrige ton ton code a vu d'oeil ca donne un truc du genre

        (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­,Douze_mois_sans_incident_paiement"};

        colocation(int R[],int L,char* statut1,char* statut2)
        { int i,h,k;

        switch(statut1,statut2){

        { case(strcmp(statut1,statut2) && strcmp(statut2,status[5])): /* Cas 2 En place(les 2 premiers case) */
        printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
        }

        case(strcmp(statut1,status[5]) && !strcmp(statut2,status[1])): /* Cas 1 En place avec n'importe qui */
        printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
        }
      4. @firkfirk, si statut1 et statut2 sont des entiers alors ça ne sert à rien de les comparer avec une chaîne de caractères, ni entre eux avec strcmp.

        D’autre part tu n’as pas compris à quoi sert switch, il faut ABSOLUMENT que tu utilises if pour faire ce que tu veux.

        if ((statut1 == statut2) && (statut2 == 5))
    2. tu ne déranges pas si tu as d'autre solution a apporter soit le bienvenu =)
      1. regarde la fin de mon post
        1. en effet, j’avais pas vu ! Excuse-moi pour le dérangement
      2. je vois pas l'interet de ton switch la

        fais plutot
        if(statut1==statut2 && statut2==status[5])
        printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");

        else if(statut1==status[5] && statut2=!status[1])
        printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");

        et comme ton tableau status[] contien des char* il faut que statu1 et statu2 soit aussi des char*
        et a ce moment tu doit les comparé non pas avec un (==) mais avec un STRCMP
        1. kazou, status[5] est un pointeur, ça m’étonnerait qu’il veuille comparer des pointeurs… quoique pas sûr.
      3. //char* (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­//,Douze_mois_sans_incident_paiement"};

        char * status [6] = {"CDI_hors_ess_ou_preavis_lic" , "CDD_CNE_ou_CDI_essai" , "Etudiant,TNS" , "Retraités­", "Douze_mois_sans_incident_paiement" } ;

        //colocation(int R[],int L,char statut1,char statut2)
        //{ int i,h,k;
        //Là, j’ai vraiment rien compris

        //switch(statut1,statut2){
        //
        //{ case(statut1=statut2 && statut2=status[5]): /* Cas 2 En place(les 2 premiers case) */
        //printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
        //}
        //case(statut1=status[5] && statut2=!status[1]): /* Cas 1 En place avec n'importe qui */
        //printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
        //}
        Ici, vous comparez des chaines de caractères, il faut que vous utilisiez strcmp.
        1. le premier case correspond au cas où les 2 personnes ont le même status, à savoir 12 mois...
          Je ne voudrais pas énumérer tous les if, c'est pourquoi j'ai introduis le switch suivi de case.
          si j'utilise strcmp, je dois faire tous les if.

          Est-ce que je peux utiliser strcmp dans les cases?

          P.S : c'est bien strcmp(statut1==statut2; statut2=status[5]) pour le premier case ?
        2. @firknon, tu es sous Linux, si tu veux connaître la syntaxe de strcmp, le mieux est de la chercher dans le manuel avant de demander… comme je suis bon prince :

          strcmp(char*, char*) renvoie 0, si les deux pointeurs pointent vers une chaîne de caractères identiques (jusqu’au caractère '\0')
      4. Euh, en effet, vous ne devez pas avoir beaucoup appris le C, mais un autre programme… parce qu’il y a beaucoup, beaucoup d’erreurs, je vais les détailler !