Procédure en c

Résolu/Fermé
Linquisiteur - 1 avril 2013 à 20:47
 Linquisiteur - 12 avril 2013 à 12:53
Bonjour, je suis actuellement en train de travailler sur les procédure en c mais j'ai un peu de mal.. Dans mon code ci dessous je ne sais pas si je dois mettre return ou non et en argument un pointeur de tab ou non... J'ai essayer toute les possibilité possibilité sans succes...
Le principe est simple j'entre un nombre de ligne et un nombre de colonne et je créé un tableau a 2 dimension rempli du char O puis une fois créé le lis .

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

int colonne = 8;
int ligne = 7;
char grille[colonne][ligne];
RemplirTab(grille,colonne,ligne);
LireTab(grille,colonne,ligne);
return 0;
}

void RemplirTab(char*tab,int i,int j){
int cpt_i=0;
int cpt_j=0;
    while (cpt_j < j){
          while (cpt_i < i){
          tab[i][j]='O';
          cpt_i++;
          }
    cpt_j++;
    cpt_i=0;
    }
 //return (tab);
}

void LireTab (char *tab,int i,int j){
int cpt_i=0;
int cpt_j=0;
    while (cpt_j < j){
          while (cpt_i < i){
          printf("%c",tab[i][j]);
          cpt_i++;
          }
    puts("");
    cpt_j++;
    cpt_i=0;
    }
 //return (tab);
}



P.S je me demandais y a t'il une importance dans le positionnement de la procédure?

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 avril 2013 à 22:02
Bonjour,

Pas de return tab; puisque tes fonctions (procédures n'existent pas en C) ne retournent rien (void fonction()).

int colonne = 8;
int ligne = 7;
char grille[colonne][ligne];

En C, il faut initialiser statiquement (ou dynamiquement avec les matrices, il existe une troisième méthode mais je ne préfère pas compliquer les choses). Il faut donc passer par :
/*à mettre après les #define*/
#define NBCOL 8
#define NBLIG 7

/*dans le code*/
char grille[NBLIG][NBCOL];

/*pour appeler la fonction*/
RemplirTab(tab, NBLIG, NBCOL);


Ton tableau est une matrice, il faut donc passer les deux dimensions. Exemple : void remplirTab(char tab[][NBCOL],int i,int j)

while (cpt_j < j){
while (cpt_i < i){

C'est correct, mais inhabituel. Usuellement, on fait plutôt :
void remplirTab(char tab[][NB_COL], int nbLig, int nbCol) {
     int i;
     for(i=0, i < nbLig; i++) {
          int j;
          for (j=0; j < nbCol; j++)
              tab[i][j]='O';
     }
}

Ou tout simplement : memset(tab, 'O', sizeof tab); à mettre dans le main().

puts("");
Parfaitement bon, mais autant faire : putchar('\n'); c'est plus "parlant".
1
Merci de ta réponse :)
J'ai améliorer la structure de mon code avec des for comme tu me l'as montrer mais j'ai un problème il me disent j undeclared..
J'ai bien sure un int j avant le for (j'ai essayer le code que tu m'a proposer pour voir et j'ai aussi le même problème..) Si tu as une idées ..; ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 avril 2013 à 22:57
T'as dû oublier un j quelque part.
Montre ton code qu'on voit les changements :-).
0
Voila:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Remplire un tableau de dimension x,y */
void remplirTab(char tab[][], int x, int y) {
     int i;
     for(i=0, i < x; i++) {
          int j;
          for (j=0; j < y; j++){
              tab[i][j]='O';
          }
     }
}

/* Lire le tableau de dimension x,y */
void LireTab (char tab[][],int x,int y){
 int i;
     for(i=0, i < x; i++) {
          int j;
          for (j=0; j < y; j++)
          {
          printf("%c",tab[i][j]);
          }
      puts("");
     }
}

int main(void)
{
    
int colonne = 8;
int ligne = 7;
char grille[colonne][ligne];
RemplirTab(grille,colonne,ligne);
LireTab(grille,colonne,ligne);
return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 avril 2013 à 23:04
T'as pas tenu compte de toutes mes remarques.
int colonne = 8;
int ligne = 7;
char grille[colonne][ligne];

Ce n'est pas bon ça.

void remplirTab(char tab[][], int x, int y) {
Ce n'est pas bon ça. Il faut faire comme j'ai dit : void remplirTab(char tab[][8], int x, int y) ou tu remplaces le 8 par NBCOL (#define NBCOL 8)
0
Vraiment désoler mais je n'y arrive pas..
J'avais créé des tableau certe inserer directement dans le main mais jamais avec des #define

Voici ce que sa donne :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nb_colonne 8
#define nb_ligne 7

/* Remplire un tableau de dimension x,y */
void remplirTab(char tab[][nb_colonne], int colonne, int ligne) {
     int i;
     for(i=0, i < colonne; i++) {
          int j;
          for (j=0; j < ligne; j++){
              tab[i][j]='O';
          }
     }
}

/* Lire le tableau de dimension x,y */
void LireTab (char tab[][],int colonne,int ligne){
 int i;
     for(i=0, i < colonne; i++) {
          int j;
          for (j=0; j < ligne; j++)
          {
          printf("%c",tab[i][j]);
          }
      puts("");
     }
}

int main(void)
{
int colonne = 8;
int ligne = 7;
char grille[nb_colonne][nb_ligne];
RemplirTab(grille,nb_colonne,nb_ligne);
LireTab(grille,colonne,ligne);
return 0;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 avril 2013 à 00:06
for(i=0, i < colonne; i++) {
T'as recopié mon code (mais il contenait une erreur ^^).
Un for, c'est : for(i=0;i<colonne;i++)
Il faut le corriger pour l'autre for dans la fonction LireTab()

void LireTab (char tab[][],int colonne,int ligne){
Toutes les remarques faites sur la fonction remplirTab() s'applique pour LireTab(). Je te laisse corriger.

Cdlt,
0
rebonjour, j'ai remodifier mais encore une erreur inconnue ..

puissance4.c: In function 'main':
puissance4.c:49: warning: passing arg 1 of 'RemplirTab' from incompatible pointer type
puissance4.c:50: warning: passing arg 1 of 'LireTab' from incompatible pointer type


J'ai tenter de faire passer les tableau en pointeur mais sans succès..

De plus je ne vois pas ce que je fait passer qui n'est pas identique..

RemplirTab(grille,nb_colonne,nb_ligne);
LireTab(grille,nb_colonne,nb_ligne);

void RemplirTab(char tab[][nb_colonne], int colonne, int ligne)
void LireTab (char tab[][nb_colonne],int colonne,int ligne)


Merci d'avance..
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 avril 2013 à 21:03
Sans code, je suis aveugle. Montre ton code :-).
0
Oups désoler ^^"



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nb_colonne 8
#define nb_ligne 7

/* Remplire un tableau de dimension x,y */
void RemplirTab(char tab[][nb_colonne], int colonne, int ligne) {
     int i;
     for(i=0; i < colonne; i++) {
          int j;
          for (j=0; j < ligne; j++){
              tab[i][j]='O';
          }
     }
}

/* Lire le tableau de dimension x,y */
void LireTab (char tab[][nb_colonne],int colonne,int ligne){
 int i;
     for(i=0; i < colonne; i++) {
          int j;
          for (j=0; j < ligne; j++)
          {
          printf("%c",tab[i][j]);
          }
      puts("");
     }
}


int main(void)
{
    
    
int colonne = 8;
int ligne = 7;
char grille[nb_colonne][nb_ligne];
RemplirTab(grille,nb_colonne,nb_ligne);
LireTab(grille,nb_colonne,nb_ligne);

return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 avril 2013 à 21:41
Erf, la stupide erreur que j'ai pas vue (mais que t'aurais pu voir ;-)) :
char grille[nb_colonne][nb_ligne];
C'est : char grille[nb_ligne][nb_colonne];
Et tout devrait rentrer dans l'ordre. D'ailleurs, tu peux supprimer : int colonne=8; int ligne=7; c'est inutile maintenant :-).
0
ben en fait j'avais prévu de m'en servir pour la suite du code.. les #define je n'ai jamais utiliser..
Bien que j'avais déjà vu une fois y a t'il moyen d'envoyer les tableau sans redonner la taille a chaque fois? Car je vais devoir appeler ce tableau la mainte et mainte fois dans la suite..
Sinon oui je vais corriger de ce pas :)
Merci beaucoup
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 avril 2013 à 22:19
Beh oui, c'est possible. Tu changes le prototype :
Par exemple : void fct(char tab[][NB_COLONNE]) comme ça pour l'appeler : fct(grille); tout simplement.
0
J'avance dans le programme, mais j'ai dans une fonction un endroit ou je ne fais que tourner en rond..
puts("Entrez le numero de la colonne: ");
      while(numero<1 || numero>8){
                     while (numero=getchar ()!= '\n' && numero!= EOF);
       scanf("%[^\n]d",&numero);
      // scanf("%d",&numero);
      //numero = getchar();
      puts("3");
      }


Comme vous-pouvez le voir j'ai sortis tout mon arsenal des moyen d'impression de caractère.. j'ai tout mixer dans tous les sens mais rien n'y fait je retombe toujours à devoir entrer 2 chiffres pour passer par puts("3");

Le: while (numero=getchar ()!= '\n' && numero!= EOF); c'est moche mais ces tout ce que j'ai trouver pour empêcher de boucler ><'

ce morceau de code est dans une fonction non paramétré qui retourne numero mais le problème se trouve surement dans ce petit morceau de code ...
0
up*
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 avril 2013 à 20:56
A travers ce code, je sens que t'as pas compris ce que tu as fait ^^.
Je décompose
while(numero<1 || numero>8){
Attention, numero n'est pas initialisé. Il faut qu'il soit initialisé avant de le comparer.
while (numero=getchar ()!= '\n' && numero!= EOF);
Attention, à bien mettre : (numero=getchar()) entre parenthèse.
Cette ligne permet de vider le buffer clavier. Mais, il ne faut surtout pas au moyen de la variable numero. Sinon getchar() vaut '\n'. Même si tu as refait un scanf() derrière, ce n'est pas clair.

Je te donne une façon plus claire :

int numero=0;
while (numero<1 || numero >8) {
      int c;
      puts("Entrez le numero de la colonne: ");
      scanf("%d",&numero);
      while ((c=getchar ())!= '\n' && c!= EOF);
}

Cdlt,
0
Encore une fois merci :)
Je n'avais pas du tout penser a cette manière de mettre les parenthèse. J'avais bien évidemment initialisé numero mais je ne l'avais pas copier. Désoler de mon nombre incroyable de question mais j'avais revu tout mon syllabus et fait des recherches sur internet sans succès.
Le point positif est que pour le moment tout mon pseudo code est bon :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 avril 2013 à 21:24
Ne sois pas désolé, le forum est là pour ça ! :-)
0
et j'en suis bien heureux ^^
J'ai déjà créé plein de tableau mais je n'avais jamais utiliser les #define colonne 8 tout comme j'ai déjà utiliser pas mal de fois getchar sans rajouter les parenthèses. J'ai l'impression que les procédures complique tout le code.. mais bon j'ai assimiler le principe. Le but final est de créé un puissance 4 et je compte bien faire étape par étape pour ne pas avoir un foutoir à la fin comme à mon dernier labo de java ou toute mes méthode était fonctionnelle mais une nuit entière ne m'as pas suffi à les imbriquées correctement .. résultat j'ai pas hâte de voir ma note..
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 avril 2013 à 21:58
Quand on débute, on ne voit pas toujours l'intérêt des fonctions.
Tu peux te dire que cela permet la réutilisation du code dans la suite du programme sans faire un copier coller. Cela facilite par la suite le maintien du programme et la mise à jour. Imagine si tu travailles sur un projet avec d'autres collègues :-).
Et un autre conseil, pendant que tu fais tes fonctions, n'oublie pas de les commenter petit à petit. C'est long, c'est fastidieux, mais indispensable (pour la note aussi ;-))
Bon courage.
0