Pointeur à 2 dimension?
linquisiteur
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
Bonjour, je cherche a faire passer un tableau à 2 dimension a taille qui sera définie par l'utilisateur donc meilleur solution utilisé des pointeurs. Mais à chaque exécution mon programme plante..
Je ne trouve pas pourquoi donc je viens vous demandez de l'aide ;)
merci d'avance:
Voila, merci encore.
Les logs me retourne ceci:
Process terminated with status -1073741819 (0 minutes, 7 seconds)
Je ne trouve pas pourquoi donc je viens vous demandez de l'aide ;)
merci d'avance:
#include<stdlib.h>
#include <stdio.h>
#include <time.h>
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, le tableau sera créer ici ! */
int* *matriceA = malloc(sizeof(int *) *n); /* pour créer des lignes (n) */
for(k=0;k<n;k++)
*(matriceA + k) = malloc( sizeof(int)*m); /* pour chaque ligne n faire m colonnes */
remplirTab(matriceA, n, m);
afficherTab(matriceA, n, m);
free(matriceA);
char z = 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 aléatoires <=0 <100
*/
void remplirTab(int ** tab, int ligne, int colonne){
srand(time(NULL));
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("");
}
}
Voila, merci encore.
Les logs me retourne ceci:
Process terminated with status -1073741819 (0 minutes, 7 seconds)
A voir également:
- Pointeur à 2 dimension?
- Supercopier 2 - Télécharger - Gestion de fichiers
- Dimension a5 - Guide
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Dimension bbox must - Accueil - Guide box et connexion Internet
2 réponses
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.
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,
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 */
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 ^^
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
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