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
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Points : 7
    Points
    7
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    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.

  3. #3
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 à l'essai
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Bonsoir Emmanuel ,



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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Points : 7
    Points
    7
    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 éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    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 éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    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 éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    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