C pointeurs/Matrices fractions 2
Apparence
Introduction (deuxième partie)
[modifier | modifier le wikicode]- Un exemple complet à tester (sans sortie).
- Puis nous étudirons la fonction i_mF().
Le code
[modifier | modifier le wikicode]Exemple indépendant de la librairie
[modifier | modifier le wikicode]- Ce fichier est complet.
- Il crée une matrice et la détruit.
- Certains des "include" et "define" sont inutiles pour le code présenté, mais sont indispensables si on décide de rajouter certaines fonctions de la librairie.
/* ------------------------------ */
/* Save as : c01.c */
/* ------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
/* ------------------------------ */
#define C0 0
#define C1 1
#define C2 2
#define C3 3
#define C4 4
#define C5 5
#define C6 6
#define C7 7
#define C8 8
#define C9 9
#define R0 0
#define R1 1
#define R2 2
#define R3 3
#define R4 4
#define R5 5
#define R6 6
#define R7 7
#define R8 8
#define R9 9
#define RC0 0
#define RC1 1
#define RC2 2
#define RC3 3
#define RC4 4
#define OF 0
#define R_SIZE 0
#define C_SIZE 1
#define C_SIZE_A 2
#define ERROR_E +1.E-010
#define FIRST 1
#define FILENAME 11
#ifndef PI
#define PI 3.14159265359
#endif
/* ------------------------------ */
double **i_mF(
int r,
int c
)
{
double **A;
int ar;
int ac;
int i;
if(r<1||c<1)
{
printf(" The size of the matrix must be positive integers.\n\n");
printf(" double **i_mR(); \n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
ar = r + C1;
ac = c*C2 + C1;
/* Dynamically allocate an array of "ar" rows
and "ac" columns. */
A = malloc(ar * sizeof(*A));
if(!A)
{
printf(" I was unable to allocate the memory you requested.\n\n");
printf(" double **i_mR(); \n\n");
printf(" **A = malloc(ar * sizeof(*A));\n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
A[0] = malloc(ar * ac * sizeof(**A) );
if(!A[0])
{
printf(" I was unable to allocate the memory you requested.\n\n");
printf(" double **i_mR();\n\n");
printf(" A[0] = malloc(ar * ac * sizeof(**A) );\n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
for(i=1; i<ar; i++) A[i] = A[0]+i*ac;
/* Memorize the matrix size*/
A[R_SIZE][OF] = ar;
A[C_SIZE][OF] = ac;
/* I initialize the zero row and the zero column */
for(r=2; r<A[R_SIZE][OF]; r++) A[r][0] = 0.;
for(c=1; c<A[C_SIZE][OF]; c++) A[0][c] = 0.;
return(A);
}
/* ------------------------------------ */
void f_mF(
double **A
)
{
if(A) free(A[0]);
free(A);
}
/* ------------------------------------ */
int main(void)
{
double **A = i_mF(C3,R5);
f_mF(A);
printf("\n Press return to continue");
getchar();
return 0;
}
Étudions la fonction i_mF()
[modifier | modifier le wikicode]- Elle retourne un double pointeur de double (double **i_mF)
- Il entre le nombre de lignes (r) et le nombre de colonnes (c).
/* ------------------------------ */
double **i_mF(
int r,
int c
)
{
double **A;
int ar;
int ac;
int i;
if(r<1||c<1)
{
printf(" The size of the matrix must be positive integers.\n\n");
printf(" double **i_mR(); \n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
/* Je me réserve la colonne zéro et la ligne zéro,
pour mémoriser la taille de la matrice,
je rajoute donc une ligne et une colonne
On travail avec des fractions. On multiplie
le nombre de colonnes par 2 */
ar = r + C1;
ac = c*C2 + C1;
/* Dynamically allocate an array of "ar" rows
and "ac" columns. */
A = malloc(ar * sizeof(*A));
if(!A)
{
printf(" I was unable to allocate the memory you requested.\n\n");
printf(" double **i_mR(); \n\n");
printf(" **A = malloc(ar * sizeof(*A));\n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
A[0] = malloc(ar * ac * sizeof(**A) );
if(!A[0])
{
printf(" I was unable to allocate the memory you requested.\n\n");
printf(" double **i_mR();\n\n");
printf(" A[0] = malloc(ar * ac * sizeof(**A) );\n\n");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
/* Ces deux commandes allouent un block mémoire de double.
Le premier malloc offre un block de (ar) éléments.
A pointe sur le premier de ces éléments.
Cela correspond a un espace pour un tableau A[ar]. (ar nombres de lignes, ac nombre de colonne)
Le deuxième malloc offre un block de (ar*ac) élément pour les éléments du tableau.
A[0] le premier élément du tableau pointe aussi sur A.
A[0] pointe sur A.
A[1] pointe sur la deuxième ligne.
A[2] pointe sur la troisième ligne.
...
C'est ce que fait la boucle for ci-dessous.
On incrémente chaque A[i] de (i*colonnes) à partir de l'adresse de départ.
*/
for(i=1; i<ar; i++) A[i] = A[0]+i*ac;
/* On copie la taille de la matrice dans la matrice. */
A[R_SIZE][OF] = ar;
A[C_SIZE][OF] = ac;
/* On met zéro dans la ligne zéro et dans la colonne zéro. */
for(r=2; r<A[R_SIZE][OF]; r++) A[r][0] = 0.;
for(c=1; c<A[C_SIZE][OF]; c++) A[0][c] = 0.;
return(A);
}
Important :
- Vous n’est pas obliger de comprendre ce code pour utiliser les matrices.
- Dans la librairie je mets à zéro tous les éléments de la matrice avec la fonction m_0_mF(A);