Transcription listes R en structures C

Transcription listes R en structures C - C - Programmation

Marsh Posté le 15-02-2013 à 22:31:20    

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

Reply

Marsh Posté le 15-02-2013 à 22:31:20   

Reply

Marsh Posté le 17-02-2013 à 00:04:39    

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++
Reply

Marsh Posté le 18-02-2013 à 14:54:47    

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
 

Reply

Marsh Posté le 18-02-2013 à 21:19:24    

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++
Reply

Marsh Posté le 21-02-2013 à 22:57:28    

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!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed