Affichage tableau char en C

maxou224 Messages postés 5 Date d'inscription lundi 6 octobre 2008 Statut Membre Dernière intervention 2 juin 2010 - 26 mars 2009 à 21:19
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 mars 2009 à 19:56
Bonjour, je suis en DUT informatique et je dois rendre en fin d'année un programme de bataille navale en C, seulement je suis coincé sur un drôle de problème ! La plupart des gens de ma promo ne comprennent pas aussi ( on est en 1er année aussi ) j'espère que vous pourrez m'aider.

J'aimerais initialiser mon tableau "jeu1[10][10]" à  '#' mais il m'indique une erreur quand je le lance :

void Raz(char jeu1[10][10]) //remise à zéro
{
    int i,j;
    for (i=0;i<=10;i++)
    {
        for (j=0;j<=10;j++)
        {

            jeu1[i][j]='#';

        }
    }

}

Pourtant tout est bon non ? Le bug vient de la ligne de commande " jeu1[i][j]='#'; "

11 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 00:21
char jeu1[10][10];
quand on a 10 éléments comme ici, on peut itérer du 0 au 9 qui est le DERNIER.
donc: for(i = 0; i < 10; i++)
et non pas <=

On aura donc:
for(i=0; i < 10; i++) {
  for(j = 0; j < 10; j++) {
    jeu1[i][j] = '#';
  }
}

en version rapide (100 octets = 25*4)
on fera 25 tours au lieu de 100:
unsigned int *puint;
int n;
n = 24; // tendre vers 0 pour supprimer la comparaison à chaque tour
puint = (unsigned int*) jeu1;
do {
  puint[n] = '####';
} while(--n >= 0);

ciao...
BruNews, MVP VC++
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
27 mars 2009 à 10:08
Une version encore plus rapide :

memset(jeu,'#',100);

ed73
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 12:43
plus rapide .... à écrire.

ciao...
BruNews, MVP VC++
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
27 mars 2009 à 14:01
Et aussi à exécuter
Et également à comprendre pour quelqu'un qui devrait maintenir ce code
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 15:17
Explique moi donc en quoi serait plus rapide à exécuter.

ciao...
BruNews, MVP VC++
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
27 mars 2009 à 15:47
memset étant une fonction de bas niveau, on peut raisonablement supposer que son code est optimisé.
 
Pour en être certain on peut exécuter N fois mon code et le tien et voir le temps que ça prend. N étant suffisament grand pour observer une différence significative.

ed73

 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 18:07
"on peut raisonablement supposer ..."
Il faut laisser les croyances dans les lieux de culte, elles n'ont rien à faire dans le code.

n = 24; // tendre vers 0 pour supprimer la comparaison à chaque tour
puint = (unsigned int*) jeu1;
do {
  puint[n] = '####';
} while(--n >= 0);


donne:


  mov edx, ADDRjeu1
  mov eax, 24
doN:
  mov [edx + eax*4], 23232323h
  sub eax, 1
  jns doN


Au lieu de supposer, regarde le listing asm du compilo pour memset.
Devrait être assez voisin mais certainement pas plus court comme boucle.

ciao...
BruNews, MVP VC++
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
27 mars 2009 à 19:24
Tu es bien agressif, c'est une caractéristique des personnages qui prétendent avoir la science infuse ! Je n'ai pas de temps à perdre pour faire le test de performance dont je parlais plus haut, je te laisse donc le faire si ça t'amuses.

Il reste que tu n'as pas répondu à mon deuxième argument que je reformule pour que tu le comprennes bien : Ton code est totalement illisible et non maintenable. Si c'est ainsi que tu travailles, je souhaite bien du plaisir à tes collaborateurs...

ed73
0
maxou224 Messages postés 5 Date d'inscription lundi 6 octobre 2008 Statut Membre Dernière intervention 2 juin 2010
27 mars 2009 à 19:37
Je vous remerci de vos réponses :D
J'ai réussi à résoudre mon problème, c'était simplement un mauvais passage de paramètre...

Mais j'ai encore besoin de votre aide , j'aimerais afficher deux tableaux côte à côte de manière pour l'utilisateur à voir sa grille de bateau et celle où il doit attaquer

Doive-je créer encore des for imbriqué ? ou bien faire comme si il s'agissait d'un tableau de 20 cases ???
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 19:53
Je ne me voulais pas aggressif du tout.

Sur des boucles aussi basiques, il n'y a rien à mesurer, vérifier le listing du compilo est beaucoup plus sur.

Quand on code en vue d'optimisation des perfs, c'est qu'on est sur la version finale, il n'est pls question de maintenir. Je ne pense pas que montrer ce genre de chose puisse nuire et ça change un peu de ce qu'on voit habituellement sur cppfrance.

T'inquiète pas pour mes collaborateurs, je suis le seul dans la boite à produire du binaire dont au moins 70% est en ASM.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2009 à 19:56
pour maxou224,
NON il n'y avait pas qu'un prob de params, il faut aussi corriger tes boucles comme je l'ai dit au début, soit utiliser memset, sinon tu auras un plantage à un moment ou à un autre.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous