Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Массив не расширяется


Автор: darkness 24.12.2006, 23:08
Изначально имеем следующую струтуру:
Код

struct FIG
{
  int X1, Y1, type;
 };


Ну и указатель на массив таких данных:
Код

FIG *mas[2];


А вот код:
Код

int count=0;
...........
............
..........
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 mas[count]=new FIG;
 mas[count]->X1=135;
 mas[count]->Y1=40;
 mas[count]->type=1;

 count++;
// âàï
if (count>=2)
 {
 FIG *ptr=new FIG[count+1];    // выделяю блок памяти размером с на один FIG больше чем count
      for (i=0; i<count; i++)
       {
         *(ptr+i)=*mas[i];              
       }
       for (i=0; i<count; i++)
       {
         delete[]mas[i];                    // так как уже слили значение mas[i] в ptr то от лишние можно и избавиться
       }
    mas=ptr;
    delete[]ptr;       // теперь просто mas присваиваем значение указателя на массив 
//с длиной на 1 больше чем mas предыдущий....


 }
}


Народ!!! Разъясните где ошибаюсь!!!!

Автор: codelord 24.12.2006, 23:43
ты бы написал в чем ошибка. или как ?

Автор: darkness 24.12.2006, 23:46
codelord,  ругается на 
строку:
Код

mas=ptr;


 Lvalue required


Автор: codelord 25.12.2006, 00:09
Цитата(darkness @  24.12.2006,  19:08 Найти цитируемый пост)
    mas=ptr;    delete[]ptr;  

можешь приравнять как *mas=ptr, 
только зачем если ты все нафиг удаляешь в конце. 
что то мне не очень понятно. Объясни смысл всего что ты делаешь. мне кажется 
что-то не так. 

Автор: zkv 25.12.2006, 00:28
Цитата(darkness @  24.12.2006,  23:08 Найти цитируемый пост)
FIG *mas[2];


Цитата(darkness @  24.12.2006,  23:08 Найти цитируемый пост)

Народ!!! Разъясните где ошибаюсь!!!!


Цитата(darkness @  24.12.2006,  23:46 Найти цитируемый пост)
mas=ptr;

 в данном случае mas это константный указатель на начало массива FIG *[2], естественно компилятору не нравится, что ему пытаются что то присвоить.
вообще, код немного непонятный smile

Автор: darkness 25.12.2006, 00:29
codelord, при нажатии n-ый раз на кнопку  в n-ый элемент массива mas  запиываются несколько интовских значений ...
Но если мы в размер, тот который мы выделили для массива, уже не вписываемся, следовательно его надо расширить.... чтобы программа продолжала корректно работать...

Автор: zkv 25.12.2006, 00:46
чисто интуитивно полагаю, что вы хотели получить нечто такое:
Код

struct FIG
{
  int X1, Y1, type;
 };


FIG *mas = new FIG[2];

int count=0;
...........
............
..........
void __fastcall TForm1::Button2Click(TObject *Sender)
{
mas[count].X1=135;
 mas[count].Y1=40;
 mas[count].type=1;
 count++;
// âàï
 if (count>=2)
 {
  FIG *ptr=new FIG[count+1];    // выделяю блок памяти размером с на один FIG больше чем count
  for (i=0; i<count; i++)
  {
   ptr[i] = mas[i];              
  }
  delete[]mas;                    // так как уже слили значение mas[i] в ptr то от лишние можно и избавиться
      
  mas=ptr;
 }
}


Автор: darkness 25.12.2006, 00:49
zkv, Вы совершенно правы. Но предложенный Вами  вариант у меня тоже был...
На это он ругается на строки:

Код

ptr[i] = mas[i]; 


[C++ Error] Unit1.cpp(270): E2034 Cannot convert 'FIG *' to 'FIG'

и:
Код

 mas=ptr;


[C++ Error] Unit1.cpp(274): E2277 Lvalue required

Автор: zkv 25.12.2006, 00:52
Цитата(darkness @  25.12.2006,  00:49 Найти цитируемый пост)
zkv, Вы совершенно правы. Но предложенный Вами  вариант у меня тоже был...

а вот и неправда smile, посмотрите внимательно на мое объявление mas  smile 

Автор: darkness 25.12.2006, 01:10
zkv, да действительно!!! smile   Вы совершенно правы!
Только в процессе компиляции у меня он начал ругаться на следующие обращения к элементам струтуры  mas[count]->X1 заменил на 
mas[count].X1  -  согласился.... Можно немного уточнить эту тонкость, если несложно...

Автор: zkv 25.12.2006, 01:21
Цитата(darkness @  25.12.2006,  01:10 Найти цитируемый пост)
mas[count].X1
 а я вроде так и писал


Цитата(darkness @  25.12.2006,  01:10 Найти цитируемый пост)
Можно немного уточнить эту тонкость, если несложно... 


следующими строками
Цитата(darkness @  24.12.2006,  23:08 Найти цитируемый пост)
struct FIG
{
  int X1, Y1, type;
 };


Цитата(darkness @  24.12.2006,  23:08 Найти цитируемый пост)
    
FIG *mas[2];

вы говорите, что хотите разместить в стеке массив указателей на FIG (смешно звучит smile ) в размере 2 элементов, в таком случае запись вида: mas[i] представляет из себя указатель на FIG, а для доступа к членам-данным класса через указатель служит, как известно, operator->. В случае, если мы объявляем FIG* mas, запись вида mas[i] (эквивалентно *(mas+i) ) - это уже не указатель, а, собственно объект класса, для доступа к мемберам юзаем точку. Вообще то тема слишком обширная -  читайте книжки smile, или тут почитайте -  http://forum.vingrad.ru/topic-60932.html, а в вашем конкретном случае было бы удобней использовать, к примеру, std::vector (#include <vector> в Visual C++, в Борланде не знаю как)  

Автор: darkness 25.12.2006, 01:27
zkv, Огромное Спасибо!!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)