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

Langage Perl Discussion :

Transmettre un tableau @tab à un programme C


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut Transmettre un tableau @tab à un programme C
    Salut

    Quelqu'un aurait-il une idéee de comment on peut transmettre un tableau @tab à un programme C qui va effectuer des calculs sur le tableau.

    J'ai besoin d'écrire mes calculs en C car on perl l'excution est trop longue.

    Merci à toute personne pouvant m'éclairer

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Le problème en C (ça remonte à loin, mes cours !), c'est que tu dois connaître la taille du tableau que tu vas fournir à ARGV.

    Sous Linux avec une certaine version de gcc, c'était possible de fournir d'abord le nbre d'éléments du tableau, puis le tableau en tant qu'arguments et le compilo ne beuglait pas. Ca a été corrigé depuis.


  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu as de bons exemple de comment transmettre un tableau à une fonction C dans ton dernier post. Regarde comment je fait dans mes exemples avec shuffle(), tu as même le luxe d'avoir un passage par référence ou directement par valeur. Ces exemples sont valables avec Inline::C mais également avec XS avec de légères adaptations.

    As-tu essayé d'employer PDL, ou File::Sort pour régler tes problèmes par ailleurs ?

    --
    Jedaï

  4. #4
    Membre confirmé Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut
    Merci Jedai!

    Oui j'ai utilisé File::Sort qui marche remarquablement bien même sur des listes ayant un milliard de valeurs !!!!
    Ce module est génial car il utilise pas de RAM
    Du coup je fais le sort en utilisant un fichier temporaire.


    Je viens de récuperer la doc du module Inline-0.44::C
    J'ai decidé de me mettre au C mais je débute juste (depuis hier ... lol)

    Pourrais tu me corriger mon code pour récuperer le tableau dans C :

    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
     
    use Inline C;
    $tab[0][0]=2.12;
    $tab[0][1]=0;
    $tab[1][0]=45.45;
    $tab[1][1]=12.784546;
    $tab[2][0]=undef;
    $tab[2][1]=25;
    $result = calcul (@tab,$#taille);
    __END__
    __C__
    float calcul (tab[],int taille) {
    tab[taille];
    float adition;
    for (i = 0; i < 3; i++){
      for (j = 0; j < 2; j++){
         adition += tab[i][j] ;
    }}
    return adition;
    }
    Si j'ai bien comprit le C est compilé la première fois et tourne aussi vite que du C standart ?
    Comment faire si des cases de mon tableau perl @tab sont vide ?? ($tab[2][0]=undef C ne peux pas avoir de vide dans un tableau (c'est des 0)

    Je te remercie encore Jedai

  5. #5
    Membre confirmé Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut
    Avant de pouvoir comprendre Inline::C, je dois comprendre perlguts !
    http://perldoc.perl.org/perlguts.pdf

    Si quelqu'un connait un site où c'est expliqué en français, je suis prenneur...

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Désolé, a priori debguts n'a pas encore été traduit, mais tu peux tout de même regarder sur ce site, il y a tout de même quelques autres pages de documentation qui peuvent t'intéresser (perlintern,...).

    Voici pour ton code (n'oublie pas que les tableaux à plusieurs dimensions en Perl sont en fait des tableaux de références) :
    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
     
    #! /usr/bin/perl
    use strict;
     
    use Inline 'C';
     
    my @tab;
     
    $tab[0][0]=1;
    $tab[0][1]=2;
    $tab[1][0]=3;
    $tab[1][1]=4;
    $tab[2][0]=5;
    $tab[2][1]=6.5;
     
    print &calcul(@tab);
    __END__
    __C__
    void calcul ( SV* truc, ... ) {
      SV *array_ref, **sv_temp;
      AV *array;
      I32 maxi, maxj, i, j;
      Inline_Stack_Vars;
      double result = 0;
     
     
      maxi = Inline_Stack_Items;
      for( i = 0; i < maxi ; i++ ){
        array_ref = Inline_Stack_Item(i);
        array = (AV*)SvRV(array_ref);
        maxj = av_len(array);
        for( j = 0; j <= maxj; j++ ){
          sv_temp = av_fetch(array, j, 0);
          result += SvNV( *sv_temp );
        }
      }
      Inline_Stack_Reset;
      Inline_Stack_Push(newSVnv(result));
      Inline_Stack_Done;
    }
    Néanmoins, surtout si c'est ce type d'opération que tu as à faire et que tu as effectivement des millions d'éléments à gérer, tu devrais vraiment t'intéresser à PDL.

    --
    Jedaï

  7. #7
    Membre confirmé Avatar de Ickou
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut
    Jedai, je te remercie encore !

    Tu m'as bien orienté.

    Passe un bon weekend

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    D'après Benchmark, la version en C est 9 fois plus rapide que la version naïve en Perl (sur un tableau de 100 * 1000, 230 sommations par seconde) (0,7 s pour sommer un tableau de 1000 * 10000, mais à ce niveau là, la différence avec le Perl est moins marquée : seulement 5 fois plus rapide, car ce qui joue avant tout c'est la quantité de mémoire, et cela permet de mesurer à quel point Perl est gourmand : j'ai tout de même 1 Go de RAM sur mon ordi, mais Windows a dû faire grimper la taille du fichier d'échange à 1 Go pour gérer mon tableau Perl de seulement 10 millions d'éléments... La solution s'appelle PDL bien sûr).

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transmettre un tableau à un sous programme
    Par Darktrouble dans le forum Débuter
    Réponses: 4
    Dernier message: 03/04/2008, 19h53
  2. Transmettre un tableau dynamique par adresse
    Par paradise dans le forum Delphi
    Réponses: 15
    Dernier message: 05/04/2007, 19h33
  3. transmettre un tableau via un formulaire
    Par laloupiote dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 19h54
  4. [POO] Transmettre un tableau d'objet
    Par slyfer dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2007, 12h00
  5. Comment transmettre un tableau par socket
    Par vodevil dans le forum Programmation et administration système
    Réponses: 11
    Dernier message: 08/04/2006, 14h19

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