IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème transcription d'une liste code R en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Problème transcription d'une liste code R en C
    Bonjour a tous,

    Je suis une grande débutante en programmation en C, c'est pourquoi je fais appel a vous!

    Je code beaucoup en R, mais les temps de calculs étant très long (boucle) je dois me mettre à faire du C.

    Je me retrouve face à un problème de "liste"
    Ma fonction doit aller chercher des éléments ("valeur") d'une liste donnée en entrée, voici la fonction R :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inoc <- function(liste, nom) {
       isc <- 0
       for (i in 1:length(liste[[length(liste)]]$feuilles)) {
            for (k in 1:7) {
                isc <- isc + nom$param$omega * liste[[length[[liste]]$feuilles[[i]]$compartiments[[k]]$valeur
                              }
                                                                      }
    isc
    }

    Voici le code C que j'ai commencé a écrire, mais... je sèche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include<stdlib.h>
    #include<math.h>
     
    void inocs.c(int *n, double *omega, double *valeur, double *isc)
    {
    	int i,k;
    	double isc=0.;
    	for (i=1;  i<*n; i++)
    		for(k=1; k=7; k++)
    			isc+=(omega)*(
    }

    Quelqu'un aurait-il des idées?

    Je vous remercie beaucoup,
    Nane

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut


    Déjà, il va falloir définir les structures de données appropriées, avant de commencer à écrire la moindre fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Merci pour cette indication!
    Je viens de créer toutes mes structures (ce qui correspond à mes listes sous R), mais je me retrouve fasse à un autre problème :

    Dois-je indiquer "à la main" les valeurs que doivent prendre les éléments de mes structures ou y a-t-il un moyen d'être plus efficace?

    Par exemple, dois-je préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     liste.feuilles[1].compartiments[1].valeur= 15
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     liste.feuilles[1].compartiments[2].valeur= 26
    etc...

    Merci, merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux faire des boucles et les lire depuis un fichier, ou bien initialiser les champs d'une structure lors de la déclaration dans certains cas. Mais pour plus de détails, il faudrait que je connaisse la déclaration des structures et que j'aie une idée de la taille de chaque tableau...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Voici les structures créées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    struct cohorte
    {
      int age;
      double nb_mal;
      double surface;
    };
     
    struct compartiment
    {
      double surface;
      double surface.dispo;
      struct cohortes cohortes[];
    };
     
    struct feuille
    {
      int date_apparition;
      struct compartiment compartiments [];
    };
     
    struct donnee_temp
    {
      int tps_simu;
      double second_c;
      double second_a;
      int age;
      int nb_feuilles_e;
      struct feuille feuilles [];
    };
     
    struct plante
    {
      int tps_change [];
      struct donnee_temp donnees_temp [];
    };
     
    struct nom
    {
      struct param parametres;
      struct plante plantes;
    };
    En fait à l'initialisation, les valeurs dans mes strucutres sont toutes à 0. Mais a chaque pas de temps , grâces aux petites fonctions que je veux écrire, les éléments vont se mettrent a jour.

    Cependant, je souhaite ecrire uniquement ces petites fonctions en C (gain de temps) et concerver les liste R.

    Savez-vous s'il est possible de donner en paramètre d'entrée d'une fonction C, une liste?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Des structures se terminant par un tableau de longueur non-déclarée ne peuvent être utilisées qu'en allocation dynamique et de manière vachement complexe. Je ne te conseille pas ça.

    Soit tu peux utiliser des pointeurs pour allouer de vrais tableaux dynamiques dans chaque structure, soit tu passes au C++ à la place pour bénéficier des classes de collections.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Soit tu peux utiliser des pointeurs pour allouer de vrais tableaux dynamiques dans chaque structure, soit tu passes au C++ à la place pour bénéficier des classes de collections.
    ou encore tu définis une taille maxi et tu écris en dur des tableaux de la taille maxi.

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    J'ai trouvé ici :http://ciam.inra.fr/r4ciam/appelC.html comment procéder mais les exemples donnés sont assez simples et je n'arrive pas a écrire ce dont j'aurais vraiment besoin, c'est a dire demander une lecture de liste de liste (cf structure présentée ci-dessus)

    Voici ce j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SEXP inocsum(SEXP p_nom, SEXP omega_c ) {
      omega_c = coerceVector(omega_c, REALSXP);
      SEXP feuille_choix, compart_choix, i_s_c;
      int i,j;
      double *CONIS_choix, om_c = REAL(omega_c)[0];
      PROTECT(i_s_c = allocVector(REALSXP,1));
     
     SEXP feuille = getListElement(p_nom,"feuilles");
      for (i=0;i< length(feuille);i++) {
      feuille_choix = VECTOR_ELT(feuille, i);
       SEXP compart = getListElement(feuille,"compartiments");
       for(j=0;j<7;j++) {
      compart_choix = VECTOR_ELT(compart, j);
       SEXP CONIs = getListElement(feuille,"CONIs");
       CONIS_choix = REAL(CONIs);
       REAL(i_s_c)[0] += ((om_c) * (*CONIS_choix));
       };
      };
      UNPROTECT(1);
       return(i_s_c);
    }
    Et voici la fonction getListElemnt que j'utilise:
    SEXP getListElement(SEXP list, const char *str)
    {
    /* Initialiser le retour */
    SEXP elmt = R_NilValue;
    /* Accéder aux noms des composants */
    SEXP names=getAttrib(list, R_NamesSymbol);
    int i;
    /* Recherche du composant de nom voulu **/
    for (i=0; i< length(list); i++)
    if (strcmp(CHAR(STRING_ELT(names, i)), str) ==0) {
    elmt=VECTOR_ELT(list, i);
    break;
    }
    return(elmt);
    }

    Mais j'obtiens des messages d'erreur me signifiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    undefined reference to `__imp_R_NilValue'
     undefined reference to `__imp_R_NamesSymbol'
     undefined reference to `STRING_ELT'
    ...
    J'ai l'impression qu'il n'arrive pas lire mes listes de listes...

    Une idée?

    Merci!

Discussions similaires

  1. Probléme pour charger une List dans un s:select
    Par Elthriel dans le forum Struts 2
    Réponses: 10
    Dernier message: 17/07/2008, 11h21
  2. problème pour alimenter une liste
    Par mawelle dans le forum IHM
    Réponses: 2
    Dernier message: 31/03/2008, 11h30
  3. problème pour appeler une liste de catégorie
    Par minie dans le forum Struts 1
    Réponses: 11
    Dernier message: 29/05/2007, 16h39
  4. Problème pour afficher une liste déroulante
    Par Oli_Ifre dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2007, 09h11
  5. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo