[C] donner valeurs à un tableau après déclara

Résolu/Fermé
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012 - 24 juil. 2008 à 15:49
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012 - 25 juil. 2008 à 14:46
Bonjour,

Comme (presque) dit dans le titre, j'ai un problème pour affecter des valeurs à un tableau à deux dimensions après avoir déclaré mon tableau (il faut absolument que j'affecte après déclaration puisque je compte utiliser cette structure :
struct Jeu
{
tab Nombre;
tab Solution;
};


où tab est :
typedef int tab[10][10];

Pour info, ça marche niquel quand je déclare et affecte en même temps :
tab tab1={{4,6,3,1,1,1,8,9,4,6},{3,7,8,9,6,4,6,2,5,1},{3,2,5,8,7,3,9,6,7,5},{2,8,4,1,7,8,8,3,9,6},{1,5,6,2,4,9,3,1,8,5},{6,9,8,5,4,2,7,1,3,8},{8,4,9,6,9,1,8,5,9,2},{4,1,2,9,5,7,1,9,6,3},{7,3,4,4,9,3,6,8,5,6},{6,7,7,3,9,5,4,1,1,9}};

J'ai fait plusieurs tests mais je n'ai que des erreurs (certains tests sont vraiment stupide mais je commence à desesperer!^^) :
tab tab2;
tab2={{1,0,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,1,0,1,0},{1,0,1,0,1,0,0,0,0,0},{0,1,0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1,0,1},{1,0,1,0,0,0,0,0,0,0},{0,0,0,0,1,0,1,0,1,0},{0,1,0,1,0,0,0,1,0,0},{0,0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,1,0,0}};

tab tab4;
tab4[10][10]={{1,0,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,1,0,1,0},{1,0,1,0,1,0,0,0,0,0},{0,1,0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1,0,1},{1,0,1,0,0,0,0,0,0,0},{0,0,0,0,1,0,1,0,1,0},{0,1,0,1,0,0,0,1,0,0},{0,0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,1,0,0}};

tab tab5;
tab5[]={{1,0,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,1,0,1,0},{1,0,1,0,1,0,0,0,0,0},{0,1,0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1,0,1},{1,0,1,0,0,0,0,0,0,0},{0,0,0,0,1,0,1,0,1,0},{0,1,0,1,0,0,0,1,0,0},{0,0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,1,0,0}};

tab tab6;
tab6[][]={{1,0,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,1,0,1,0},{1,0,1,0,1,0,0,0,0,0},{0,1,0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1,0,1},{1,0,1,0,0,0,0,0,0,0},{0,0,0,0,1,0,1,0,1,0},{0,1,0,1,0,0,0,1,0,0},{0,0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,1,0,0}};

tab tab7;
tab7[10][]={{1,0,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,1,0,1,0},{1,0,1,0,1,0,0,0,0,0},{0,1,0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1,0,1},{1,0,1,0,0,0,0,0,0,0},{0,0,0,0,1,0,1,0,1,0},{0,1,0,1,0,0,0,1,0,0},{0,0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,1,0,0}};

les erreurs sont toutes "expected expression before ']' token" , sauf pour tab4 où c'est '}'.

Quelqu'un peut-il m'aider?

10 réponses

arkos78 Messages postés 618 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 3 septembre 2009 48
24 juil. 2008 à 15:52
bonjour c très mauvais de remplir un tableau comme çela voit une autre méthode
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 juil. 2008 à 15:55
essai :
const tab T1={...};
tab T2 = (tab){...};
int T3[10][10]=(int**){...};
const int T4[10][10]={...};// Celui là, au moins devrais fonctionné.
0
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012
24 juil. 2008 à 15:57
Wouah ! Quelle rapidité!^^

Pourquoi c'est mauvais?

Je ne voies pas comment faire autrement, il n'y a aucune logique dans l'affectation des nombre du tableau, c'est une grille de jeu.
je peux pas faire un truc du genre :
for i
for j
tab1[i][j]=?

A moins qu'il y ai une méthode que je ne connaisse pas?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 juil. 2008 à 16:04
Si les tableau ne sont pas amener à changer, c'est une méthode que je ne trouve pas mauvaise.
Par contre, défini tes tableau comme étant constant.
0

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

Posez votre question
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012
24 juil. 2008 à 16:10
J'avais pas vu ta réponse Char Sniper,
j'ai testé 1,2 et 4 marchent.

En effet mes tableaux ne changeront pas, mais dans ce cas, il faut que je les définisse avec le type struct Jeu
const struct Jeu T1.Nombre={...} ne marche pas.
D'ailleurs il faudrait peut-être affecter des valeurs à Nombre et Solution en même temsp?
0
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012
24 juil. 2008 à 16:15
J'ai réussi!

Pour ceux que ça interesse, il suffit de faire :
const struct Jeu T1={ {...}, {...} };

Merci pour votre aide!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 juil. 2008 à 16:34
Je pense que c'est bon, mais c'est assez dangereux comme manière de faire !
As tu compris pourquoi ça fonctionnait ?
Si ce n'est pas le cas, ça me parait extremement dangereux ce que tu fais.
T1 est un tableau à trois dimension en fait.
0
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012
24 juil. 2008 à 23:48
Oui, j'ai compris... a moins qu'il y ait une astuce?

En fait ce que je ne comprends pas c'est pourquoi la déclaration de tab2 ne marche pas.

C'est vrai, T1 est un tab à 3 dimensions, j'avais pas vu! En même temps, je vais rajouter des choses dans ma structure plus tard.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 juil. 2008 à 09:08
à ce sujet, je te conseil de lire le chapitre7 (du moins le début) de ce livre :
https://beuss.developpez.com/tutoriels/pcasm/#LS1
Il m'a fait comprendre la nature des structures, et je pense qu'il t'aidera.
En revanche pour les histoires de tableau, c'est un peu plus compliqué, je n'ai pas de source. Mais j'ai eu plein de discussion sur ce forum qui en traitait.
En résumé (même si ça ne t'aide pas beaucoup) un tableau n'est pas un pointeur, mais peux se comporté comme tel dans certains cas particuliers, il se raproche du int*const (c'est le pointeur qui est constant et non la valeur pointé).
Lorsque tu utilise met {...} cela correspond en fait à un tableau constant de valeurs constantes ! Il faut donc faire attention à ce qu'on fait avec.
Par exemple, tu peux affecter ce tableau à un pointeur grâce au transtypage :
int* C;
C=(int*){1,2,3};
par contre, attention à ne pas faire de free sur C à ce moment là, ça causerai une erreur !
{1,2,3} est de type (int const * const).
0
SofLS Messages postés 11 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 10 février 2012
25 juil. 2008 à 14:46
Merci beaucoup pour le lien, le document est très interessant; et merci pour toutes tes explications!
0