Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
TCL C74 Series 55C743 – TV 55” 4K QLED 144 Hz Google TV (Via ODR ...
499 €
Voir le deal

Transcription listes R en structures C

2 participants

Aller en bas

Transcription listes R en structures C Empty Transcription listes R en structures C

Message  Naneba Sam 16 Fév 2013 - 1:30

Bonjour a tous,

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:
    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
    }
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:
    liste.feuilles[1].compartiments[1].valeur= 15
    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:
    void inoc_s_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 suis preneuse?
Je vous remercie beaucoup!

Nane

Naneba

Messages : 1
Date d'inscription : 16/02/2013

Revenir en haut Aller en bas

Transcription listes R en structures C Empty Re: Transcription listes R en structures C

Message  -ed- Lun 1 Sep 2014 - 2:40

Pour répondre correctement, il faudrait connaitre à la fois le R et le C ... Pas évident ... Je vais déjà essayer de comprendre le code R  (je ne sais pa comment on commente en R alors je vais faire comme en C :

Code:

    inoc <- function (liste, nom) // cette ligne définit une fonction ?
                                           // inoc est le nom de la fonction ?
                                           // liste et nom sont les paramètres ?
    {
       isc <- 0 // isc est une variable locale initialisée à 0 ?

       for (i in 1:length(liste[[length(liste)]]$feuilles))
       /* une boucle for dont l'indice i varie de 1 à ???
           euh, c'est plutôt complexe comme expression et sans connaitre
           la structure de 'liste' ni la syntaxe appropriée, ça reste incompréhensible ...
           Admettons que ce soit la taille d'un tableau (à 2 dimensions ?)
       */
       {
            for (k in 1:7) // et une boucle imbriquée avec k variant de 1 à 7
            {
                isc <- isc + nom$param$omega * liste[[length[[liste]]$feuilles[[i]]$compartiments[[k]]$valeur
                // faire la somme de tous les valeurs lues multipliée par le 'sous paramètre' omega de 'nom' ...
            }
        }
       isc // retourner les résultat.
    }

En fait, on a probablement affaire à une structure 'nom' et à un tableau de structures à 2 dimensions 'liste' ...

Avant d'aller plus loin il faut définir ces structures en C et faire le choix du tableau statique (taille prédéfinie, simple à concevoir et à gérer) ou dynamique (taille déterminée à l'exécution) et là, ça devient vite complexe.

Concernant le code posté
Code:

    void inoc_s_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)*(
    }
Si la fonction doit retourner la valeur de 'isc', il vaut mieux utiliser return, c'est plus simple. Concernant les valeurs de paramètres, dans la mesure du possible, éviter les pointeurs inutiles. Et attention à la gestion des boucles et des indices (qui partent de 0 en C)

Pour finaliser, il faut connaitre la structure du tableau (d'éléments de type struct data) à deux dimensions pour que ça ressemble à ça :
Code:

double inoc_s_c (int n, double omega, struct data**tableau)
{
  int i,k;
  double isc = 0.;
  for (i=0;  i<n; i++)
      for(k=0; k<7; k++)
        isc += omega * tableau[i][k].feuille.compartiment.valeur ;

  return isc;
}

Beaucoup de réponses à certaines questions ici :

http://www.bien-programmer.fr/notes.php
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser