Structure dynamique ou tableau multidimentionnel
Bonjour a tous , je me remet a bosser sur mon editeur de dbc et cette fois j'aimerai stocker toutes ces petites informations en mémoire Langue L'intéret ici serait d'avoir une structure avec un tableau pour une colonne , cependant , dans un soucis de propreté et de programmation non générique j'aimerai ne pas devoir faire ces structures en dur . Il faudrait pouvoir faire une structure "dynamique" qui s'adapte au fichier dbc en fonction d'un fichier format en .frt (merci magus Heureux) qui serait éditable via le bloc note (donc pas besoin de recompiler pour un changement de version !

Sauf que là je m'arrête tout de suite , j'ai trouvé aucune façon de faire une structure dynamique sur le net , donc si vous en avez je suis preneur Langue

Je me suis donc penché sur une autre façon de faire , les tableaux multidimentionnels , en effet Qt a créé un type de variable qui se cast en a peu n'importe quel type standard automatiquement . L'idée serait donc de faire un tableau a deux dimensions de ce type et là j'ai aussi un soucis pour y accéder , son utilisation n'a pas l'air aussi simple qu'un tableau unidimentionnel . Donc là je bloque sur ça

[code=cpp] QVariant Val[recordCount][CollumnNumber];

for(int a = 0 ; a < CollumnNumber ; ++a)//Nombre de collonnes
{
for(int i = 0 ; i < recordCount ; ++i ) //recordCount étant le nombre de chose a lire
{
//Lecture de la donnée
if(fread(&Val[i-1][a-1],sizeof(Val), 1 ,f) == 1)// -1 car un tableau comme toujours a 0 , le multidimmentionnel n'échappe pas a la règle
{
//Affichage de la donnée
QStandardItem *item = new QStandardItem;
item->setData(Val[i-1][a-1] , 0);//Cash sur cette ligne , segmentation fault
model->setItem(i , a , item);// j , a
progress.setValue(a * i /100);
}

}
}
[/code]

Je bloque Triste (même si mon avancée jusqu'ici est assez remarquable pour moi Langue)
Pourquoi ne pas faire une structure avec dedans des tableaux dynamiques ?

Ensuite dans ton code tu est sur que ce n'est pas la ligne d'après qui fait crash car la variable model viens d'ou ?
En fait le type peut changer , c'est la le challenge . Pour le model c'est déclaré avant

QStandardItemModel *model = new QStandardItemModel(1 ,1 , this);
Sinon moi j'aurais fait une structure de ce type :

Code :
struct Element {
int entry;
QList<int> types;
QList<QVariant> values;
};

Sachant que "types" serait initialisé à partir du fichier .frt (avec des defines ou des énumérations tu associes à chaque type une valeur numérique).
Ensuite tu fais une fonction qui a pour rôle de récupérer l'élément en fonction du type et le tour est joué.

PS : Y a peut-être des choses qui bloquent, je me suis pas trop pencher sur la question mais c'est une idée générale de la manière dont je m'y prendrait personnellement, reste à voir si ça fonctionne ou si ça coince à un moment donné Hihi
En fait non faut voir ça comme un tableau a deux entrées , j'ai un nombre de colonnes variable et un nombre de lignes variable . Tout en sachant que le nombre de ligne je le récupère dans l'entête et le nombre de colonne je le récupère dans mon fichier .frt de la manière suivante :

[code=cpp]bool DBCBrowser::GetFRTFile()
{
//On cherche la position dans la chaine du dernier "/"
int pos = CheminDBC.find_last_of("/");
//On découpe notre chaine pour n'obtenir plus qu'un "nomdufichier.extention"
string NomDBC = CheminDBC.substr(pos + 1);
//On détermine la taille du prochain buffer pour copier la chaine
size_t size = NomDBC.size() + 1;
//On créé le buffer pour copier la chaîne
char * buffer = new char[ size ];
//On copie la chaîne
strncpy( buffer, NomDBC.c_str(), size );
//On Coupe la chaine en deux a partir du "."
char *temp = strtok (buffer, ".");
//Et on finit par réutiliser notre variable de départ pour stocker le nom de notre fichier sans l'extention
NomDBC.assign(buffer);

//Puis on libère la mémoire
delete [] buffer , temp;
string FileFRTName = "format/" + NomDBC + ".frt";
ifstream FRTFile((char *)FileFRTName.c_str()); //Ouverture du fichier format correspondant a notre dbc

if(FRTFile)
{
CollumnNumber = 0;
string ligne;
while(getline(FRTFile , ligne))
{
++CollumnNumber;
format.push_back(ligne);
}
return true;
}
else
{
QMessageBox::critical(this , "Fichier non trouvé" , "Le fichier dbc que vous avez choisi n'a pas d'équivalent en .frt dans le dossier racine de DBCBrowser , veuillez en créer un et le remplir correctement !");
return false;
}
}[/code]

où format est déclaré en variable globlale

[code=cpp]vector<string> format;[/code]

Car là j'arrive a lire mon .dbc mais j'ai des int partout même là où il y a normalement des string Rire
Parce que dans les DBCs les strings sont à la fin du fichier. Les cellules des records ne contiennent que les identifiants des strings qu'elles contiennent.
Comment ça les identifiants ?
Édition :
(16-08-2011 01:50)Nicø a écrit :  Sinon moi j'aurais fait une structure de ce type :

Code :
struct Element {
int entry;
QList<int> types;
QList<QVariant> values;
};

Sachant que "types" serait initialisé à partir du fichier .frt (avec des defines ou des énumérations tu associes à chaque type une valeur numérique).
Ensuite tu fais une fonction qui a pour rôle de récupérer l'élément en fonction du type et le tour est joué.

PS : Y a peut-être des choses qui bloquent, je me suis pas trop pencher sur la question mais c'est une idée générale de la manière dont je m'y prendrait personnellement, reste à voir si ça fonctionne ou si ça coince à un moment donné Hihi

C'est vrai qu'en y repensant ton idée peut être pas mal , pour accéder a la donnée voulue je n'aurai plus qu'a faire de la sorte : numérocollonne * nombre de ligne + numéro de ligne = la valeur voulue

ça me ferait mettre tout a la suite , et pour l'édition je fais un tableau qui contient toutes les modif et je le traites une par une

Je vais éssayer ça Smile
Édition :
Après le QVariant ce qui est chiant c'est qu'il peut pas se cast avec un string de type STL (beaucoup plus complet que le QString) donc faut faire un truc du style QString(monstring.c_str()) ce qui me fait passer par un char * pour retourner sur un QString , la merde quoi x)
Édition :
Upp ?
(17-08-2011 13:27)Klaas a écrit :  ....numérocollonne * nombre de ligne + numéro de ligne = la valeur voulue
euh non, c'est (numérocollonne * (nombre de ligne-1)) + numérocollonne = la valeur voulue
(21-08-2011 00:00)Branruz a écrit :  
(17-08-2011 13:27)Klaas a écrit :  ....numérocollonne * nombre de ligne + numéro de ligne = la valeur voulue
euh non, c'est (numérocollonne * (nombre de ligne-1)) + numérocollonne = la valeur voulue

Effectivement x) Nico ya un truc qui m'échappe sur le QVariant , il alloue dynamiquement un type en fonction de la valeur que tu lui donnes , mais dans le cas d'un tableau , si toutes les valeurs n'ont pas le même type , il devient quoi notre QVariant ? ça va crash non ?
(21-08-2011 21:42)Klaas a écrit :  Effectivement x) Nico ya un truc qui m'échappe sur le QVariant , il alloue dynamiquement un type en fonction de la valeur que tu lui donnes , mais dans le cas d'un tableau , si toutes les valeurs n'ont pas le même type , il devient quoi notre QVariant ? ça va crash non ?
(Nico c pas moi)
ben sauf si ton QVariant recoit une structure de donnée.
(oublie le tableau car effectivement il doit contenir des données de meme type)

Retourner en haut Accueil