Petit morpion en ascii

Résolu
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 - 7 déc. 2013 à 23:54
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 - 9 déc. 2013 à 19:25
Bonjour,
debutant en programation je cherche de l'aide affin de debuguer un petit programme en c.(pardonner mon orthographe je ne suis pas douer pour sa)

Le code complet ce trouve a la fin du msg j'ai join les dernier retour de dgb avant.

J'ai egalement commenter, voir trop, le programme pour s'implifier sa lecture.

J'ai bien passer un moment à le debuguer seul mais j'ai l'impression qu'à chaque fois que je le corrige l'erreure change de place .
Elle avance recule dans la meme fonction au debut c'etais l'ajout de "valeur" dans "Temp[v][h]" (voire code).
Maintenant sa a l'aire de venire de "joueur" je ni aie pourtant pas toucher ><.
J'ai essayer de voir si cela ne venais pas nom plus de l'affectation de mon tableau 2D en argument mais la manier dont je le fait ne change rien et l'initialisation s'effectue donc je l'ai garder meme ci j'en aver essayer d'autre apres je ne sais pas.

L'erreure ce siture au a ce niveaux d'apres le debugguer gdb (j'ai vu que la varible joueur n'etais pas à 0 mais pendant un moment elle fonctionner correctement --"):

void AditionMatrice(char Temp[a][a],int joueur,int v,int h)
{
	int valeur;
	
	if((joueur%2)==0)//determine a parti du joueur quelle valeur devra etre placer '1'pour 'A' et '2'pour 'B'
	{
		valeur=1;
	}
	else
	{
		valeur=2;
	}
	if (Temp[v][h]!=0)//verifie que l'emplacement est "vide"
	{
		printf("erreur recommencer");
		placement(Temp,joueur);//si ce n'est le cas elle l'indique et rapelle placement pour que le joueur (en cour) rentre une valeur posible
	}
	else
	{
		Temp[v][h]=valeur;//c'est la que le debug me dit que sa foire avec les coordoner on mes la valeur precedament determiner a c'est dite coordoner
	}
}

voici quelque information sur la distribution si sa peux aider :
3.7-trunk-amd64 #1 SMP Debian 3.7.2-0+kali8 x86_64 GNU/Linux

voici ce que me retourne le debugguer

msg gdb:

root@kali:~# gcc -w -g morpion.c -o morpion
root@kali:~# gdb ./morpion
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/morpion...done.
(gdb) run
Starting program: /root/morpion
-------
| | | |
-------
| | | |
-------
| | | |
-------
Joueur A
entrer votre positionement
5
erreur recommencer
entrer votre positionement
5
erreur recommencer
entrer votre positionement
5
erreur recommencer
entrer votre positionement
5
erreur recommencer
entrer votre positionement
5

Program received signal SIGSEGV, Segmentation fault.
0x00000000004009d6 in AditionMatrice (Temp=0x0, joueur=32767, v=1, h=1) at morpion.c:145
145 if (Temp[v][h]!=0)//verifie que l'emplacement est "vide"
(gdb) q
A debugging session is active.

Inferior 1 [process 14065] will be killed.

Quit anyway? (y or n) y

/* petit programme de morpion qui ne fonctionne pas pour le moment en affichage ascii*/

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

const int a=3;//taille de la matrice carre donc "a" est la valeur pour la longueur comme pour la lageur et est constante

int i,j;//mis en variable d'environnement car utiliser dans de nombreuse fonction plus simple de ne pas les oublier comme ça
			
int LireCiffre (void);//lire un chiffre (0a9)

void InitTableau2D (char Temp[a][a],int longueur, int largeur);//initialise le tableau a 0 

void placement (char Temp[a][a],int joueur);
/*s'occupe du placement du pion ('X'ou'O') dans le tableau il le prend donc le tableau en parametre ainsie que le joueur fera apelle a LireCiffre a AditionMatrice et a elle meme en cas d'erreur*/

void AditionMatrice (char Temp[a][a],int joueur,int v ,int h);
/*(au debut j'aditionner 2 matrice d'ou son nom) elle place le piont du joueur dans le tableau selon les coordoner v et h transmise par placement elle fait apelle a elle meme en cas d'erreur'*/

int VerifieVictoire (char Temp[a][a]);//verifie la victoire en comparent les alignement dans le tableau

void AffichageTable (char Temp[a][a]);//affiche le tableau de jeux avec des caractere ascii

int main (void)
{
	char table[a][a];//tableau de jeux
	int player;//variable entiere s'incrementant a chaque tour 
	char gagnant;//non du joueur 'A'ou 'B'
	
	InitTableau2D(table,a,a);

	player=0;//initialiser a 0 qui fait que le joueur "A commence"
	
	AffichageTable(table);//premiere affichage du tableaux de jeux vide
	
	do
	{
		if((player%2)==0)//fait que chaque joueur joue 1fois sur 2)
		{
			gagnant='A';
		}
		else
		{
			gagnant='B';
		}

		printf("Joueur %c",gagnant);//affiche a l'ecran le joueur en cour

		placement(table,player);//lance placement player est mis en argument pour determiner le joueur de la meme façons que precedament 

		AffichageTable(table);//affiche le tableaux apres sa modification
		
		if(VerifieVictoire(table)!=0)//affiche le gagnant que ci il y en a un
		{
			printf("Joueur %c gagne",gagnant);//gagnant ne change qu'apres incrementation de player di il a un gagnant se sera forcement celui en cour
		}
	
		player++;
	
	}while(gagnant!='O');//sortie de boucle pas encor etablis bug avant d'avoir eu besoin de le faire

	return 0;	
}

int LireCiffre(void)
{
	char chaine[1];

	return atoi(gets(chaine));//return directement le resulta de gets convertie pas atoi
}
void InitTableau2D(char Temp[a][a],int longueur, int largeur)
{
	for(i=0;i<longueur;i++)//initialisation des valeur du tableau par 2 for celon la longueur et largeur ici a 
	{
		for(j=0;j<largeur;j++)
		{
			Temp[i][j]=0;
		}
	}
}
void placement(char Temp[a][a],int joueur)//on place le pion avec en rapport avec le paver numerique exemple '7' pour en haut a gauche 
{
	printf("\nentrer votre positionement\n");

	switch  (LireCiffre())//celon le retour de LireCiffre le switch placera une valeur v et h (coordoner du placement) differente a AditionMatrice 
	{
	
		case 1:
			AditionMatrice(Temp,joueur,2,0);//exemple d'apelle d'adition matrice (les coordoner ne sont pas encor verifier juste placer au mieux possible)
		break;

		case 2:
			AditionMatrice(Temp,joueur,2,1);
		break;

		case 3:
			AditionMatrice(Temp,joueur,2,2);
		break;

		case 4:
			AditionMatrice(Temp,joueur,0,1);
		break;

		case 5:
			AditionMatrice(Temp,joueur,1,1);
		break;

		case 6:
			AditionMatrice(Temp,joueur,2,1);
		break;

		case 7:
			AditionMatrice(Temp,joueur,0,2);
		break;

		case 8:
			AditionMatrice(Temp,joueur,1,2);
		break;

		case 9:
			AditionMatrice(Temp,joueur,2,2);
		break;

		default: 
			printf("erreur ");
			placement(Temp,joueur);	// si il a une erreur placement ce relance apres l'avoir signialer
		break;
	}	
}
void AditionMatrice(char Temp[a][a],int joueur,int v,int h)
{
	int valeur;
	
	if((joueur%2)==0)//determine a parti du joueur quelle valeur devra etre placer '1'pour 'A' et '2'pour 'B'
	{
		valeur=1;
	}
	else
	{
		valeur=2;
	}
	if (Temp[v][h]!=0)//verifie que l'emplacement est "vide"
	{
		printf("erreur recommencer");
		placement(Temp,joueur);//si ce n'est le cas elle l'indique et rapelle placement pour que le joueur (en cour) rentre une valeur posible
	}
	else
	{
		Temp[v][h]=valeur;//c'est la que le debug me dit que sa foire avec les coordoner on mes la valeur precedament determiner a c'est dite coordoner
	}
}
int VerifieVictoire(char Temp[a][a])//verifie ci une ligne, une cologne ou une verticale est composer de la meme meme valeur 
{
	//les switch sont inutile je le sais 

	for(i=0;i<a;i++)//un seul for pour la verification on teste une ligne pui une cologne avec la meme valeur de i
	{
		if(Temp[i][0]==Temp[i][1]==Temp[i][2])//teste ligne 
		{
			switch  (Temp[i][0])//inutil vu que le gagnant n'est pas determiner pas cette fonction mais dans le main si celle ci return autre chose que 0
			{	
				case 1:
					return 1;
				break;

				case 2:
					return 2;
				break;
				default: 
					printf("erreur verife victoir \n");
				break;	
			}
		}
		else
		{
			if(Temp[0][i]==Temp[1][i]==Temp[2][i])//verifie cologne 
			{
				switch  (Temp[0][i])
				{	
					case 1:
						return 1;
					break;

					case 2:
						return 2;
					break;
					default: 
						printf("erreur verife victoir \n");
					break;	
				}
			}
		}
	}
	if(Temp[0][0]==Temp[1][1]==Temp[2][2])//verifie digonale 1
	{
		switch  (Temp[0][0])
		{	
			case 1:
				return 1;
			break;

			case 2:
				return 2;
			break;
			default: 
				printf("erreur verife victoir \n");
			break;	
		}
	}
	else
	{
		if(Temp[0][2]==Temp[1][1]==Temp[2][0])//verifie digonale 2
		{
			switch  (Temp[0][2])
			{	
				case 1:
					return 1;
				break;

				case 2:
					return 2;
				break;
				default: 
					printf("erreur verife victoir \n");
				break;	
			}
		}
	}
	return 0;	
}
void AffichageTable(char Temp[a][a])
{
	printf("-------\n");//affiche le haut du tableaux de jeux 

	for(i=0;i<a;i++)//avance sur les ligne 
	{
		printf("|");//affiche coter gauche

		for(j=0;j<a;j++)//s'occupe des cologne et de leur contenue
		{

			if(Temp[i][j]==0)
			{
				printf(" ");// affiche rien (espace) si vide (0)
			}
			else
			{
				if(Temp[i][j]==1)//si '1'donc joueur 'A'
				{
					printf("X");//qui a les croix
				}
				else
				{	
					if(Temp[i][j]==2)//si '2' donc joueur 'B'
					{
						printf("O");//qui a les rond
					}
				}
			}
			printf("|");//affiche ligne de separation des collone et bord droit 
		}
		printf("\n-------\n");//affiche ligne de separation des ligne ainsie que la fin du tableaux 
	}
}


merci d'avance^^.

8 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 8/12/2013 à 13:49
J'ai repris ton code, et j'ai corrigé l'ensemble des petits soucis. Ce n'était pas un souci particulier, mais plusieurs petits qui te provoquaient des problèmes.
Dans ton exemple, apparemment Temp était NULL d'après le débugger (Temp=0x0), raison du plantage. Je n'ai pas réussi à repoduire le bug. Es-tu sur d'avoir compilé le bon projet ?
J'ai aussi corrigé certaines fautes d'inattention (le fait que tu plaçais des éléments dans ton tableau à des positions identiques alors que le numéro donné était différent).

Compilé via:
gcc -W -Wall -std=c99 morpion.c

Code corrigé:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

static const int SIZE = 3;

void initTableau2D(char tab[SIZE][SIZE])
{
  for(int i = 0; i < SIZE; ++i)
    for (int j = 0; j < SIZE; ++j)
      tab[i][j] = ' ';
}

int lireChiffre(void)
{
  int nb = 0;
  bool stop = false;

  do
  {
    printf("Entrez votre positionnement: ");
    int res = scanf("%i", &nb);
    if (res != 1 || nb < 1 || nb > 9)
      printf("Nombre invalide !\n");
    else
      stop = true;
  }
  while (!stop);

  return nb;
}

bool placerPion(char tab[SIZE][SIZE], int joueur, int v, int h)
{
  char valeur = joueur == 1 ? 'X' : 'O';

  if (tab[v][h] != ' ')
  {
    printf("La case est déjà remplie !\n");
    return false;
  }

  tab[v][h] = valeur;
  return true;
}

void placement(char tab[SIZE][SIZE], int joueur)
{
  bool place = false;

  while (!place)
  {
    switch (lireChiffre())
    {
      case 1:
 place = placerPion(tab, joueur, 2, 0);
 break;
      case 2:
 place = placerPion(tab, joueur, 2, 1);
 break;
      case 3:
 place = placerPion(tab, joueur, 2, 2);
 break;
      case 4:
 place = placerPion(tab, joueur, 1, 0);
 break;
      case 5:
 place = placerPion(tab, joueur, 1, 1);
 break;
      case 6:
 place = placerPion(tab, joueur, 1, 2);
 break;
      case 7:
 place = placerPion(tab, joueur, 0, 0);
 break;
      case 8:
 place = placerPion(tab, joueur, 0, 1);
 break;
      case 9:
 place = placerPion(tab, joueur, 0, 2);
 break;
    }
  }
}

bool verifieVictoire(char tab[SIZE][SIZE], int joueur)
{
  char valeur = joueur == 1 ? 'X' : 'O';

  for (int i = 0; i < SIZE; ++i)
  {
    if (tab[i][0] == valeur && tab[i][1] == valeur && tab[i][2] == valeur)
      return true;

    if (tab[0][i] == valeur && tab[1][i] == valeur && tab[2][i] == valeur)
      return true;
  }

  if (tab[0][0] == valeur && tab[1][1] == valeur && tab[2][2] == valeur)
    return true;
  if (tab[0][2] == valeur && tab[1][1] == valeur && tab[2][0] == valeur)
    return true;

  return false;
}

void affichageTable(char tab[SIZE][SIZE])
{
  printf("-------\n");

  for (int i = 0; i < SIZE; ++i)
  {
    printf("|");
    for(int j = 0; j < SIZE; ++j)
      printf("%c|", tab[i][j]);
    printf("\n");
  }
  printf("-------\n");
}

int main(void)
{
  int joueur = 0;
  int tour = 0;
  char table[SIZE][SIZE];
  bool stop = false;

  initTableau2D(table);
  affichageTable(table);

  while (!stop)
  {
    joueur = (joueur + 1) % 2;
    printf("Joueur %i, ", joueur);

    placement(table, joueur);
    affichageTable(table);

    if (verifieVictoire(table, joueur))
    {
      printf("Joueur %i gagne !", joueur);
      stop = true;
    }
    ++tour;
    if (!stop && tour >= 9)
    {
      printf("Egalité !");
      stop = true;
    }
  }

  return 0;
}
4
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 déc. 2013 à 16:20
Je déconseille fortement à quiconque est intéressé par ce thread, de reprendre la version de alaxer.
C'est bizarre de reprendre mon code (qui est une correction propre du tien) pour y ajouter des mauvaises pratiques et des inélégances (voir des fonctions dépréciées qu'il faut éviter d'utiliser).

Quelques remarques:
- Une fonction commence par une minuscule.
- Une variable commence par une minuscule.
- On utilise scanf, mais pas "gets" qui est déprécié (surtout pour faire un atoi derrière, alors que scanf le fait proprement en vérifiant s'il est possible de récupérer la valeur).
- Tu réappelles des fonctions dans d'autres, sans raison. Je pense à "placement". Ne pas oublier que tu "stack" à chaque appel et que la taille de la stack n'est pas infini. Donc théoriquement, l'utilisateur ne peut pas se tromper à l'infini, car la taille de la pile débordera avant. C'est la raison pour laquelle, dans ma version, je retourne un booléen, et n'accumule pas les appels de fonctions récursives.
- Pourquoi pre-déclarer tes fonctions alors qu'il suffit de les mettre dans le bon ordre ? C'est très moche...
- Un nom de variable appelé "Temp" n'est pas très judicieux ni représentatif. C'est un nommage que l'on évite (tout comme "tmp", "temp", "essai", "test," etc...)
- Lors de la vérification de la victoire, je t'ai donné une méthode propre, et qui ne dépend pas de l'ordre dans lequel est appelé la fonction (donc moins risqué, et plus maléable). Le résultat d'une fonction ne doit pas dépendre de son lieu (ou son ordre) d'appel ! Tu as réussi à remettre l'ancienne version, qui est justement très mauvaise sur ce point là...
- La fonction d'affichage est inutilement compliqué. Pourquoi vérifier que tu as un 'O' pour afficher un 'O' au lieu de directement l'afficher ? C'est tout simplement inutile.
- Je ne détaille pas les nombreux endroits où la logique est un peu "lourde" (comme mettre "joueur = -1" parce qu'il y a un "joueur++" derrière...), se référer à mon code pour un "flux" plus propre.

peu etre pas la meilleur façon de coder mais c'est la mienne pour le moment
Tu ne progresseras pas si tu fais à ta "sauce". Pour progresser, il faut assimiler les conseils que l'on te donne, et non les ignorer.
Quand on débute, on ne peut pas tout faire bien dès le départ. C'est donc normal de poster un code imparfait. En revanche, quand on te le corrige, la bonne réaction est de comprendre et d'assimiler, et non de s'entêter sur une manière que l'on sait mauvaise. (Ou alors le garder pour soi, et éviter de poster ce code en le déclarant correct, afin d'éviter qu'un débutant qui passe par là, ne reprenne ton code).
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 déc. 2013 à 02:04
Bonjour.

Je te répond demain, car il est tard ^^, et ma réponse sera longue (il y a beaucoup de petits soucis).

En vrac:
- Regarde déjà du côté des "Temp[i][0]==Temp[i][1]==Temp[i][2]" qui sont des constructions fausses (on ne peut comparer que 2 choses en même temps).
- Active bien tous les warnings (-W majuscule et non -w minuscule dans gcc).
- Utilise "scanf" au lieu de "LireChiffre"
- Jamais de variables globales (i et j doivent être locale)

Je testerai ça proprement demain.
1
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 2
8 déc. 2013 à 13:42
Un grand merci à toi ^^
Je vais essayer de remetre le code a ma sauce maintenant qu'il fonctionne.
1

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

Posez votre question
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 2
8 déc. 2013 à 15:45
mercie encor à toi cptpingu ^^
j'envoie le code a ma sauce au ca ou sa interesse fonctionelle sans warning et faisant ce que je veux ( enfin il m'affiche pas de warning et j'ai peux etre pas vu tout les bug mais bon --")

ps: j'ai virer les booleen je sais mais bon peu etre pas la meilleur façon de coder mais c'est la mienne pour le moment


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

static const int SIZE = 3;

void InitTableau2D(char Temp[SIZE][SIZE]);
void placement(char Temp[SIZE][SIZE],int joueur);
void placerPion(char tab[SIZE][SIZE], int joueur, int v, int h);
int VerifieVictoire(char Temp[SIZE][SIZE]);
void AffichageTable(char Temp[SIZE][SIZE]);
int LireCiffre(void);


int main(void)
{
  int joueur = 0;
  char gagnant;
  char table[SIZE][SIZE];

  InitTableau2D(table);
  AffichageTable(table);

	do
	{
		if((joueur%2)==0)
		{
			gagnant='A';
		}
		else
		{
			gagnant='B';
		}		
		if(joueur==9)
		{
			printf("\negaliter\n");
			printf("continuer? O/n ?");
			if(getchar()=='O'||'\n'||'o')
			{
				gagnant='N';
				InitTableau2D(table);
				AffichageTable(table);
			}
			else
			{
				gagnant='O';
			}
		}
		else
		{
			printf("Joueur %c",gagnant);
			placement(table,joueur); 
			AffichageTable(table);

			if(VerifieVictoire(table)!=0)
			{
			
				printf("\nJoueur %c gagne\n",gagnant);

				printf("continuer? O/n ?");
				if(getchar()=='O'||'\n'||'o')
				{
					gagnant='N';
					joueur=-1;
					InitTableau2D(table);
					AffichageTable(table);
				}
				else
				{
					gagnant='O';
				}
			}
		}
		joueur++;
	}while(gagnant!='O');

	return 0;
}

int LireCiffre(void)
{
	char chaine[1];
	int nb;

	gets(chaine);
	nb=atoi(chaine);


	return nb;
}
void InitTableau2D(char Temp[SIZE][SIZE])
{
	int i,j;
	for(i=0;i<SIZE;i++)
	{
		for(j=0;j<SIZE;j++)
		{
			Temp[i][j]=' ';
		}
	}
}
void placement(char Temp[SIZE][SIZE],int joueur) 
{
	printf("\nentrer votre positionement\n");
	switch  (LireCiffre()) 
	{
	
	      case 1:
		placerPion(Temp, joueur, 2, 0);
		break;
	      case 2:
		placerPion(Temp, joueur, 2, 1);
		break;
	      case 3:
		placerPion(Temp, joueur, 2, 2);
		break;
	      case 4:
		placerPion(Temp, joueur, 1, 0);
		break;
	      case 5:
		placerPion(Temp, joueur, 1, 1);
		break;
	      case 6:
		placerPion(Temp, joueur, 1, 2);
		break;
	      case 7:
		placerPion(Temp, joueur, 0, 0);
		break;
	      case 8:
		placerPion(Temp, joueur, 0, 1);
		break;
	      case 9:
		placerPion(Temp, joueur, 0, 2);
		break;
	     default: 
			printf("erreur ");
			placement(Temp,joueur);
		break;
	}	
}
void placerPion(char tab[SIZE][SIZE], int joueur, int v, int h)
{
  char valeur;

  if((joueur%2)!=0)
  {
    valeur='O';
  }
  else
  {
    valeur='X'; 
  }
  if (tab[v][h] != ' ')
  {
    printf("La case est déjà remplie !\n");
    placement(tab,joueur);
  }
  else
  {
    tab[v][h] = valeur;
  }
}
int VerifieVictoire(char Temp[SIZE][SIZE])
{

	int i;
	for(i=0;i<SIZE;i++)
	{
		if((Temp[i][0]==Temp[i][1])&&(Temp[i][1]==Temp[i][2])&&(Temp[i][1]!=' '))
		{
			return 1;
		}
		else
		{
			if((Temp[0][i]==Temp[1][i])&&(Temp[1][i]==Temp[2][i])&&(Temp[1][i]!=' '))
			{
				return 1;
			}
		}
	}
	if((Temp[0][0]==Temp[1][1])&&(Temp[1][1]==Temp[2][2])&&(Temp[1][1]!=' '))
	{
		return 1;
	}
	else
	{
		if((Temp[0][2]==Temp[1][1])&&(Temp[1][1]==Temp[2][0])&&(Temp[1][1]!=' '))
		{
			return 1;
		}
	}
	return 0;	
}
void AffichageTable(char Temp[SIZE][SIZE])
{
	
	int i,j;

	printf("-------\n");

	for(i=0;i<SIZE;i++)
	{
		printf("|");

		for(j=0;j<SIZE;j++)
		{

			if(Temp[i][j]==' ')
			{
				printf(" ");
			}
			else
			{
				if(Temp[i][j]=='X')
				{
					printf("X");
				}
				else
				{	
					if(Temp[i][j]=='O')
					{
						printf("O");
					}
				}
			}
			printf("|");
		}
		printf("\n-------\n");
	}
}
1
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 2
9 déc. 2013 à 18:03
Je n'ai jamais dit que le code que je poster etais correcte >< mais fonctionelle il fait ce que je voulais de lui.
le fait de les refaire a ma sauce etais justement pour bute de mieux assimiler le code ( c'est pas mechant mais tu n'a pas vraiment expliquer ton code).
Ensuite on a tous nos maniere de coder mais je concidere que juste reprendre un code sans essayer de sens servire pour reecrire son code fait que meme si on la compris a la fin on utilise pas son code meme si sa inclue d'avoir une version "moche" ou imparfaite.
Apres le fait de declarer mes fonction en premier vien de comment j'ai apris a coder et du fait que je trouve sa plus claire ( l'hestetique n'ai pas forcement un sujet à d'ebatre meme si sa "alourdie" le code en rajoutant des ligne) mais je trouve que lire le main en premier permet de voir la logique et comment seron utiliser les fonction apres c'est mon avis.
Ensuite les recurtion et imbriquation son voulu meme si elle ne sont pas interessante voir meme deconseiller dans ce cas si on suis tes precision (bien faut le faire expres comme tu la dit).Je voulais juste tester de me servire de ces dernierre.
Je sais qu'il est pas "bien" mais il fait se que je voulais de lui ensuit oui pour l'affichage j'ai pas du tout fais gaffe ><merci.
Et pour la syntaxe (minuscule majuscule) je te remercie je vais en tenire conte.
Pour le nom Temp sa vien que j'ai pas d'imagination pour les nom mais ok a eviter compris^^.
Enfin voila je l'avais poster pour se que sa interesser et pour montrer se que j'avais fait apres la resolution voir se que les gens pouvais en pencer. Et je suis limite contemp que tu me recorrige car j'ai plus de precision sur certaine de mes erreu (syntaxique par exemple) car le "pour le moment" etais la bien pour preciser que pour l'instant je code comme sa dans l'espoir de m'ameliorer apres mais bon il y a encor de la route à suivre .
Ensuite de fonction d'eprecier sa depand par qui et pourquoi enfin bon zapon.
Et tu conseille a quiquonque interesser pas se thread de reprendre ma version --" (merci on diret que je suis en cour de français et que la prof fait tourner des photocopie de mes dictée pour faire corriger mais erreur (oui sa ma pas fait m'ameliorer en orthographe dsl)) .
Je tien a preciser encor une fois que je sais qu'il et pas genial et que la logique et loude mais j'aie pas non plus dit que j'avais passer 5 H dessu a tout optimiser lisser mon main et long pas exemple pour pas grand chose ect enfin il y a plein de defaut et j'aurais peut etre du passer plus de temp dessu avant de le poster d'accord.
Enfin voila c'etais pour me justifier de certaine erreure ou particulariter du code ( je pence au recursion en cas d'erreure) et remercier pour certaine corection ou remarque de lourdeur meme ci je le saver pour certaine et que d'autre je me sens idiot de pas les avoir remarquer.
msg long de ma par pour pas grand chose je crois .
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 9/12/2013 à 18:42
le fait de les refaire a ma sauce etais justement pour bute de mieux assimiler le code
Je ne critique pas la démarche du "je refait à ma sauce pour comprendre", qui est louable (Si ne serait-ce que 10% des visiteurs de ce site en faisant autant que toi, ça serait vraiment génial !). Ce qui n'est pas terrible, c'est que la formulation laisse penser que c'est une bonne version. Ce n'est malheureusement pas le cas. Pour bien préciser, la démarche est bien évidemment bonne, et je ne la critique pas. Mais étant sur un site de débutant, ça créer une ambiguïté accentué par le fait que ta réponse était la dernière (et un débutant n'y connaissant rien, va sauter, à tort, sur la dernière réponse).

(c'est pas mechant mais tu n'a pas vraiment expliquer ton code).
Il suffit simplement de demander des précisions. Je ne peux pas deviner ce qui n'est pas clair pour toi, mais je peux t'expliquer n'importe quel point sans souci.

Apres le fait de declarer mes fonction en premier vien de comment j'ai apris a coder et du fait que je trouve sa plus claire
L'ordre deviendra plus important pour "ranger" tes fonctions plus tard. Notamment quand tu découperas tes fonctions dans des fichiers (et que tu voudras limiter la portée d'utilisation de celle-ci, notion que tu découvriras plus tard) ou que tu auras des soucis de "forward declaration" (en gros de dépendances circulaires). Bien comprendre que l'ordre à une importance, et prendre l'habitude de l'utiliser, te servira plus tard. D'ou mon "c'est moche", car tu verras vite que c'est une pratique que tu abandonneras rapidement. D'un point de vue technique, ce n'est bien évidemment pas une erreur, et c'est complètement équivalent.

Ensuite de fonction d'eprecier sa depand par qui et pourquoi enfin bon zapon.
Déprécié (deprecated en anglais) ne veut pas dire: "Des gens trouvent ça moche", mais "La fonction est considérée comme obsolète, son utilisation pose problème, et cette fonction a vocation a offciellement disparaître dans les prochaines versions". C'est par exemple le cas de "gets", qui ne fait aucune vérification de débordement, et augmente sensiblement les risques de "plantage". C'est la fonction préférée des experts en sécurité car elle est source de grosse faille logiciel, ce qui les arrange bien ^^. Cette fonction va disparaître dans la prochaine version "C11" (déjà utilisable d'ailleurs).
Si tu lis l'anglais, il y a une très bonne explication bien détaillée, de pourquoi il faut absolument l'éviter: http://stackoverflow.com/questions/7423691/is-gets-officially-deprecated

Et tu conseille a quiquonque interesser pas se thread de reprendre ma version
C'est l'inverse en fait, je le déconseille. Comme déjà expliqué, je suis obligé de le faire, puisqu'un débutant ne peut pas faire la différence entre ce qu'il faut faire et éviter.
0
alaxer Messages postés 5 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 9 décembre 2013 2
9 déc. 2013 à 19:25
ok dacc et dsl j'amais mal lu en fait lu >< conseille au lieu de deconseille mais je lavais pris dans le sance pas bon enfin dsl
Pour la fonction gets c'est justement que je sais pas toujour sur quoi me fier vu qu'il en a pour et d'autre contre apres je le saver pour les debordement mais bon j'avais envie de m'en servire pour pas l'oublier mais ci elle et destiner a disparetre je crois que je vais l'oublier.
ensuite pour les explication bizarment je lie et comprend mieux le code que je ne le tappe le seul vrais probleme de compreenssion que j'aivais eu je l'avais repreciser enfin voila en tout cas merci et a toi et dsl ci j'ai porter a confusion mais je pencer bien faire en repostant mon code voila ^^
0
Rejoignez-nous