Pointeur à 2 dimension?
Fermé
linquisiteur
-
15 févr. 2014 à 14:17
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 16 févr. 2014 à 00:41
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 16 févr. 2014 à 00:41
A voir également:
- Pointeur à 2 dimension?
- Dimension a5 - Guide
- 2 ecran pc - Guide
- Pointeur souris disparu pc portable - Guide
- Word numéro de page 1/2 - Guide
- France 2 uhd - Accueil - TV & Vidéo
2 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 févr. 2014 à 14:20
15 févr. 2014 à 14:20
Si pour chaque ligne n tu as m colonnes, il est plus simple de faire un tableau à une dimension de n*m cases et par un petit jeu d'indice d'attribuer la ième ligne et jè colonne de ta matrice à la case m*i+j du tableau.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
15 févr. 2014 à 20:46
15 févr. 2014 à 20:46
Bonjour,
A quoi sert ta variable l ? Tu ne t'en sers pas...
*(matriceA + k)
Pourquoi utiliser cette syntaxe au lieu de matriceA[k] plus compact et plus lisible ?
free(matriceA);
Aïe. Fuite de mémoire. Tu n'as pas libéré les zones réservées aux colonnes => Boucle for à faire.
char z = getchar();
Ta variable z ne sert à rien. En plus, en C, on ne déclare pas une variable en plein milieu. Donc, mets plutôt : getchar(); tout simplement.
srand(time(NULL));
Mets plutôt dans le main(), sinon tu ne pourras pas trop réutiliser la fonction remplireTab()...
for(j=0;j<=colonne;j++)
C'est j<colonne et non j<=. C'est ça qui doit faire planter ton programme.
Cdlt,
A quoi sert ta variable l ? Tu ne t'en sers pas...
*(matriceA + k)
Pourquoi utiliser cette syntaxe au lieu de matriceA[k] plus compact et plus lisible ?
free(matriceA);
Aïe. Fuite de mémoire. Tu n'as pas libéré les zones réservées aux colonnes => Boucle for à faire.
char z = getchar();
Ta variable z ne sert à rien. En plus, en C, on ne déclare pas une variable en plein milieu. Donc, mets plutôt : getchar(); tout simplement.
srand(time(NULL));
Mets plutôt dans le main(), sinon tu ne pourras pas trop réutiliser la fonction remplireTab()...
for(j=0;j<=colonne;j++)
C'est j<colonne et non j<=. C'est ça qui doit faire planter ton programme.
Cdlt,
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
15 févr. 2014 à 20:51
15 févr. 2014 à 20:51
Freddy sniper of code (+1)
il m'a déjà snipper quelque fois ^^
J'ai corriger mais je crois que le problème vient du passage par paramètre car avec tout dans le main j'ai plus de résultat..
#include<stdlib.h>
#include <stdio.h>
#include <time.h> /* time.h me permet de faire des nombres pseudo-aleatoire */
void remplirTab(int ** tab, int ligne, int colonne);
void afficherTab(int ** tab, int ligne, int colonne);
int main(void){
int n = 2,
m = 3,
l = 2;
int k;
/* Créer matriceA */
int ** matriceA = malloc(sizeof *matriceA *n); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceA[k] = malloc(sizeof **matriceA * m);
/* Créer matriceB */
int ** matriceB = malloc(sizeof *matriceB *m); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceB[k] = malloc(sizeof **matriceB * l);
/* Créer matriceC */
int ** matriceC = malloc(sizeof *matriceC *n); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceC[k] = malloc(sizeof **matriceC * l);
srand(time(NULL));
remplirTab(matriceA, n, m);
remplirTab(matriceB, m, l);
afficherTab(matriceA, n, m);
afficherTab(matriceB, m, l);
for(k=0;k<n;k++)
free(matriceA[k]);
free(matriceA);
for(k=0;k<m;k++)
free(matriceB[k]);
free(matriceB);
for(k=0;k<n;k++)
free(matriceC[k]);
free(matriceC);
getchar();
return EXIT_SUCCESS ;
}
/* Cette procédure remplis des tableaux (en l'occurence pour creer des matrices):
pré: tab ** est déclarés, ligne et colonne sont initialisées et > 0
post: ligne et colonne sont inchangées, tab est initialisé
resultat: tab à été initialisé de nombres
*/
void remplirTab(int ** tab, int ligne, int colonne){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++)
tab[i][j] = rand() % 100;
}
}
/*
pré: tab ** est déclarés et initialisé , ligne et colonne sont initialisées et > 0
post: ligne, colonne et tab sont inchangés
resultat: le tableau à été afficher
*/
void afficherTab(int ** tab, int ligne, int colonne){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
printf("%3d ",tab[i][j]);
}
puts("");
}
}
/* Note: ne pas oublier de verif si la memoire allouer est null */
J'ai corriger mais je crois que le problème vient du passage par paramètre car avec tout dans le main j'ai plus de résultat..
#include<stdlib.h>
#include <stdio.h>
#include <time.h> /* time.h me permet de faire des nombres pseudo-aleatoire */
void remplirTab(int ** tab, int ligne, int colonne);
void afficherTab(int ** tab, int ligne, int colonne);
int main(void){
int n = 2,
m = 3,
l = 2;
int k;
/* Créer matriceA */
int ** matriceA = malloc(sizeof *matriceA *n); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceA[k] = malloc(sizeof **matriceA * m);
/* Créer matriceB */
int ** matriceB = malloc(sizeof *matriceB *m); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceB[k] = malloc(sizeof **matriceB * l);
/* Créer matriceC */
int ** matriceC = malloc(sizeof *matriceC *n); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
matriceC[k] = malloc(sizeof **matriceC * l);
srand(time(NULL));
remplirTab(matriceA, n, m);
remplirTab(matriceB, m, l);
afficherTab(matriceA, n, m);
afficherTab(matriceB, m, l);
for(k=0;k<n;k++)
free(matriceA[k]);
free(matriceA);
for(k=0;k<m;k++)
free(matriceB[k]);
free(matriceB);
for(k=0;k<n;k++)
free(matriceC[k]);
free(matriceC);
getchar();
return EXIT_SUCCESS ;
}
/* Cette procédure remplis des tableaux (en l'occurence pour creer des matrices):
pré: tab ** est déclarés, ligne et colonne sont initialisées et > 0
post: ligne et colonne sont inchangées, tab est initialisé
resultat: tab à été initialisé de nombres
*/
void remplirTab(int ** tab, int ligne, int colonne){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++)
tab[i][j] = rand() % 100;
}
}
/*
pré: tab ** est déclarés et initialisé , ligne et colonne sont initialisées et > 0
post: ligne, colonne et tab sont inchangés
resultat: le tableau à été afficher
*/
void afficherTab(int ** tab, int ligne, int colonne){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
printf("%3d ",tab[i][j]);
}
puts("");
}
}
/* Note: ne pas oublier de verif si la memoire allouer est null */
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 15/02/2014 à 22:41
Modifié par fiddy le 15/02/2014 à 22:41
Pour faire plus C, je te conseille de faire :
int ** matriceA, **matriceB, **matrice C;
Sinon tu mélanges code et déclaration.
Avec toutes les remarques que je t'ai dite sur ton premier code, je pense que ça doit fonctionner. En revanche, dans l'autre, tu as tenu compte de mes remarques mais tu as rajouté un bug :
/* Créer matriceB */
int ** matriceB = malloc(sizeof *matriceB *m); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
Dans for, tu as mis n et dans la déclaration de la matrice tu as mis m. Il faut que ça soit cohérent entre le code et la déclaration.
Cdlt,
Le Sniper ^^
int ** matriceA, **matriceB, **matrice C;
Sinon tu mélanges code et déclaration.
Avec toutes les remarques que je t'ai dite sur ton premier code, je pense que ça doit fonctionner. En revanche, dans l'autre, tu as tenu compte de mes remarques mais tu as rajouté un bug :
/* Créer matriceB */
int ** matriceB = malloc(sizeof *matriceB *m); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
Dans for, tu as mis n et dans la déclaration de la matrice tu as mis m. Il faut que ça soit cohérent entre le code et la déclaration.
Cdlt,
Le Sniper ^^
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
16 févr. 2014 à 00:41
16 févr. 2014 à 00:41
Merci pour tes remarques, mais à ce que je sache je me moque de personne, je ne fais qu'admirer ce que fait fréddy d'ailleurs mes deux messages son adresser à Freddy, et je te conseille de prendre en compte ces remarque, d'ailleurs il m'a fait une remarque qui m'a permis de ne pas donnée des sources fonctionnels bref.
Personnellement je suis plus apte à aider mais plus dans le domaine de programmation très bas niveau & hardware, d'algorithmes, programmation système & réseaux, sécurité & chiffrement que de tableau à deux dimensions ou l'utilisation de pointeur. bref voilà mais si tu veux que j'intervienne pourquoi pas et au passage je fais pas l'éloge de Freddy juste que c'est le sniper de comment ça marche Lol anti POSIX et Dieu du code portable voire prince de l'extrême programming
The sniper
Personnellement je suis plus apte à aider mais plus dans le domaine de programmation très bas niveau & hardware, d'algorithmes, programmation système & réseaux, sécurité & chiffrement que de tableau à deux dimensions ou l'utilisation de pointeur. bref voilà mais si tu veux que j'intervienne pourquoi pas et au passage je fais pas l'éloge de Freddy juste que c'est le sniper de comment ça marche Lol anti POSIX et Dieu du code portable voire prince de l'extrême programming
The sniper
Modifié par linquisiteur le 15/02/2014 à 14:34
Le but est par la suite faire des calculs, comparaison,.. sur des "matrices"
je ne comprend pas mon erreur j'avais déjà fait un programme dans le même genre..
p.s j'ai modifié mon programme et si je met tout dans le main je n'ai absolument aucun problème... Comment dois-je faire? Je crois que le passage main -> procédures ne fonctionne pas