Partage
  • Partager sur Facebook
  • Partager sur Twitter

invalid types 'int[int]' for array subscript

    15 novembre 2018 à 23:06:15

    Bonjour,

    je code actuellement une intelligence artificielle pour un jeu d'échec, je travaille actuellement sur la partie enregistrement/génération/chargement du cerveau à base de réseau de neurones et je bloque sur une erreur à la compilation.

    Je découvre les outils sur le tas donc il peut y avoir plusieurs erreur ou de maladresses de ma part.

    voici l'erreur qui survient à la ligne 130: "invalid types 'int[int]' for array subscript"

    voici le code:

    #include <iostream>
    #include <fstream>
    #include <string.h>
    #include <conio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <assert.h>
    
    using namespace std;
    
    typedef struct
    {
       int nb_layers;
       int nb_neurons;
       int* connections;
    }_brain;
    
    _brain loadBrain()
    {
        //déclaration variables
        int nb_layers, nb_neurons_max;
        //déclaration pointeurs pour malloc()
        int* p_int;
        float*** p_p_p_float = NULL;
        //ouverture du fichier en lecture binaire
        FILE* brain_file;
        brain_file = fopen("brain_file.bin" , "rb");
        assert(brain_file);
        //on lit le nombre de couches de neurones et on déclare un tableau de x couches de neurones
        fread(&nb_layers , sizeof(int) , 1 , brain_file);
        int nb_neurons[nb_layers];
        //on lit la valeur des connections entre les neurones
        fread(nb_neurons , sizeof(nb_neurons[0]) , sizeof(nb_neurons)/sizeof(nb_neurons[0]) , brain_file);
        nb_neurons_max = 64;
        for(int cnt1 = 1; cnt1 < nb_layers - 1; cnt1++)
            if(nb_neurons[cnt1] > nb_neurons_max)
                nb_neurons_max = nb_neurons[cnt1];
        float connections[nb_layers - 1][nb_neurons_max][nb_neurons_max];
        fread(connections , sizeof(connections) , 1 , brain_file);
        //on ferme le fichier
        fclose(brain_file);
        //on stoque ces infos dans une structure
        _brain brain;
        p_int = (int*)malloc(nb_layers* sizeof(int));
        if (p_int == NULL)
            exit(0);
        p_p_p_float = (float***)malloc(nb_layers* sizeof(float**));
        if (p_p_p_float == NULL)
            exit(0);
        for (int cnt1 = 0 ; cnt1 < nb_layers ; cnt1++)
        {
            p_p_p_float[cnt1] = (float**)malloc(nb_neurons_max* sizeof(float*));
            if (p_p_p_float[cnt1] == NULL)
                exit(0);
            for (int cnt2 = 0 ; cnt2 < nb_neurons_max ; cnt2++)
            {
                p_p_p_float[cnt1][cnt2] = (float*)malloc(nb_neurons_max* sizeof(float));
                if (p_p_p_float[cnt1][cnt2] == NULL)
                    exit(0);
            }
        }
        return brain;
    }
    
    _brain generateBrain()
    {
        //déclaration variables
        int nb_layers, nb_neurons_max;
        //déclaration pointeurs pour malloc()
        int* p_int;
        float*** p_p_p_float = NULL;
        //ouverture du fichier en ecriture binaire
        FILE* brain_file;
        brain_file = fopen("brain_file.bin" , "wb");
        assert(brain_file);
        //on demande à l'utilisateur le nombre de couches et de neurones par couches
        cout << "Number of layers:";
        cin >> nb_layers;
        nb_layers = nb_layers +2;
        int nb_neurons[nb_layers];
        nb_neurons[0] = 64;
        nb_neurons[nb_layers - 1] = 1;
        nb_neurons_max = 64;
        for(int cnt1 = 1; cnt1 < nb_layers - 1; cnt1++)
        {
            cout << "Number of node in layer " << cnt1 << ": ";
            cin >> nb_neurons[cnt1];
            if(nb_neurons[cnt1] > nb_neurons_max)
                nb_neurons_max = nb_neurons[cnt1];
        }
        //on crée les connections avec une valeur initiale de 0
        float connections[nb_layers - 1][nb_neurons_max][nb_neurons_max];
        for(int cnt1 = 1; cnt1 < nb_layers - 1; cnt1++)
            for(int cnt2 = 0; cnt2 < nb_neurons_max; cnt2++)
                for(int cnt3 = 0; cnt3 < nb_neurons_max; cnt3++)
                    connections[cnt1][cnt2][cnt3] = 0;
        //on modifie connections actives avec une valeur aléatoire
        for(int cnt1 = 1; cnt1 < nb_layers - 1; cnt1++)
            for(int cnt2 = 0; cnt2 < nb_neurons[cnt1 - 1]; cnt2++)
                for(int cnt3 = 0; cnt3 < nb_neurons[cnt1]; cnt3++)
                    connections[cnt1][cnt2][cnt3] = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
        //on enregistre les valeurs dans le fichier
        fwrite(&nb_layers , sizeof(int) , 1 , brain_file);
        fwrite(nb_neurons , sizeof(nb_neurons[0]) , sizeof(nb_neurons)/sizeof(nb_neurons[0]) , brain_file);
        fwrite(connections , sizeof(connections) , 1 , brain_file);
        fclose(brain_file);
        //on crée une structure
        _brain brain;
        p_int = (int*)malloc(nb_layers* sizeof(int));
        if (p_int == NULL)
            exit(0);
        p_p_p_float = (float***)malloc(nb_layers* sizeof(float**));
        if (p_p_p_float == NULL)
            exit(0);
        for (int cnt1 = 0 ; cnt1 < nb_layers ; cnt1++)
        {
            p_p_p_float[cnt1] = (float**)malloc(nb_neurons_max* sizeof(float*));
            if (p_p_p_float[cnt1] == NULL)
                exit(0);
            for (int cnt2 = 0 ; cnt2 < nb_neurons_max ; cnt2++)
            {
                p_p_p_float[cnt1][cnt2] = (float*)malloc(nb_neurons_max* sizeof(float));
                if (p_p_p_float[cnt1][cnt2] == NULL)
                    exit(0);
            }
        }
        //on stocke les valeurs dans la structure
        brain.nb_layers = nb_layers;
        for(int cnt1 = 0; cnt1 < nb_layers; cnt1++)
            brain.nb_layers[cnt1] = nb_layers[cnt1];
        return brain;
    }
    
    int main()
    {
        srand (static_cast <unsigned> (time(0)));
        char choice;
        _brain brain;
        cout << "[L]oad brain_file" << endl << "[G]enerate a random brain_file" << endl << "[Q]uit program" << endl;
        choice = _getch();
        do
        {
            switch(choice)
            {
                case 'o':
                    brain = loadBrain();
                break;
                case 'g':
                    brain = generateBrain();
                break;
                default:
                break;
            }
        }while(choice != 'o' && choice != 'g' && choice != 'q');
        cout << brain.nb_layers;
        return 0;
    }
    

    Merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2018 à 10:46:49

      Salut,

      Ce que tu as écris, c'est du C.
      En C++, on utilise pas fread ni fwrite.
      Les tableaux sont de type std::vector ou std::array.
      On évite les pointeurs nu.
      L'allocation dynamique ne se fait pas avec malloc, mais via les pointeurs intelligent.
      La génération de nombre aléatoires se fait via les objets de l'entête <random>.

      Concernant ton problèmes, les indices de tableau ne peuvent être négatif, donc utilise un type non signé.

      -
      Edité par Deedolith 16 novembre 2018 à 10:47:43

      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2018 à 12:03:11

        Mais qu'utilise-t-on alors pour des fichiers binaires en C++ ?

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2018 à 13:59:14

          Les classes std::ifstream, std::ofstream et/ou std::fstream.

          Documentation ici:
          http://www.cplusplus.com/reference/fstream/

          • Partager sur Facebook
          • Partager sur Twitter
            16 novembre 2018 à 16:54:18

            J'ai rarement vu autant de malloc, de C dans un code C++.

            • Partager sur Facebook
            • Partager sur Twitter

            git is great because Linus did it, mercurial is better because he didn't.

              16 novembre 2018 à 17:15:53

              De plus, le code est juste une grosse fonction non testable.

              Je te propose de refaire ton code, en te limitant a 7-10 lignes par fonction. C'est complètement faisable dans les réseaux de neurones.

              Et ecrit des tests !

              • Partager sur Facebook
              • Partager sur Twitter

              Architecte logiciel - Software craftsmanship convaincu.

                16 novembre 2018 à 20:26:49

                Niveau fuite de mémoire, c'est les chutes du Niagara... Ce n'est pas trop grave, ça va sûrement planter très vite. Les OS ont une fâcheuse tendance à mettre une balle dans la tête des cerveaux qui déréférencent des pointeurs non initialisés...

                -
                Edité par int21h 16 novembre 2018 à 20:29:18

                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                  18 novembre 2018 à 14:14:21

                  Wow ! Ça fait beaucoup de corrections ! Je fais ça dès que je rentre et je renvoie le code. Merci !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 janvier 2019 à 1:13:30

                    La ligne 102 ne marche pas comme prévue et j'aimerai bien utiliser cette forme plutôt que celle allant de la ligne 91 à 97.

                    Et le loadBrain ne semble pas fonctionner, si je choisi de charger le fichier, le 'cout' de vérification ligne 128 n'affiche rien.

                    #include <iostream>
                    #include <fstream>
                    #include <string.h>
                    #include <conio.h>
                    #include <time.h>
                    #include <stdlib.h>
                    #include <assert.h>
                    #include <math.h>
                    
                    using namespace std;
                    
                    #define debug 0
                    #define NB_NEURONS_IN_FIRST_COLUMN 10
                    
                    typedef struct
                    {
                       int nb_layers;
                       int* nb_neurons;
                       float* connections;
                    }_brain;
                    
                    typedef struct{
                        int board[8][8];
                        bool turn;
                        bool black_king_side_castle;
                        bool black_queen_side_castle;
                        bool white_king_side_castle;
                        bool white_queen_side_castle;
                        int column_en_passant;
                    }_chess_board;
                    
                    _brain brain;
                    int NB_NEURONS_MAX = NB_NEURONS_IN_FIRST_COLUMN;
                    
                    float get_connection_value(unsigned int xbrain_layer, unsigned int xbrain_line, unsigned int xbrain_column)
                    {
                        return brain.connections[(NB_NEURONS_MAX * NB_NEURONS_MAX * xbrain_layer) + (NB_NEURONS_MAX * xbrain_line) + xbrain_column];
                    }
                    
                    void put_connection_value(unsigned int xbrain_layer, unsigned int xbrain_line, unsigned int xbrain_column, float connection_value)
                    {
                        brain.connections[(NB_NEURONS_MAX * NB_NEURONS_MAX * xbrain_layer) + (NB_NEURONS_MAX * xbrain_line) + xbrain_column] = connection_value;
                    }
                    
                    void loadBrain()
                    {
                        FILE* brain_file;
                        brain_file = fopen("brain_file.bin", "rb");
                        assert(brain_file);
                        fread(&brain.nb_layers , sizeof(int) , 1 , brain_file);
                        brain.nb_neurons = (int*)malloc(brain.nb_layers * sizeof(int));
                        for(int cnt = 1; cnt < brain.nb_layers - 1; cnt++)
                            if(brain.nb_neurons[cnt] > NB_NEURONS_MAX)
                                NB_NEURONS_MAX = brain.nb_neurons[cnt];
                        brain.connections = (float*)malloc(brain.nb_layers * NB_NEURONS_MAX * NB_NEURONS_MAX * sizeof(float));
                        fread(brain.connections , sizeof(brain.connections) , 1 , brain_file);
                        fclose(brain_file);
                    }
                    
                    void generateBrain()
                    {
                        FILE* brain_file;
                        brain_file = fopen("brain_file.bin" , "wb");
                        assert(brain_file);
                        cout << "Number of layers:";
                        cin >> brain.nb_layers;
                        brain.nb_layers = brain.nb_layers + 2;
                        brain.nb_neurons = (int*)malloc(brain.nb_layers * sizeof(int));
                        brain.nb_neurons[0] = NB_NEURONS_IN_FIRST_COLUMN;
                        brain.nb_neurons[brain.nb_layers - 1] = 1;
                        for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                        {
                            cout << "Number of node in layer " << cnt1 << ": ";
                            cin >> brain.nb_neurons[cnt1];
                            if(brain.nb_neurons[cnt1] > NB_NEURONS_MAX)
                                NB_NEURONS_MAX = brain.nb_neurons[cnt1];
                        }
                        brain.connections = (float*)malloc(brain.nb_layers * NB_NEURONS_MAX * NB_NEURONS_MAX * sizeof(float));
                        for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                            for(int cnt2 = 0; cnt2 < NB_NEURONS_MAX; cnt2++)
                                for(int cnt3 = 0; cnt3 < NB_NEURONS_MAX; cnt3++)
                                    put_connection_value(cnt1, cnt2, cnt3, 0);
                        for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                            for(int cnt2 = 0; cnt2 < brain.nb_neurons[cnt1 - 1]; cnt2++)
                                for(int cnt3 = 0; cnt3 < brain.nb_neurons[cnt1]; cnt3++)
                                    put_connection_value(cnt1, cnt2, cnt3, (((float)rand()/(float)(RAND_MAX)) * 2) - 1);
                        fwrite(&brain.nb_layers , sizeof(int) , 1 , brain_file);
                        fwrite(brain.nb_neurons , sizeof(int) , brain.nb_layers , brain_file);
                    #if debug == 1
                    {
                        float connection_value;
                        for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                            for(int cnt2 = 0; cnt2 < NB_NEURONS_MAX; cnt2++)
                                for(int cnt3 = 0; cnt3 < NB_NEURONS_MAX; cnt3++)
                                {
                                    connection_value = get_connection_value(cnt1, cnt2, cnt3);
                                    fwrite(&connection_value , sizeof(float) , 1, brain_file);
                                }
                    }
                    #else // debug
                    {
                        fwrite(brain.connections , sizeof(float) , brain.nb_layers * NB_NEURONS_MAX * NB_NEURONS_MAX, brain_file);
                    }
                    #endif
                        fclose(brain_file);
                    }
                    
                    int main()
                    {
                        srand (static_cast <unsigned> (time(0)));
                        char choice;
                        cout << "[L]oad brain_file" << endl << "[G]enerate a random brain_file" << endl << "[Q]uit program" << endl;
                        do
                        {
                            choice = _getch();
                            switch(choice)
                            {
                                case 'l':
                                    loadBrain();
                                break;
                                case 'g':
                                    generateBrain();
                                break;
                                default:
                                break;
                            }
                        }while(choice != 'l' && choice != 'g' && choice != 'q');
                        cout << brain.nb_layers << endl << get_connection_value(0, 0, 0);
                        return 0;
                    }

                    Je continue sur les fwrite et fread, car cela m'a été conseillé par mon professeur de prog, aussi je ne connais pas grand chose au vector et array.

                    Je tiens aussi à m'excuser du temps infini qu'il ma fallu pour sortir ce code tout neuf, mais j'ai eu des contretemps.

                    -
                    Edité par ThéoSarda1 8 janvier 2019 à 1:24:44

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 janvier 2019 à 2:17:55

                      Pour eviter les bugs, on a en gros 2 méthodes :

                      • utiliser des syntaxes qui évitent les bugs
                      • ou galerer pour debugger

                      Quand on peut éviter la seconde méthode, on le fait. Parce qu'on n'a pas envie de se taper des heures de boulot s'il suffit d'écrire du code correct.

                      Si ton prof pense qu'écrire du code inutilement compliqué (inutile parce qu'on peut faire la meme chose avec du code lisible et avec moins de risque de bugs), c'est très dommage pour toi. Tu feras partie, si tu veux continuer le C++ plus tard, de ceux qui ont dû réapprendre le C++ tout seul, parce qu'ils ont eu des mauvais cours.

                      Honnetement, je refuse les boulots où je dois bosser sur des codes comme ca. Si je ne fais pas cela en étant payé, tu imagines bien que j'ai encore moins envie de me taper ce genre de code bénévolement, juste pour compenser les errances d'un prof. Et j'imagine qu'on va être plusieurs à ne pas vouloir lire ton code.

                      Au pire, si tu n'as pas d'aide ici, demande sur le forum C ou a ton prof.

                      -
                      Edité par gbdivers 8 janvier 2019 à 2:19:01

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 janvier 2019 à 3:18:46

                        Ce n'est toujours pas du C++ !!!

                        ThéoSarda1 a écrit:

                        Je continue sur les fwrite et fread, car cela m'a été conseillé par mon professeur de prog,

                        Change de prof, et met ce vieux truc tout moisi qui ose s'appeler prof à la poubelle.

                        ThéoSarda1 a écrit:

                        aussi je ne connais pas grand chose au vector et array.

                        On se documente:
                        http://www.cplusplus.com 

                        -
                        Edité par Deedolith 8 janvier 2019 à 3:28:01

                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 janvier 2019 à 8:57:54

                          Hello,

                          Dans ce cas je ne t'aiderais pas.

                          Ton professeur a quel age?

                          As-t-il vraiment fait du C++ pro une fois dans sa vie?

                          Sur ce, bonne chance avec les exceptions et les fuites de memoires, j'en ai assez donner.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Architecte logiciel - Software craftsmanship convaincu.

                            8 janvier 2019 à 9:16:59

                            En fait, j'ai l'impression que les professeur de C++ (mais pas que ce langage) sont un peu comme les personnes politiques. Ils enseignent et prennent des décisions sans jamais avoir vécu ou penser à l'utiliser dans la vraie vie (cf. l'ignorance du SMIC et les prix des pains au chocolat).

                            Ce code est litéralement ce qu'un babouin aurait déféqué après avoir mangé des fruits pourris.

                            -
                            Edité par markand 8 janvier 2019 à 9:17:51

                            • Partager sur Facebook
                            • Partager sur Twitter

                            git is great because Linus did it, mercurial is better because he didn't.

                              8 janvier 2019 à 10:20:07

                              Pour un meilleur début:
                              struct brain
                              {
                              	int nb_layers;
                              	std::vector<int> nb_neurons;
                              	std::vector<float> connections;
                              };
                               
                              struct chessBoard
                              {
                              	std::array<std::array<int, 8>, 8> board;
                              	bool turn;
                              	bool black_king_side_castle;
                              	bool black_queen_side_castle;
                              	bool white_king_side_castle;
                              	bool white_queen_side_castle;
                              	int column_en_passant;
                              };

                              Et encore, on peut faire mieux qu'un std::array 2D, mais on s'en contentera pour l'instant.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 janvier 2019 à 11:22:47

                                Sinon, un reseau de neurone (ANN) c'est tout simplement

                                Brain
                                  - layers : int
                                  - neurons : Array(layers, Matrix(n_x, 1))
                                  - synapses : Array(layers - 1, Matrix(n_x, m_x))
                                

                                En utilisant des matrices, le fast forward devient une simple multiplication de matrice et addition pour les biais.

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Architecte logiciel - Software craftsmanship convaincu.

                                  8 janvier 2019 à 12:42:23

                                  Wow dur dur !

                                  Je ne pensais pas que c'était nul à ce point !

                                  Deedolith a écrit:

                                  struct chessBoard
                                  {
                                  	std::array<std::array<int, 8>, 8> board;
                                  	bool turn;
                                  	bool black_king_side_castle;
                                  	bool black_queen_side_castle;
                                  	bool white_king_side_castle;
                                  	bool white_queen_side_castle;
                                  	int column_en_passant;
                                  };


                                  Et encore, on peut faire mieux qu'un std::array 2D, mais on s'en contentera pour l'instant.

                                  Petite précision, les vector servent à faire des tableaux dont on veut pouvoir modifier la taille ? c'est ce que j'ai cru comprendre, du coup je ne vois pas l'utilité d'en utiliser sur la matrice du plateau de jeu.

                                  PS je me suis renseigné mais c'est un peu flou pour moi.



                                  -
                                  Edité par ThéoSarda1 8 janvier 2019 à 12:44:13

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 janvier 2019 à 13:26:53

                                    std::array ==> tableau de taille fixe.
                                    std::vector ==> tableau de taille dynamique, la taille est gérée automatiquement, tu n'as pas à t'en occuper.

                                    Et ca s'utilise quasiment comme les tableaux du C, exemples:

                                    std::array<int, 10> tab;    // tableaux de 10 entiers
                                    tab[5] = 8;                 // assigne 8 à l'element 5
                                    int valeur = tab[5];        // recupère la valeur de l'élément 5
                                    size_t taille = tab.size(); // recupere la taille du tableau (10 dans notre cas)
                                    
                                    std::vector<int> tab;       // tableau dynamique d'entiers
                                    tab.push_back(8);           // ajouter un élément au tableau
                                    tab[0] = 7;                 // assigne 7 à l'element 0
                                    int valeur = tab[0];        // recupère l'element 0
                                    size_t taille = tab.size(); // recupère la taille du tableau (1 dans notre cas)
                                    



                                    -
                                    Edité par Deedolith 8 janvier 2019 à 13:28:11

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 janvier 2019 à 13:32:52

                                      Oups j'avais mal lu, quel est l'avantage de 'array' sur les tableaux ?

                                      en tout cas ton explication est très claire merci !

                                      -
                                      Edité par ThéoSarda1 8 janvier 2019 à 13:33:52

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        8 janvier 2019 à 13:47:13

                                        Les RdN, c'est déjà complexe en soit -- pour calibrer, architecturer, entraîner, et au final obtenir des résultats j'entends. Le C++ aussi.

                                        Mélanger les deux (sans passer par les abstractions qui marchent (matrices et vecteurs)), cela me parait assez casse gueule. Sans parler d'utiliser des RdN pour modéliser une IA d'échec. C'est extrêmement ambitieux -- à moins d'avoir déjà un modèle entraîné qu'il suffirait juste de jouer. Et même là, j'ai comme un gros doute.

                                        Par curiosité, pourquoi ce choix de programme? Cela vient du prof, ou c'est personnel? Sur des approches IA totalement différentes (alpha-beta & cie) on s'attaque plutôt au tic-tac-toe et autre puissance 4 d'habitude.

                                        -
                                        Edité par lmghs 8 janvier 2019 à 13:48:32

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                          8 janvier 2019 à 14:37:31

                                          Oui c'est complètement personnel, et je suis un fondu d'échec alors javais envie de faire ma propre IA, Je sais Que ça va rester un peu conceptuelle et que ce serait étonnant qu'elle arrive à un bon niveau sur un jeu aussi complexe mais je veux tenter le coup.

                                          Et même si c'est casse gueule je pense que je peux m'en sortir, j'ai du mal sur tout ce qui est syntaxe... mais je me débrouille très bien en algo donc quand j'aurais passé la gestion d'enregistrement et de chargement du cerveau (c'est la première fois que je le fais, d'où mon code un peu farfelu), je devrais pouvoir m'en sortir.

                                          J'ai corrigé le code du mieux que j'ai pu,

                                          void putConnectionValue(unsigned int xbrain_layer, unsigned int xbrain_line, unsigned int xbrain_column, float connection_value)
                                          {
                                              brain.connections[(NB_NEURONS_MAX * NB_NEURONS_MAX * xbrain_layer) + (NB_NEURONS_MAX * xbrain_line) + xbrain_column] = connection_value;
                                          }
                                          void generateBrain()
                                          {
                                              int temp_nb_neurons;
                                              cout << "Number of layers:";
                                              cin >> brain.nb_layers;
                                              brain.nb_layers = brain.nb_layers + 2;
                                              brain.nb_neurons.push_back(NB_NEURONS_IN_FIRST_COLUMN);
                                              NB_NEURONS_MAX = NB_NEURONS_IN_FIRST_COLUMN;
                                              for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                                              {
                                                  cout << "Number of node in layer " << cnt1 << ": ";
                                                  cin >> temp_nb_neurons;
                                                  brain.nb_neurons.push_back(temp_nb_neurons);
                                                  if(temp_nb_neurons > NB_NEURONS_MAX)
                                                      NB_NEURONS_MAX = temp_nb_neurons;
                                              }
                                              brain.nb_neurons.push_back(1);
                                              for(int cnt = 0; cnt < pow(NB_NEURONS_MAX, brain.nb_layers); cnt++)
                                                  brain.connections.push_back(0);
                                              for(int cnt1 = 0; cnt1 < brain.nb_layers - 1; cnt1++)
                                                  for(int cnt2 = 0; cnt2 < brain.nb_neurons[cnt1 - 1]; cnt2++)
                                                      for(int cnt3 = 0; cnt3 < brain.nb_neurons[cnt1]; cnt3++)
                                                          putConnectionValue(cnt1, cnt2, cnt3, (((float)rand()/(float)(RAND_MAX)) * 2) - 1);
                                              for(int cnt = 0; cnt < pow(NB_NEURONS_MAX, brain.nb_layers); cnt++)
                                                  cout << brain.connections[cnt] << ' ';
                                              saveBrain();
                                          }

                                          Mais le cout à la fin de cette fonction n'affiche rien.

                                          -
                                          Edité par ThéoSarda1 8 janvier 2019 à 15:18:02

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            8 janvier 2019 à 15:37:09

                                            ThéoSarda1 a écrit:

                                            Oups j'avais mal lu, quel est l'avantage de 'array' sur les tableaux ?

                                            La taille est embarquée ==> pas besoin d'un paramètre supplémentaire pour les fonctions le manipulant.
                                            On peut le donner en paramètre par référence.
                                            Il ne se dégrade pas en pointeur nu.
                                            Il est thread-safe.
                                            Il est supporté par les algorithmes de la librairie standard.
                                            Il est supporté par la boucle for...each.
                                            Il fournit de multiples constructeurs.
                                            Ect ...

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              8 janvier 2019 à 15:57:43

                                              wow ça en fait ! du y a-t-il un avantage aux tableaux sur les array ?

                                              Et j'ai un problème avec le generateBrain ou le saveBrain: tout se passe bien lors de l'enregistrement dans le fichier jusqu'à ce qu'on enregistre les valeurs dans le vector 'brain.connection' il n' a qu'un 0 dans le fichier

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                8 janvier 2019 à 16:01:19

                                                Il y a un avantage, ca prend 4o de moins.

                                                Mais bon, si tu en est au point d'optimiser 4o par array, GG !

                                                Si tu veux, regarde ce code: https://github.com/alex-lairan/deep_learning

                                                Toute la partie Genetique n'etait qu'un kiff perso, mais tout le reste est standard pour une IA ANN.

                                                Je n'ai juste pas la backpropagation.

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Architecte logiciel - Software craftsmanship convaincu.

                                                  8 janvier 2019 à 16:10:47

                                                  Deedolith a écrit:

                                                  ThéoSarda1 a écrit:

                                                  Oups j'avais mal lu, quel est l'avantage de 'array' sur les tableaux ?

                                                  a- Il ne se dégrade pas en pointeur nu.
                                                  b- Il est thread-safe.
                                                  c- Il est supporté par les algorithmes de la librairie standard.
                                                  d- Il est supporté par la boucle for...each.
                                                  e- Il fournit de multiples constructeurs.

                                                  ?? Euh...

                                                  a- Cela est vrai, et est important

                                                  b- En quoi un tableau (statique ou dynamique) est-il plus thread-safe que std::array? (Il n'y a aucune différence, ni la moindre garantie dans aucun des deux, voire dans aucun conteneur standard)

                                                  c- Un pointeur dans un buffer modélise un itérateur à accès direct -- il y a bien longtemps, on disait même qu'il était un itérateur trivial. Je crois qu'il va gagner officiellement dans la taxinomie des conteneurs et des itérateurs la propriété de contiguïté (en fait c'est la propriété qui n'existait pas et qui après moult discussions finit par arriver sous une forme un peu restreinte -- et encore, j'ai un doute)

                                                  Donc, les tableaux sont parfaitement utilisables avec les algos standards

                                                  d- tout comme les tableaux statiques directement, et même les dynamiques au travers d'une couche gratuite à la `span`

                                                  e- Pas du tout. Il en fournit justement zéro, c'est le seul moyen pour lui donner des propriétés de POD et de permettre de le construire simplement depuis des initiliazer-lists.

                                                  > mais je me débrouille très bien en algo

                                                  Le problème est que les RdN, c'est pas de l'algo, c'est des maths. La partie algorithmique est très simple. Par contre la modélisation est bien complexe. Il y a des années, le Reinforcement Learning était plus en vogue pour ce genre de jeux. Depuis, on a compris qu'on n'avait pas besoin de fonctions de transfert sigmoidales, une simple fonction affine non continue suffit, et aussi que si on rajoute assez de couches de manière pas entièrement au hasard, on arrive à faire des choses sympas (-> Deep Learning)

                                                  -
                                                  Edité par lmghs 8 janvier 2019 à 16:12:54

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                                    8 janvier 2019 à 16:21:32

                                                    Okay ! je regarderai tout ça Jeudi: j'ai du retard dans mes révisions.

                                                    Merci pour tous vos conseils et votre efficacité !

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 janvier 2019 à 17:11:47

                                                      lmghs a écrit:

                                                      e- Pas du tout. Il en fournit justement zéro, c'est le seul moyen pour lui donner des propriétés de POD et de permettre de le construire simplement depuis des initiliazer-lists.

                                                      Ops, mea culpa (habitude des vectors).

                                                      Mais bon pour résumer:
                                                      Avantages std::array: Plein.
                                                      Avantages tableaux: 1 seul.

                                                      Y'a pas photo.

                                                      PS: Les acronymes :colere:

                                                      -
                                                      Edité par Deedolith 8 janvier 2019 à 17:15:30

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        8 janvier 2019 à 17:51:58

                                                        Deedolith a écrit:

                                                        Avantages std::array: Plein.

                                                        Mouais. Non, je n'en citerais qu'un réel en plus du non downgrade en pointeur : il est copiable et a donc la même sémantique que l'on s'attend à trouver pour tout type valeur manipulé.

                                                        -
                                                        Edité par Ksass`Peuk 8 janvier 2019 à 17:52:11

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                                                          8 janvier 2019 à 19:00:27

                                                          Avantage des tableaux statiques: en l'absence de `make_array`, ils sont DRY, pas besoin de se mouiller (désolé!) à répéter la taille lors des définitions de constantes -- ou pourquoi je n'utilise jamais les `std::array`

                                                          -
                                                          Edité par lmghs 8 janvier 2019 à 19:00:54

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                                            8 janvier 2019 à 22:19:57

                                                            À quoi sert std::make_array depuis c++17 :D ? std::array a{1,2,3};

                                                            J'avoue que c'est aussi une chose qui m'embête avec std::array et que je me sers quelques fois de tableau C pour cette raison.

                                                            Note: pour répondre à ma question, make_array permet de forcer le type des éléments sans indiquer la taille.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              9 janvier 2019 à 2:45:22

                                                              Voilà où j'en suis pour l'instant,

                                                              Le programme s'arrête juste avant la ligne 116 je ne sais pas pourquoi.

                                                              #include <iostream>
                                                              #include <fstream>
                                                              #include <string.h>
                                                              #include <conio.h>
                                                              #include <time.h>
                                                              #include <stdlib.h>
                                                              #include <assert.h>
                                                              #include <math.h>
                                                              #include <vector>
                                                              
                                                              using namespace std;
                                                              
                                                              #define debug 0
                                                              #define NB_NEURONS_IN_FIRST_COLUMN 10
                                                              
                                                              typedef struct{
                                                                  int nb_layers;
                                                                  std::vector<int> nb_neurons;
                                                                  std::vector<float> connections;
                                                              }_brain;
                                                              
                                                              typedef struct{
                                                                  int board[8][8];
                                                                  bool turn;
                                                                  bool black_king_side_castle;
                                                                  bool black_queen_side_castle;
                                                                  bool white_king_side_castle;
                                                                  bool white_queen_side_castle;
                                                                  int column_en_passant;
                                                              }_chess_board;
                                                              
                                                              _brain brain;
                                                              int NB_NEURONS_MAX;
                                                              
                                                              float getConnectionValue(unsigned int xbrain_layer, unsigned int xbrain_line, unsigned int xbrain_column)
                                                              {
                                                                  return brain.connections[(NB_NEURONS_MAX * NB_NEURONS_MAX * xbrain_layer) + (NB_NEURONS_MAX * xbrain_line) + xbrain_column];
                                                              }
                                                              
                                                              void putConnectionValue(unsigned int xbrain_layer, unsigned int xbrain_line, unsigned int xbrain_column, float connection_value)
                                                              {
                                                                  brain.connections[(NB_NEURONS_MAX * NB_NEURONS_MAX * xbrain_layer) + (NB_NEURONS_MAX * xbrain_line) + xbrain_column] = connection_value;
                                                              }
                                                              
                                                              void loadBrain()
                                                              {
                                                                  int temp_nb_neurons;
                                                                  float temp_connection;
                                                                  ifstream brain_file("brain_file.txt", ios::in);
                                                                  if(brain_file)
                                                                  {
                                                                      brain_file >> brain.nb_layers;
                                                                      NB_NEURONS_MAX = 0;
                                                                      for(int cnt = 0; cnt < brain.nb_layers; cnt++)
                                                                      {
                                                                          brain_file >> temp_nb_neurons;
                                                                          brain.nb_neurons.push_back(temp_nb_neurons);
                                                                          if(temp_nb_neurons > NB_NEURONS_MAX)
                                                                              NB_NEURONS_MAX = temp_nb_neurons;
                                                                      }
                                                                      for(int cnt = 0; cnt < brain.connections.size(); cnt++)
                                                                      {
                                                                          brain_file >> temp_connection;
                                                                          brain.connections.push_back(temp_connection);
                                                                      }
                                                                      brain_file.close();
                                                                  }
                                                                  else
                                                                      cerr << "Impossible d'ouvrir le fichier !" << endl;
                                                              }
                                                              
                                                              void saveBrain()
                                                              {
                                                                  int cnt;
                                                                  ofstream brain_file("brain_file.txt", ios::out | ios::trunc);
                                                                  if(brain_file)
                                                                  {
                                                                      brain_file << brain.nb_layers << endl;
                                                                      for(cnt = 0; cnt < brain.nb_layers - 1; cnt++)
                                                                          brain_file << brain.nb_neurons[cnt] << ' ';
                                                                      brain_file << brain.nb_neurons[cnt] << endl;
                                                                      for(cnt = 0; cnt < brain.connections.size(); cnt++);
                                                                      {
                                                                          brain_file << brain.connections[cnt] << ' ';
                                                                          cout << brain.connections.size();
                                                                      }
                                                                      brain_file.close();
                                                                  }
                                                                  else
                                                                      cerr << "Impossible d'ouvrir le fichier !" << endl;
                                                              }
                                                              
                                                              void generateBrain()
                                                              {
                                                                  int temp_nb_neurons;
                                                                  cout << "Number of layers:";
                                                                  cin >> brain.nb_layers;
                                                                  brain.nb_layers = brain.nb_layers + 2;
                                                                  brain.nb_neurons.push_back(NB_NEURONS_IN_FIRST_COLUMN);
                                                                  NB_NEURONS_MAX = NB_NEURONS_IN_FIRST_COLUMN;
                                                                  for(int cnt1 = 1; cnt1 < brain.nb_layers - 1; cnt1++)
                                                                  {
                                                                      cout << "Number of node in layer " << cnt1 << ": ";
                                                                      cin >> temp_nb_neurons;
                                                                      brain.nb_neurons.push_back(temp_nb_neurons);
                                                                      if(temp_nb_neurons > NB_NEURONS_MAX)
                                                                          NB_NEURONS_MAX = temp_nb_neurons;
                                                                  }
                                                                  brain.nb_neurons.push_back(1);
                                                                  for(int cnt = 0; cnt < brain.connections.size(); cnt++)
                                                                      brain.connections.push_back(0);
                                                                  for(int cnt1 = 1; cnt1 < brain.nb_layers; cnt1++)
                                                                      for(int cnt2 = 0; cnt2 < brain.nb_neurons[cnt1 - 1]; cnt2++)
                                                                          for(int cnt3 = 0; cnt3 < brain.nb_neurons[cnt1]; cnt3++)
                                                                              putConnectionValue(cnt1, cnt2, cnt3, (((float)rand()/(float)(RAND_MAX)) * 2) - 1);
                                                                  saveBrain();
                                                              }
                                                              
                                                              int main()
                                                              {
                                                                  srand (static_cast <unsigned> (time(0)));
                                                                  char choice;
                                                                  cout << "[L]oad brain_file" << endl << "[G]enerate a random brain_file" << endl << "[Q]uit program" << endl;
                                                                  do
                                                                  {
                                                                      choice = _getch();
                                                                      switch(choice)
                                                                      {
                                                                          case 'l':
                                                                              loadBrain();
                                                                          break;
                                                                          case 'g':
                                                                              generateBrain();
                                                                          break;
                                                                          default:
                                                                          break;
                                                                      }
                                                                  }while(choice != 'l' && choice != 'g' && choice != 'q');
                                                                  cout << getConnectionValue(0, 0, 0);
                                                                  return 0;
                                                              }

                                                              J'attends vos réponses avec impatience !

                                                              -
                                                              Edité par ThéoSarda1 9 janvier 2019 à 2:50:36

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              invalid types 'int[int]' for array subscript

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown