Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 22h42   #1
lucci57
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 0
Points : 0
Par défaut Tableau à deux dimensions

es-ce que quelqu'un peut m’éclaircir cet question :

Demander a l'utilisateur de saisir les dimensions d'un tableau a deux dimensions.

ces dimensions pourront etre stockées dans deux pointeurs de type entier (int  *L et int  * C) que l'on passe en parametre de la fonction.

j'ai essayer avec le code suivant,le compilateur ne détecte aucune faute ,mais le programme ne marche pas correctement.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<conio.h>
 
void saisie (int *l,int *c);
 
int main()
{
    int *ligne,*colonne;
 
    saisie(ligne,colonne);
    printf("%d\t%d\n",*ligne,*colonne);
    getch();
}
 
 
void saisie (int *l,int *c)
{
     printf("Entrez le nombre de ligne:");
     scanf("%d",l);
     printf("Entrez le nombre de colonne:");
     scanf("%d",c);
}
lucci57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 23h18   #2
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 437
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 437
Points : 12 977
Points : 12 977
Citation:
ces dimensions pourront etre stockées dans deux pointeurs de type entier (int  *L et int  * C) que l'on passe en parametre de la fonction.
C'est du charabia : On ne peut stocker les dimensions dans des pointeurs qui sont des objets destinés à stocker uniquement des adresses.

Proposition plus correcte :
les dimensions pourront être stockées dans deux objets de type entier (int L et int C) dont on passera l'adresse à la fonction

Conséquence :
Code :
1
2
3
4
5
6
7
8
int main(void)
{
    int ligne,colonne;
 
    saisie(&ligne,&colonne);
    printf("%d\t%d\n",ligne,colonne);
    getch();
}
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 21/01/2013, 18h56   #3
noname120
Nouveau Membre du Club
 
Homme
autre
Inscription : décembre 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : autre
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 22
Points : 25
Points : 25
Et puis après tu fais un malloc(sizeof(int)*taille_ligne*taille_colonne);

Après tu cast ton pointeur et c'est bon.
noname120 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2013, 23h50   #4
H4RDW4RE
Invité de passage
 
Inscription : juin 2009
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 6
Points : 2
Points : 2
En gros :

Code :
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
38
39
40
 
#include <stdio.h>
#include <stdlib.h>
 
void saisie(int *val,const char *nom);
 
int main() {
  int ligne, colonne, i, j;
  int **mat;
  saisie(&ligne,"Ligne");
  saisie(&colonne,"Colonne");
 
  // Alloc mémoire et initialisation a zero
  mat = (int**)malloc(ligne * sizeof(int*));
  for (i = 0 ; i < ligne ; i++) {
    mat[i] = (int*)malloc(colonne * sizeof(int));
  }
 
  // Initialisation
  for (i = 0 ; i < ligne ; i++) {
    for (j = 0 ; j < colonne ; j++) {
      mat[i][j] = 0;
    }
  }
 
  // Affichage
  for (i = 0 ; i < ligne ; i++) {
    for (j = 0 ; j < colonne ; j++) {
      printf("%d\t", mat[i][j]);
    }
    printf("\n");
  }
  return 0;
}
 
 
void saisie(int *val,const char *nom) {
  printf("%s : ", nom);
  scanf("%d", val);
}

Après c'est un exemple simple, mais ça peut te donner une idée...
H4RDW4RE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2013, 01h12   #5
Ngork
Membre chevronné
 
Homme
Auditeur informatique
Inscription : avril 2009
Messages : 118
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Auditeur informatique
Secteur : Finance

Informations forums :
Inscription : avril 2009
Messages : 118
Points : 650
Points : 650
Par défaut Code "bizarre" ?

Citation:
Envoyé par lucci57 Voir le message

j'ai essayer avec le code suivant,le compilateur ne détecte aucune faute ,mais le programme ne marche pas correctement.
Je ne sais pas avec quelles options tu as compilé ton code, mais sans doute avec le minimum de contrôle, car une compilation avec gcc (ici, dans Code::Blocks) et l'option -Wall m'a fourni le commentaire suivant :

Citation:
||=== test, Debug ===|
test/main.c||In function ‘main’: |
test/main.c|13|attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]|
test/main.c|10|attention : ‘ligne’ is used uninitialized in this function [-Wuninitialized]|
test/main.c|10|attention : ‘colonne’ is used uninitialized in this function [-Wuninitialized]|
||=== Build finished: 3 errors, 0 warnings ===|
Ce qui est en soit l'indication d'un problème !

Toutefois, il faut peut-être relativiser le terme charabia :

En effet, il te suffit d'initialiser tes pointeurs, en leur attribuant une véritable adresse mémoire à même de stocker un ou plusieurs int, et il n'y aura plus de problème, par exemple en modifiant ton code a minima :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
void saisie (int *l,int *c);
 
int main()
{
    int ll,cc;
    int *ligne=&ll,*colonne=&cc;
 
    saisie(ligne,colonne);
    printf("%d\t%d\n",*ligne,*colonne);
    getchar();
 
    return 0;
}
 
 
void saisie (int *l,int *c)
{
     printf("Entrez le nombre de ligne:");
     scanf("%d",l);
     printf("Entrez le nombre de colonne:");
     scanf("%d",c);
}
Donc ton code peut être correct si les deux pointeurs sont initialisés (tu peux aussi le faire avec deux malloc), mais c'est vraiment une idée bizarre de faire comme ça plutôt que passer directement les adresses des entiers à la fonction de saisie, ce qui est la méthode usuelle que t'expose simplement et fort justement diogene.
Si ton idée "bizarre" se justifie par une raison cohérente (que je ne vois a priori pas), alors ce n'est pas du charabia, sinon, c'est que la notion de pointeur n'est peut-être pas ta spécialité et ton code est bien du charabia !

Alors, qu'en est-il ?
Charabia or not charabia ?
Ngork est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h48.


 
 
 
 
Partenaires

Hébergement Web