вектор
От: alexey_mas  
Дата: 17.11.06 16:48
Оценка: :)
мучаюсь с вектором
значит использую его так:

в main.h :

struct Customer
{
Customer()
{
  idcustomer=0,
  surname=0,
  name=0,
  midname=0,
  birthday=0,
  doc_type=0 ,
  doc_seria=0 ,
  doc_number=0,
  doc_dtget=0,
  doc_from=0,
  full_name=0,
  resident=0,
  country=0,
  codeokpo=0,
  dt_open=0,
  town=0,
  address=0;
}

int idcustomer;
String surname;
String name;
String midname;
DATE birthday;
int doc_type;
String doc_seria;
String doc_number;
DATE doc_dtget;
String doc_from;
String full_name;
String resident;
int country;
String codeokpo;
DATE dt_open;
String town;
String address;
};

typedef vector<Customer> v;


в main.cpp


v global_vect; 

void __fastcall TForm2::Button1Click(TObject *Sender)
{
global_vect.clear();

int i,j;
      int k=0;
      global_vect.push_back(Customer());

            if (PQntuples(res)>0)
          {

        for (i = 0; i < PQntuples(res); i++)
            {
            if (i>18) {break;}  //добавил чтобы не вылетало

         for (j = 0; j < PQnfields(res); j++)
                   {
                   k++;
                     switch(j)
                        {
                         case 0:
                       global_vect[k].idcustomer=StrToInt(PQgetvalue(res, i, j));
                         break;
                         case 1:
                       global_vect[k].surname=PQgetvalue(res, i, j);
                         break;
                         case 2:
                       global_vect[k].name=PQgetvalue(res, i, j);
                         break;
                         case 3:
                        global_vect[k].midname=PQgetvalue(res, i, j);
                         break;
                         case 4:
                       //global_vect[k].birthday=(PQgetvalue(res, i, j));
                         break;
                         case 5:
                         global_vect[k].doc_type=StrToInt(PQgetvalue(res, i, j));
                         break;
                         case 6:
                         global_vect[k].doc_seria=PQgetvalue(res, i, j);
                         break;
                         case 7:
                         global_vect[k].doc_number=PQgetvalue(res, i, j);
                         break;
                         case 8:
                        // global_vect[j].doc_dtget=PQgetvalue(res, i, j);
                         break;
                         case 9:
                         global_vect[k].doc_from=PQgetvalue(res, i, j);
                         break;
                         case 10:
                         global_vect[k].full_name=PQgetvalue(res, i, j);
                         break;
                         case 11:
                         global_vect[k].resident=PQgetvalue(res, i, j);
                         break;
                         case 12:
                         global_vect[k].country=StrToInt(PQgetvalue(res, i, j));
                         break;
                         case 13:
                         global_vect[k].codeokpo=PQgetvalue(res, i, j);
                         break;
                         case 14:
                      // global_vect[k].dt_open=PQgetvalue(res, i, j);
                         break;
                         case 15:
                         global_vect[k].town=PQgetvalue(res, i, j);
                         break;
                         case 16:
                         global_vect[k].address=PQgetvalue(res, i, j);
                         break;
                      }
                    }
            }
          }
}


Если вот эту строку убрать if (i>18) {break;}
то при строках больше 18 при операции global_vect[k].codeokpo=PQgetvalue(res, i, j);
вылетает с ошибкой Access violation. при этом k=340.


Нужно ли выделять как то память под вектор?
Re: вектор
От: rg45 СССР  
Дата: 17.11.06 17:00
Оценка:
"alexey_mas" <60897@users.rsdn.ru> wrote in message news:2220966@news.rsdn.ru...
> мучаюсь с вектором
> [snipped]
> Нужно ли выделять как то память под вектор?

Конечно нужно.
Либо в момент создания:
v global_vect(777);


Либо изменять размер в процессе заполнения:
global_vect.resize(k);
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: вектор
От: rg45 СССР  
Дата: 17.11.06 17:09
Оценка:
"rg45" <49596@users.rsdn.ru> wrote in message news:2220981@news.rsdn.ru...
>
Кроме того, для наполнения вектора данными есть операции insert и push_back, они автоматически увеличивают размер вектора.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: вектор
От: Максим2006 Беларусь  
Дата: 17.11.06 17:20
Оценка:
Здравствуйте, rg45, Вы писали:


R>"alexey_mas" <60897@users.rsdn.ru> wrote in message news:2220966@news.rsdn.ru...

>> мучаюсь с вектором
>> [snipped]
>> Нужно ли выделять как то память под вектор?

R>Конечно нужно.

R>Либо в момент создания:
R>
R>v global_vect(777);
R>


Либо попозже
global_vect.reserve(777);


R>Либо изменять размер в процессе заполнения:

R>
R>global_vect.resize(k);
R>
Re[2]: вектор
От: alexey_mas  
Дата: 17.11.06 17:21
Оценка:
Здравствуйте, rg45, Вы писали:


R>"alexey_mas" <60897@users.rsdn.ru> wrote in message news:2220966@news.rsdn.ru...

>> мучаюсь с вектором
>> [snipped]
>> Нужно ли выделять как то память под вектор?

R>Конечно нужно.

R>Либо в момент создания:
R>
R>v global_vect(777);
R>


попробовал v global_vect(55555);
тоже самое


R>Либо изменять размер в процессе заполнения:

R>
R>global_vect.resize(k);
R>


так таже проблема что и при push_back
делаю так

 case 1:
  global_vect.push_back(Customer());
  global_vect[k].surname=PQgetvalue(res, i, j);
case 2:
  global_vect.push_back(Customer());
  global_vect[k].name=PQgetvalue(res, i, j);




после заполнения пробую что то вытащить

ShowMessage(global_vect[1].idcustomer);
ShowMessage(global_vect[2].surname);
ShowMessage(global_vect[3].name);
ShowMessage(global_vect[11].full_name);

выдает все значения 0;

Если повторно нажать кнопку — т.е. повторно обрабатывается код — то все значения на месте
Re[3]: вектор
От: Максим2006 Беларусь  
Дата: 17.11.06 17:30
Оценка:
Здравствуйте, alexey_mas, Вы писали:

_>попробовал v global_vect(55555);

_>тоже самое
значит k было больше 55554

R>>Либо изменять размер в процессе заполнения:

R>>
R>>global_vect.resize(k);
R>>


_>так таже проблема что и при push_back

_>делаю так

_>
_> case 1:
_>  global_vect.push_back(Customer()); // добавить один элемент в конец вектора
_>  global_vect[k].surname=PQgetvalue(res, i, j); // изменить значение k-го элемента
_>case 2:
_>  global_vect.push_back(Customer());
_>  global_vect[k].name=PQgetvalue(res, i, j);
_>

определись, в какой элемент когда писать нужно (k пляшет как ему вздумается)

[]
Re: вектор
От: Максим2006 Беларусь  
Дата: 17.11.06 17:42
Оценка: -1
Здравствуйте, alexey_mas, Вы писали:

_>мучаюсь с вектором


    for (j = 0; j < PQnfields(res); j++)
    {
        global_vect.push_back();
        Customer& rCustomer = global_vect.back();
        switch(j)
        {
            case XXX:
                rCustomer.field = value;
            /*...*/
            default:
            global_vect.pop_back();
        }
    }


подойдёт?
Re[2]: вектор
От: alexey_mas  
Дата: 17.11.06 17:43
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Здравствуйте, alexey_mas, Вы писали:


_>>мучаюсь с вектором


М>
М>    for (j = 0; j < PQnfields(res); j++)
М>    {
М>        global_vect.push_back();
М>        Customer& rCustomer = global_vect.back();
М>        switch(j)
М>        {
М>            case XXX:
М>                rCustomer.field = value;
М>            /*...*/
М>            default:
М>            global_vect.pop_back();
М>        }
М>    }
М>


М>подойдёт?


попробую , спасибо.
Re[2]: вектор
От: Roman Odaisky Украина  
Дата: 17.11.06 17:53
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>
global_vect.push_back();

М>подойдёт?

-1!

Стандарт смотрел?
До последнего не верил в пирамиду Лебедева.
Re[3]: вектор
От: Максим2006 Беларусь  
Дата: 18.11.06 08:35
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Максим2006, Вы писали:


М>>
global_vect.push_back();

М>>подойдёт?

RO>-1!

Да, ошибочка вышла. Но, думаю, что alexey_mas легко сможет её исправить (ведь он уже использовал правильный вариант в своём первом посте)

RO>Стандарт смотрел?

стандарт-то тут при чём, грозный стандарзяка? Я мог либо забыть, либо не знать. Зачем лезть в стандарт, если забыл (на то хелп есть или код под рукой)? А если не знал, то по стандарту вектор изучать — это как-то... опрометчиво
Re[3]: вектор
От: LuciferMoscow Россия  
Дата: 18.11.06 09:33
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Либо попозже

М>
М>global_vect.reserve(777);
М>

Это действие никак не изменяет размер вектора
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.