Programme en C

firk -  
zavenger Messages postés 817 Statut Membre -
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

  1. (Pabix) Messages postés 600 Statut Membre 81
     
    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 !
    0
  2. (Pabix) Messages postés 600 Statut Membre 81
     
    //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.
    0
    1. firk
       
      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 ?
      0
      1. (Pabix) Messages postés 600 Statut Membre 81 > firk
         
        non, 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')
        0
  3. kazouu Messages postés 466 Statut Membre 12
     
    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
    0
    1. (Pabix) Messages postés 600 Statut Membre 81
       
      kazou, status[5] est un pointeur, ça m’étonnerait qu’il veuille comparer des pointeurs… quoique pas sûr.
      0
  4. kazouu Messages postés 466 Statut Membre 12
     
    regarde la fin de mon post
    0
    1. (Pabix) Messages postés 600 Statut Membre 81
       
      en effet, j’avais pas vu ! Excuse-moi pour le dérangement
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kazouu Messages postés 466 Statut Membre 12
     
    tu ne déranges pas si tu as d'autre solution a apporter soit le bienvenu =)
    0
  7. kazouu Messages postés 466 Statut Membre 12
     
    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
    0
    1. firk
       
      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’
      0
      1. kazouu Messages postés 466 Statut Membre 12 > firk
         
        lis 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
        0
      2. kazouu Messages postés 466 Statut Membre 12 > kazouu Messages postés 466 Statut Membre
         
        si 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;
        }
        0
      3. (Pabix) Messages postés 600 Statut Membre 81 > firk
         
        firk, 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))
        0
  8. (Pabix) Messages postés 600 Statut Membre 81
     
    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.
    0
  9. kazouu Messages postés 466 Statut Membre 12
     
    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
    0
    1. firk
       
      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!!
      0
    2. (Pabix) Messages postés 600 Statut Membre 81 > firk
       
      dans 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;
      }
      0
    3. (Pabix) Messages postés 600 Statut Membre 81 > (Pabix) Messages postés 600 Statut Membre
       
      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
      0
    4. firk > (Pabix) Messages postés 600 Statut Membre
       
      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;
      }
      0
    5. kazouu Messages postés 466 Statut Membre 12 > firk
       
      mais 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
      0
  10. kazouu Messages postés 466 Statut Membre 12
     
    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");
    }
    0
    1. firk
       
      Excuse-moi, j'ai une question :

      le premier if correspond bien au cas où statut1==statut2?
      0
      1. kazouu Messages postés 466 Statut Membre 12 > firk
         
        ce if la

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

        correspond au cas ou statut 1=statu2 et ou statu2= status[5]
        0
      2. firk > kazouu Messages postés 466 Statut Membre
         
        quand tu dis statut1=statut2 : en français, c'est bien statut1 et statut2 sont identiques, n'est-ce pas, kazouu?
        0
      3. kazouu Messages postés 466 Statut Membre 12 > firk
         
        oui 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 */
        0
  11. zavenger Messages postés 817 Statut Membre 161
     
    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 ...
    0
    1. firk
       
      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.
      0
  12. kazouu Messages postés 466 Statut Membre 12
     
    oui après ca c'est l'algo nous on l'aide juste pour le codage ^^
    0
    1. zavenger Messages postés 817 Statut Membre 161
       
      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
      ...
      0
      1. firk > zavenger Messages postés 817 Statut Membre
         
        oui,

        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).
        0
      2. zavenger Messages postés 817 Statut Membre 161 > firk
         
        donc tu crois pouvoir repenser ton algo?
        0