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 :

Que fait ce programme de matrices ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Que fait ce programme de matrices ?
    Salut,

    j'aurais besoin d'aide pour comprendre ce que fait ce programme et en particulier les fonctions cc et p
    J'ai essayé en utilisant un dessin mais je n'arrive pas à trouver.
    Si quelqu'un pouvait m'aider.
    Merci

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include<stdio.h>
    #include<stdlib.h>
     
    void a(int ***r, size_t n){
      unsigned int i,j,k;
      for(i=0U; i<n; ++i){
        for(j=0U; j<n; ++j){
          for(k=0U; k<n; ++k) printf("%d ",r[i][j][k]);
          printf("\n");
        }
        printf("\n\n");
      }
    }
     
    void cc(int ****r, size_t n){
      unsigned int i,j,k;
      *r = malloc(n * sizeof(int **));
      for(i=0U; i<n; ++i){
        (*r)[i] = malloc(n *size(int *));
        for(j=0U; j<n; ++j){
          (*r)[i][j] = malloc(n * sizeof(int));
          for(k=0U; k<n; ++k)
            (*r)[i][j][k] = i*n*n+j*n+k;
          }
       }
    }
     
    void cl(int ****r, size_t n){
      unsigned int i,j;
      for(i=0U; i<n; ++i){
        for(j=0U; j<n; ++j) free((*r)[i][j]);
        free((*r)[i]);
      }
      free((*r));
      *r = NULL;
    }
     
    void * c2(void *c) { return *(int ***)c; }
    void * c1(void *c) { return *(int **)c; }
     
     
    void p(void *c, size_t s, unsigned int l){
      static size_t ts[] = { sizeof(int), sizeof(int*), sizeof(int**)};
      static void * (*tf[])(void *) = {&c1, &c2};
      unsigned int i,j;
      for(i=0U; i<s/2U; ++i){
        for(j=0U; j<ts[l]; ++j){
          char tmp;
          tmp = *((char *)c+i*ts[l]+j);
          *((char *)c+i*ts[l]+j) = *((char *)c+(s-1-i)*ts[l]+j);
          *((char *)c+(s-1-i)*ts[l]+j) = tmp;
        }
      }
      if(l!=0U)
        for(i=0U; i<s; ++i, c=(void *)(((char *)c)+ts[l]))
          p( (*(tf[l-1U]))(c), s, l-1U);
    }
     
     
    void pA(int ***m, size_t s){ p(m,s,2U); }
     
    int main(void){
      int ***m; cc(&m,3); a(m,3); pA(m,3); cl(&m,3);
      return EXIT_SUCCESS;
    }

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    la fonction cc alloue de la place pour une matrice de taille n (3 ici) et remplie ta matrice avec
    Ri,j,k = i*9+j*3+k;

    par contre la fonction p ... c'est du vaudou

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut

    Ce programme de matrices nous fait prendre conscience que les commentaires c'est important

    cc() alloue un tableau 3 dimensions, alloue chaque dimensions, et initialise chaque case à un numero
    Apres, pour le p(), alors là .. en plus p() est recursif
    Celui qui a ecrit ça connait bien le langage c, mais c'est vraiment illisible

  4. #4
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Mais c'est dingue ce truc !
    Pardonnez mon ignorance, c'est quoi le OU dans les boucles ?
    Et les 1U et 2U ?
    Pour la fonction p(), je ne comprends pas grand chose, c'est bourré de cast...
    Je me rends compte que je connais encore peu le C...
    Mais cette manie de faire des fonctions avec des noms non explicites, et sans commenter !
    C'est le concours du plus goret ou quoi ?

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    C'est pas OU mais 0U
    On peut mettre des suffixes aux constantes numeriques pour leur donner un type precis
    comme L qui signifie "long", U signifie unsigned, on a aussi LL, UL, ULL, yen a ptet d'autres

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Question déjà posée sur le forum hardware où je t'ai déjà répondu , j'ai rajouté des explications que tu aurais pu trouver en testant comme je l'ai fait, ce code est volontairement imbitable, il faut le tracer pour comprendre ce qu'il fait.
    Au passage, tu n'as pas corrigé toutes les erreurs que j'avais signalé.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    LOL bah au moins c'est un bon exemple pour voir ce qu'il ne faut PAS faire !

    J'aime bien la fonction p récursive avec des appels de fonctions pour inverser des éléments de la matrice

    Si si c'est commenté

    ts -> tableau de taille (size)
    tf -> tableau de fonctions


    et les 0U (pour optimisation ? ou pour faire encore + jolie ), vu comment c codé LOL

Discussions similaires

  1. Que fait ce programme ( les structures?)
    Par autoin dans le forum Débuter
    Réponses: 4
    Dernier message: 04/04/2008, 21h36
  2. que fait ce programme java?
    Par freemasons dans le forum Langage
    Réponses: 5
    Dernier message: 17/01/2008, 16h45
  3. Que fait ce programme ?
    Par lebossejames dans le forum Assembleur
    Réponses: 3
    Dernier message: 08/03/2007, 05h32
  4. que fait ce programme?
    Par minen dans le forum C
    Réponses: 15
    Dernier message: 31/12/2006, 18h08
  5. Que fait ce programme ?
    Par babar56 dans le forum C
    Réponses: 32
    Dernier message: 16/01/2006, 21h31

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