Remplir un gros tableau rapidement

Fermé
RedSkidy - 23 mars 2014 à 22:53
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 - 27 mars 2014 à 02:18
Bonjour,
je débute en c++ et j'apprends les tableaux donc pour m'entrainer je voulais essayer de faire une sorte de chunk minecraft (tableau tri-dimensionnel de 16x256x16) dans un premier temps avant de remplir le tableau depuis un fichier j'ai fait la boucle qui plus tard devrais remplir le tableau mai je n'est mis dans cette boucle qu'un cout pour voir combien de temps le programme mettait pour parcourir la boucle et il se trouve que c'est horriblement long (plusieurs minutes) juste pour parcourir la boucle - se seras donc pire quand le programme remplira un tableau - alors que dans minecraft un chunk se charge en quelques seconde je voudrais donc savoir comment remplir un aussi gros tableau rapidement

voici mon code :

#include <iostream>
int main()
{
for (int X(0); X<16; ++X)
    {
        for (int Y(0); Y<256; ++Y)
        {
            for (int Z(0); Z<16; ++Z)
            {
                std::cout << X << " " << Y << " " << Z << std::endl;
            }
        }
    }
return 0;
}
A voir également:

8 réponses

RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
24 mars 2014 à 00:08
up
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
24 mars 2014 à 17:13
ce up est un fail
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
24 mars 2014 à 12:43
Bonjours
C'est une peu normale que ta boucle de remplissage mette autant de temps car il doit faire chaque boucle pour remplir tes cellules ou colonne, bref je ne sais pas si tu as quelques notions d'algorithmes mais si tu remarques bien, deux de tes boucles ont une même constante max d'incrémentation "16" et il n'a n'y a qu'une seul boucle qui a une constante max de "256" de ce fait, pour rendre un peu plus rapide ta boucle de remplissage du doit revoir ton algorithme pour utiliser tout la potentielle de la boucle. Ceci dit-il te faut juste implémenter ton code de cette façon par exemple :

static int i;
static int j;
static int k;

for(i = 0, j = 0; i < 16; i++, j++){
 for(k = 0; k < 256 ; k++)
  std::cout << i << "\n" << j << "\n" << k << std::endl;
}
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
24 mars 2014 à 15:23
merci je ne savais pas qu'on pouvait faire sa mais c'est bon j'ai trouvé ce qui ne vas pas c'est cout c'est extrêmement lent sans cout le programme se finit en 0.04 secondes
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
Modifié par RedSkidy le 24/03/2014 à 17:14
sinon j'ai une autre question j'ai complété ma classe chunk mais elle le code crash quand j'appelle une fonction (le code compile)
chunk.h :

#ifndef CHUNK_H
#define CHUNK_H
#include <fstream>
typedef float (*Array)[16][256][16];
class chunk
{
public:
    chunk();
    ~chunk();
    Array load(const std::string &file);
    void save(const std::string &file);
    void generate();
private:
    Array ptr;

};

#endif // CHUNK_H


chunk.cpp :
#include "chunk.h"
#include <iostream>
#include <fstream>
typedef float (*Array)[16][256][16];
chunk::chunk()
{
    ptr = (Array) new float[16][256][16];
}
chunk::~chunk()
{
    delete ptr;
}
Array chunk::load(std::string const& file)
{
    std::ifstream flux(file.c_str());
    for(int X(0); X<16; ++X)
    {
        for (int Y(0); Y<256; ++Y)
        {
            for (int Z(0); Z<16; ++Z)
            {
                flux >> *ptr[X][Y][Z];
            }
        }
    }

    return ptr;
}
void chunk::save(std::string const& file)
{
    std::ofstream flux(file.c_str());
    for(int X(0); X<16; ++X)
    {
        for (int Y(0); Y<256; ++Y)
        {
            for (int Z(0); Z<16; ++Z)
            {
                flux << *ptr[X][Y][Z] << std::endl;
            }
        }
    }
}
void chunk::generate()
{
    for(int X(0); X<16; ++X)
    {
        for (int Y(0); Y<256; ++Y)
        {
            for (int Z(0); Z<16; ++Z)
            {
                *ptr[X][Y][Z] = 1;
            }
        }
    }


}


je sens que j'ai fait une énorme erreur pour laquelle je vais me faire insulter par tous les programmeurs du coin

quelqu'un pourrait m'aider ?
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
25 mars 2014 à 10:39
Bonjour
sait tu juste à quoi sert Array ? et les pointeurs ?? avant de te répondre
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
Modifié par RedSkidy le 26/03/2014 à 13:01
Array est le nom que j'ai donné a mon typedef qui représente un pointeur sur un tableau et les pointeurs sont des variables qui contiennent l'adresse d'autres variables
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
26 mars 2014 à 20:29
tu initialise comment tes tableaux de float ??
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
Modifié par RedSkidy le 27/03/2014 à 02:24
avec un typedef :
typedef float (*Array)[16][256][16]; //Array est un pointeur sur un tableau statique de float  tri-dimentionels de 16x2256x16
0

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

Posez votre question
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
24 mars 2014 à 17:18
et sambia je veut remplir un rectangle en 3D virtuel (oui sa veut rien dire) donc c'est comme si je voulais placer un par un tous les blocs qui composent ce cube or est-ce que sa marcherait avec ton code vu que les positions X et Z sont incrémentés en meme temps ?
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
25 mars 2014 à 10:35
Bonjour
à ce que je connais de mes études élémentaire ,un cube est un parallélépipède rectangle particulier dont la longueur, la largeur et la hauteur sont de même longueur. et dont son volume est
volume = Largeur x Longueur x Hauteur = C x C x C = c³ donc si je te dit que j'ai un un cube dont la longueur d'un côté vaut 5 donc mon volume est égale à ?? ( :) si tu trouve la solution tu trouve l'algorithme et ça répondra à ta question)
0
RedSkidy Messages postés 196 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 22 octobre 2015 6
Modifié par RedSkidy le 26/03/2014 à 13:04
c'est pas vraiment un cube j'ai marqué plus haut que c'était un volume (j'avais oublié le nom) de 16x256x16
et la réponse est 125 cm3 mais ce n'était pas ma question ma question est par exemple si j'avais un cube de 5cm, ils serait composé de 125 cube de 1cm et l'algorithme que je veut doit placer tout ces cubes de 1cm un par un
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 26/03/2014 à 20:27
bonsoir
utilise un tableau pour stocker les valeurs de ton cube ou volume ainsi tu auras tout les donner d'un volume ou cube dans un tableau et voir mieux encore pour ne pas te prendre la tête à tout mettre en mémoire tu peux bien enregistrer les données de ton tableau dans un fichier texte et importer exporter comme tu veux je ne vois pas ou est le problème sauf peut-être si j'ai mal compris
à bientôt
0