Redimensionner un tableau
Bonjour a tous !!
:oops: est il possible de redimensionner un tableau ??!! :oops:
j'ai la situation suivante :
je veux a partir d'une table de base de donnee recuperer le nbre de ligne (nbr) puis allouer de l'espace memoire (variable double * tt = new double[nbr];) sous forme d'un tablau, apres ca je recupere les valeur de la table DB ( tt[i] = MyQuerytotal->Value;)
jusqu'ici c'est bon !!
je veux assigner les valeur de tt dans dba
en prenant en compte que je veux redimensionner le tableau dba
c.a.d
si tt contient 5 element => dba redevient 5
est it possible de faire ca !!!
Merci
voici le code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
String leg[7];
const char *lab[7];
double dta[10];
//double *tt;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
_control87(MCW_EM, MCW_EM);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::Quit1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::Button1Click(TObject *Sender)
{
int i = 0 ;
int nbr = MyQuery->RecordCount;
double * tt = new double[nbr];
MyQuery->First();
while(!MyQuery->Eof)
{
leg[i] = MyQuerytypeglobal->Value;
tt[i] = MyQuerytotal->Value;
MyQuery->Next();
i++;
}
memcpy(dta,tt,nbr);
for(int j=0;j< nbr ;j++){
LBox1->Items->Add(dta[j]);
// tt[j] = dta[j];
}
int f = sizeof(leg)/sizeof(leg[0]);
for(int j=0;j<f;j++)
{
lab[j] = leg[j].c_str(); // lab[j] = new char[leg[j].Length()+1];
}
Screen->Cursor = crHourGlass;
PieChart *c = new PieChart(500, 300, Chart::goldColor(), -1, 1);
c->addTitle("Vente dans le Segment A00 en 2005", "LuCon.ttf", 14)->setBackground(Chart::metalColor(0xff9999));
c->setPieSize(250, 120, 100);
c->set3D();
c->setLabelLayout(Chart::SideLayout);
c->setLabelStyle()->setBackground(Chart::SameAsMainColor,Chart::Transparent, 1);
c->setLineColor(Chart::SameAsMainColor, 0x0);
c->setStartAngle(135);
c->setData(DoubleArray(dta,sizeof(dta)/sizeof(dta[0])), StringArray(lab, sizeof(lab)/sizeof(lab[0])));
c->makeChart("q.bmp");
delete c;
// delete[] dta;
Screen->Cursor = crDefault;
Image1->Picture->LoadFromFile("q.bmp");
} |
Re: Redimensionner un tableau
Citation:
Envoyé par saidus
est il possible de redimensionner un tableau ?
En principe, on ne peut pas redimensionner un tableau avec le couple new/delete, il faut soit utiliser malloc qui a son realloc (utilisation très critiquée en C++ mais ça marche), soit refaire un nouveau new à la nouvelle dimension et recopier l'ancien et en libérant l'ancienne mémoire (usine à gaz), soit utiliser la technique des liste chaînées, soit surdimensionner au départ le tableau pour éviter d'avoir à le redimensionner, soit encore utiliser des composants de la VCL comme TList dont chaque pointeur pointerait un double. Tout dépend du contexte exact.
À bientôt
Gilles
Re: Redimensionner un tableau
Citation:
Envoyé par Gilles Louïse
utiliser malloc qui a son realloc (utilisation très critiquée en C++ mais ça marche)
Gilles
J'ai entendu dire cela plusieur fois.
Pour quelle raison cette méthode est-elle critiquée exactement ?
En Borland C++ Builder je n'ai jamais eu l'occasion de tester, il y a peut-etre autre chose de plus approprié, mais du temps des 486dx avec le turbo C++ de Borland, c'était LA méthode que tout le monde utilisait, et qui ne posait aucun problème à ma connaissance
Re: Redimensionner un tableau
Citation:
Envoyé par Argol_Medusa
J'ai entendu dire cela plusieurs fois.
Pour quelle raison cette méthode est-elle critiquée exactement ?
Il n'y a pas de raison véritablement objective hormis un purisme exacerbé.
Comme dans les tous domaines, vous avez des intégristes, ce sont en général ceux qui développent le moins et qui restent dans les très hautes sphères de la théorie pure, un peu à la manière des professeurs d'harmonie en musique qui ne composent pratiquement pas mais qui font de la théorie.
Pour ma part, étant donné que le C++ est en surensemble du C, je ne vois aucun inconvénient à utiliser la triade malloc/realloc/free : il est absolument certain que ça marche eu égard à la compatibilité ascendante allant du C au C++. Il faut simplement que vous soyez sûr, au moment du realloc, que la mémoire a bien été allouée précédemment par malloc. Dans les très grands programmes avec énormément de modules, vous n'avez en général qu'un pointeur et vous pouvez ne pas savoir comment a été allouée la mémoire. Donc un realloc est risqué. Mais si vous êtes certain que la mémoire a été allouée par malloc, ça marchera.
À bientôt
Gilles