Tableau a double entrée ?
Résolu/Fermé
azerty572
Messages postés
1
Date d'inscription
vendredi 9 décembre 2016
Statut
Membre
Dernière intervention
9 décembre 2016
-
Modifié par Chris 94 le 9/12/2016 à 21:03
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 23 déc. 2016 à 11:32
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 23 déc. 2016 à 11:32
A voir également:
- Tableau a double entrée ?
- Double ecran - Guide
- Tableau croisé dynamique - Guide
- Whatsapp double sim - Guide
- Tableau ascii - Guide
- Tableau word - Guide
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié par mamiemando le 23/12/2016 à 11:36
Modifié par mamiemando le 23/12/2016 à 11:36
Bonjour,
Je suppose que tu voulais dire une image bmp, ou plus simplement une matrice de pixels.
Deux méthodes sont possibles :
Méthode 1 :
Tu fais un tableau de tableaux : le premier tableau aura autant de cases que ton image de lignes, et chaque tableaux contenus autant de case que tu as de colonnes.
- Inconvénient : force à faire beaucoup de malloc et (de free), ce qui ralentit le programme
- Avantage : permet d'écrire
Note que
Méthode 2
C'est ce que tu as commencé à faire, tu travaille sur un tableau pour faire une seule allocation (et ainsi améliorer la performance). Mais ça te force à adopter une convention pour retrouver la valeur aux coordonnées (i,j). En adoptant les mêmes conventions que dans la méthode 1 :
L'idée est de calculer un "offset" qui correspond au à la i-ème ligne. Chaque ligne contient
Bonne chance
Je suppose que tu voulais dire une image bmp, ou plus simplement une matrice de pixels.
Deux méthodes sont possibles :
Méthode 1 :
Tu fais un tableau de tableaux : le premier tableau aura autant de cases que ton image de lignes, et chaque tableaux contenus autant de case que tu as de colonnes.
- Inconvénient : force à faire beaucoup de malloc et (de free), ce qui ralentit le programme
- Avantage : permet d'écrire
matrix[i][j]
// Allocation unsigned i, j, num_rows = 4, num_rows = 6; int ** matrix = malloc(sizeof(int *) * num_rows); for (i = 0; i < num_rows; i++) { matrix[i] = malloc(sizeof(int) * num_cols); } // Utilisation i = 3; // 0 <= i < num_rows j = 4; // 0 <= i < num_cols matrix[i][j] = 42; // Free for (i = 0; i < num_rows; i++) { free(matrix[i]); } free(matrix);
Note que
matrixest de type
int *. Intuitivement
T *peut être vu comme un tableau dont les cases sont de type
T. En vrai c'est surtout l'adresse mémoire d'un truc supposé de type
T. Notre premier tableau contient des tableaux (de types
int *), il est donc lui même de type
int **.
Méthode 2
C'est ce que tu as commencé à faire, tu travaille sur un tableau pour faire une seule allocation (et ainsi améliorer la performance). Mais ça te force à adopter une convention pour retrouver la valeur aux coordonnées (i,j). En adoptant les mêmes conventions que dans la méthode 1 :
int * matrix = malloc(sizeof(int) * num_rows * num_cols); // Utilisation : accès à la case (i, j) // 0 <= (i * num_cols + j) < (num_rows * num_cols) matrix[i * num_cols + j] = 42; free(matrix);
L'idée est de calculer un "offset" qui correspond au à la i-ème ligne. Chaque ligne contient
num_colsélément, donc accéder au début de la i-ème ligne correspond à la case
i*num_cols. Il ne reste plus qu'à accéder à la j-ème case de cette ligne, soit
i*num_cols + j.
Bonne chance