Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1670 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Transcription listes R en structures C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transcription listes R en structures C

n°2176012
naneba2
Posté le 15-02-2013 à 22:31:20  profilanswer
 

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 (boucles) je dois me mettre au C.
 
Voici un exemple de fonction R que je souhaite retranscrire en C:

Code :
  1. inoc <- function(liste, nom) {
  2.    isc <- 0
  3.    for (i in 1:length(liste[[length(liste)]]$feuilles)) {
  4.         for (k in 1:7) {
  5.             isc <- isc + nom$param$omega * liste[[length[[liste]]$feuilles[[i]]$compartiments[[k]]$valeur
  6.                           }
  7.                                                                   }
  8. isc
  9. }


 
Cette fonction doit calculer une somme a partir d’éléments d'une liste "liste".
 
J'ai donc commencer par définir des structures en C (identiques à mes listes R)
 
Je cherche maintenant comment donner le plus efficacement possible les valeurs de ces éléments de liste R à mes structures C sans tout renseigner "à la main" comme

Code :
  1. liste.feuilles[1].compartiments[1].valeur= 15
  2. liste.feuilles[1].compartiments[2].valeur= 26

 
etc... (qui finalement me prendrait beaucoup de temps)
 
J'ai commencé à écrire ma fonction, mais j'avoue être complétement larguée:

Code :
  1. void inoc_s_c(int *n, double *omega, double *valeur, double *isc)
  2. {
  3. int i,k;
  4. double isc=0.;
  5. for (i=1;  i<*n; i++)
  6.  for(k=1; k=7; k++)
  7.   isc+=(omega)*(
  8. }


 
Quelqu'un aurait-il des idées, je suis preneuse?
Merci!
 
Nane

mood
Publicité
Posté le 15-02-2013 à 22:31:20  profilanswer
 

n°2176090
h3bus
Troll Inside
Posté le 17-02-2013 à 00:04:39  profilanswer
 

Whaaa...
 
Peux-tu poster la définition de ta structure C?
Avec quelles valeurs veux-tu initialiser ta structure? C'est choisi par l'utilisateur? Défini à l'avance? Calculable?
 
Je ne pige rien à ta fonction mais j'ai l'impression que tu patauge sérieusement avec des trucs du C compliqués alors que tu pourrai faire bien plus simple.


---------------
sheep++
n°2176264
naneba2
Posté le 18-02-2013 à 14:54:47  profilanswer
 

Alors voici a quoi ressemble ma structure C:
 

Code :
  1. struct cohorte
  2. {
  3.   int age;
  4.   double nb_mal;
  5.   double surface;
  6. };
  7. struct compartiment
  8. {
  9.   double surface;
  10.   double surface.dispo;
  11.   struct cohortes cohortes[];
  12. };
  13. struct feuille
  14. {
  15.   int date_apparition;
  16.   struct compartiment compartiments [];
  17. };
  18. struct donnee_temp
  19. {
  20.   int tps_simu;
  21.   double second_c;
  22.   double second_a;
  23.   int age;
  24.   int nb_feuilles_e;
  25.   struct feuille feuilles [];
  26. };
  27. struct plante
  28. {
  29.   int tps_change [];
  30.   struct donnee_temp donnees_temp [];
  31. };
  32. struct nom
  33. {
  34.   struct param parametres;
  35.   struct plante plantes;
  36. };


 
Mes structures (= listes R) sont a initialiser à 0 et a modifier a chaque pas de temps par ces fonctions que cherche a créer (en C pour gagner du temps)...
 
Tu aurais peut-être une autre façon de faire les choses de manière plus simple??
 
Merci!
Nane
 

n°2176355
h3bus
Troll Inside
Posté le 18-02-2013 à 21:19:24  profilanswer
 

Code :
  1. double surface.dispo;


=> Je crois que c'est une déclaration interdite, ou alors très bizarre.
Remplace là par:

Code :
  1. double surface_dispo;


 
Sais-tu allouer dynamiquement de la mémoire pour tes structures?
La première chose que tu dois définir est un "constructeur" qui instancie tes structures (une fonction par structure, en commençant par les structures les plus en aval).
 
Par exemple:

Code :
  1. struct cohorte * cohorte_new()
  2. {
  3.    cohorte_instance * struct cohorte = NULL;
  4.    if( (cohorte_instance = malloc(sizeof(struct cohorte)) == NULL) return NULL;
  5.    cohorte_instance.age = 0;
  6.    cohorte_instance.nb_mal = 0;
  7.    cohorte_instance.surface = 0;
  8.    return cohorte_instance;
  9. }


 
Ensuite il faudra t'attaquer aux fonctions pour libérer l'espace mémoire (en quittant le programme), et ensuite seulement aux fonctions de manipulation et au vif du sujet.


---------------
sheep++
n°2176962
naneba2
Posté le 21-02-2013 à 22:57:28  profilanswer
 

En fait, j'ai trouvé ici [url] http://ciam.inra.fr/r4ciam/appelC.html [/url] comment procéder pour passer une liste R en argument d'un programme C (sans recréer mes structures) 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 que j'ai écrit:

Code :
  1. SEXP inocsum(SEXP p_nom, SEXP omega_c ) {
  2.   omega_c = coerceVector(omega_c, REALSXP);
  3.   SEXP feuille_choix, compart_choix, i_s_c;
  4.   int i,j;
  5.   double *CONIS_choix, om_c = REAL(omega_c)[0];
  6.   PROTECT(i_s_c = allocVector(REALSXP,1));
  7.  
  8. SEXP feuille = getListElement(p_nom,"feuilles" );
  9.   for (i=0;i< length(feuille);i++) {
  10.   feuille_choix = VECTOR_ELT(feuille, i);
  11.    SEXP compart = getListElement(feuille,"compartiments" );
  12.    for(j=0;j<7;j++) {
  13.   compart_choix = VECTOR_ELT(compart, j);
  14.    SEXP CONIs = getListElement(feuille,"CONIs" );
  15.    CONIS_choix = REAL(CONIs);
  16.    REAL(i_s_c)[0] += ((om_c) * (*CONIS_choix));
  17.    };
  18.   };
  19.   UNPROTECT(1);
  20.    return(i_s_c);
  21. }


 
Et voici la fonction getListElemnt que j'utilise:
 

Code :
  1. SEXP getListElement(SEXP list, const char *str)
  2. {
  3. /* Initialiser le retour */
  4. SEXP elmt = R_NilValue;
  5. /* Accéder aux noms des composants */
  6. SEXP names=getAttrib(list, R_NamesSymbol);
  7. int i;
  8. /* Recherche du composant de nom voulu **/
  9. for (i=0; i< length(list); i++)
  10. if (strcmp(CHAR(STRING_ELT(names, i)), str) ==0) {
  11. elmt=VECTOR_ELT(list, i);
  12. break;
  13. }
  14. return(elmt);
  15. }


 
Mais j'obtiens des messages d'erreur me signifiant:
 

Code :
  1. undefined reference to `__imp_R_NilValue'
  2. undefined reference to `__imp_R_NamesSymbol'
  3. undefined reference to `STRING_ELT'
  4. ...


 
J'ai l'impression qu'il n'arrive pas lire mes listes de listes...
 
Une idée?
 
Merci!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Transcription listes R en structures C

 

Sujets relatifs
C++ - Boucle infini d'include[C#] Winform Binding Controls OracleDataAdapter [Résolu]
Programmation C Aides [Résolu][resolu] problème compilation programmes C sous Dev-C++
Utiliser librairies R.euters E.ikon sur Excel VBAChronométrer le temps d'exécution d'une fonction en C et à la µs
Realiser un Menu en Cprogrammation C (Menu)
[C# C++ JAVA] La programmation, un métier d'avenir ? 
Plus de sujets relatifs à : Transcription listes R en structures C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR