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 :

appel d'une fonction avec allocation


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Par défaut appel d'une fonction avec allocation
    je veux faire appel a une fonction qui crée une matrice a laquelle on alou de l'espace mais je ne sais pas comment l'appeler :

    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
    #include<stdio.h>
    #include<alloc.h>
    #include<conio.h>
     
    void main()
    {
       int**a;
     
       clrscr();
       mat(&**a);/* voici l'appel de la fct*/
     
       void mat(int***a);
       {
          int i,*x,**a,n,j,m;
          clrscr();
          printf("donnez le nb de ligne n & de colonnes m\n");
          scanf("%d %d",&n,&m);
          x=(int*)malloc(n*m*sizeof(int));
          a=(int**)malloc(n*sizeof(int*));
          for(i=0;i<n;i++)
             a[i]=x+i*m;
          printf("donner les val de la mat");
          for(i=0;i<n;i++)
             for(j=0;j<m;j++)
          scanf("%d",&a[i][j]);
          printf("tappez sur une touche\n");
          getch();
          puts("voici votre tableau\n");
          for(i=0;i<n;i++)
          {
             for(j=0;j<m;j++)
                printf("|%d|",a[i][j]);
             printf("\n");
          }
          getch();
       }
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    1. <alloc.h> n'est pas standard, utiliser <stdlib.h> (pour conio.h, je passe).
    2. Ne pas utiliser des variables d'un seul caractère (on n'y comprend rien).
    3. main() retourne toujours un int.
    4. On ne définit pas une fonction à l'intérieur d'une autre fonction.
    5. On ne caste pas le retour de malloc() en C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut Re:
    Dans tout ce qui suit, les éléments d'une matrice sont de type entier.
    Mais d'abord, examinons un peu ce qu'est une matrice. Prennons une matrice 4 x 3 par exemple. Elle est constituée de 4 lignes, chaque ligne étant un tableau de 3 entiers. La matrice est un pointeur sur la première ligne (de la même manière qu'une chaîne est un pointeur sur le premier caractère de la suite de caractères).

    Donc d'une manière générale :
    Une ligne est un pointeur sur un entier
    Une matrice est un pointeur sur une ligne

    Ainsi, si A est une matrice:
    A[0] désigne la première ligne
    A[1] la seconde
    Et ainsi de suite.

    Nous définissons les types SCALAIRE, LIGNE et MATRICE comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int SCALAIRE;
    typedef SCALAIRE * LIGNE;
    typedef LIGNE * MATRICE;
    Donc pour construire une matrice 4 x 3, il suffit de créer 4 tableaux de 3 entiers, ce qui se fait en deux étapes:
    On crée d'abord les 4 lignes
    Ensuite on fait de chaque ligne un tableau de 3 entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdlib.h>
    MATRICE Matrice(int lignes, int colonnes)
    {
    	MATRICE A;
    	int i;
     
    	A = (MATRICE)malloc(lignes * sizeof(LIGNE));
     
    	for(i = 0; i < lignes; i++)
    		A[i] = (SCALAIRE *)malloc(colonnes * sizeof(SCALAIRE));
     
    	return A;
    }
    Lorsqu'on n'a plus besoin de la matrice, il faut la détruire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdlib.h>
    void DeleteMatrice(MATRICE A, int lignes, int colonnes)
    {
    	int i;
     
    	for(i = 0; i < lignes; i++)
    		free(A[i]);
     
    	free(A);
    }
    Et voilà.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Melem
    Si tu déclares par exemple :
    t est un int *!
    NON !

    C'est un (int *)[4]
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       int a[10][4];
       int *pa = a;                 /* warning */
       int (*pb)[4] = a;
       int (*pc)[10][4] = &a;
     
       printf ("pa=%p pa+1=%p\n", (void *) pa, (void *) (pa + 1));
       printf ("pb=%p pb+1=%p\n", (void *) pb, (void *) (pb + 1));
       printf ("pc=%p pc+1=%p\n", (void *) pc, (void *) (pc + 1));
     
       return 0;
    }
    MinGW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pa=0022FED0 pa+1=0022FED4
    pb=0022FED0 pb+1=0022FEE0
    pc=0022FED0 pc+1=0022FF70
     
    Press ENTER to continue.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par John32
    Voila j'ai crée un petit project dans lequel j'ai un petit probléme pour aficher une fenétre ; dont voici le code que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void DrawCenterMess( U8 *mess , STOSD_Color_t color )
    {
    U32 textW,textH;
     
    ClearFullArea();
    WS_GetBigTextSize(mess, &textW, &textH);
    WS_DrawTextBig(mess, (720-textW)/2, (576-textH)/2, color);
    }
    Le problème, c'est que ce n'est pas du tout du C standard. Je ne sais même pas de quelle bibliothèque il s'agit...

    C'est Worldsat, c'est ça ?

    http://worldsat.rtfm.be/faq.php?op=detail&pid=74

    Apparemment, il y a un forum spécialisé. Il faut voir avec eux, non ?

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    Bonsoir Emmanuel ,



    Exactement Emmanuel Worldsat ; je suis en train de programmer un nouveau projet !

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Par défaut
    tout d'abord merci pour votre reponse, et puis je voudrai savoir comment effectuer l'appel d'une fonction de matrice, son prototype si c possible, aussi si vous pouvez me montrer ou est le problem avec ce prog :
    il donne la racine carree avec la methode de newton
    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
     
    #include<stdio.h>
    #include<conio.h>
    void main()
    {unsigned long a,x0,x;
     clrscr();
     printf("donner svp le Nb : \n");
     scanf("%u",&a);
     x=a/2;
     do
      {x0=x;
      x=1/2*(x0+(a/x0));
      }
     while(x-x0>=0.0001);
     printf("voici la racine: %u",x);
     getch();
    }
    et essayer pour le N° 2 et puis pour le N° 9 svp et expliquez moi si c'est possible ou est le probleme
    merci d'avence et bon courage

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Pour faire des calculs en virgule flottante ce serait peut-être pas mal de prendre des nombres réels, non, qu'en penses-tu ??

    au moins

    Et puis également mettre les éléments intervants dans une division comme des nombres à virgule flottante également, sinon la division se fait comme une division entière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     x=a/2.0;
    ....
    x=0.5*(x0+(a/x0));

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est un (int *)[4]
    D'accord, mais en fait c'est que dans l'exemple que j'ai fourni le type MATRICE a été défini comme étant un int **. Mais abandonnons par exemple ce type MATRICE, nous déclarerons alors une matrice comme étant tout simplement un tableau à 2 dimensions. Suposons alors que nous souhaitons créer des fonctions telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Transposee(MATRICE transposee, MATRICE A, int lignes, int colonnes);
    void SommeMatricielle(MATRICE somme, MATRICE A, MATRICE B, int lignes, int colonnes);
    Puisqu'une MATRICE est donc un tableau à deux dimensions, comment devrions-nous déclarer le type MATRICE?
    En résumé, et grossièrement , un tableau, disons d'entiers par exemple, est toujours (quelle que soit sa dimension) un int *.

    Puis si on considère par exemple :
    int t[DIM1][DIM2]...[DIMN];
    Alors t[i1][i2]...[iN] est équivalent à :
    t[i1*DIM2*...DIMN + i2*DIM3*...DIMN + ... + iN]

  10. #10
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par MoonSef
    e voudrai savoir comment effectuer l'appel d'une fonction de matrice, son prototype si c possible
    Je ne comprends pas vraiment ce que tu veux dire mais je vais te donner un exemple d'utilisation :
    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
    int main()
    {
    MATRICE A;
    int i, j;
     
    A = Matrice(4, 3);
    printf("Entrez les éléments de la matrice.\n");
    for(i = 0; i < 4; i++)
    for(j = 0; j < 3; j++)
    scanf("%d", &A[i][j]); //ou A[i] + j
     
    printf("Voici la matrice que vous avez composé.\n");
    for(i = 0; i < 4; printf("\n"), i++)
    for(j = 0; j < 3; j++)
    printf("%7d", A[i][j]);
     
    DeleteMatrice(A, 4, 3);
     
    return 0;
    }

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

Discussions similaires

  1. appel d une fonction avec greasemonkey
    Par vinc_dev dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/02/2009, 11h09
  2. appel d'une fonction avec la touche "enter"
    Par viny dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 19/08/2008, 12h05
  3. Appel d'une fonction avec plusieurs variables
    Par midoparis dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/05/2008, 11h53
  4. appel d'une fonction avec parametre.
    Par rollernox dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/10/2006, 23h07
  5. [FPDF] Erreur après appel d'une fonction avec include
    Par orus8 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/11/2005, 10h49

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