мучаюсь с вектором
значит использую его так:
в 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.
Нужно ли выделять как то память под вектор?
"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
"rg45" <49596@users.rsdn.ru> wrote in message
news:2220981@news.rsdn.ru...
>
Кроме того, для наполнения вектора данными есть операции insert и push_back, они автоматически увеличивают размер вектора.
Posted via RSDN NNTP Server 2.0
Здравствуйте, 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>
Здравствуйте, 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;
Если повторно нажать кнопку — т.е. повторно обрабатывается код — то все значения на месте
Здравствуйте, 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 пляшет как ему вздумается)
[]
Здравствуйте, 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();
}
}
подойдёт?
Здравствуйте, Максим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();
М> }
М> }
М>
М>подойдёт?
попробую , спасибо.
Здравствуйте, Максим2006, Вы писали:
М>global_vect.push_back();
М>подойдёт?
-1!
Стандарт смотрел?
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Максим2006, Вы писали:
М>>global_vect.push_back();
М>>подойдёт?
RO>-1!
Да, ошибочка вышла. Но, думаю, что alexey_mas легко сможет её исправить (ведь он уже использовал правильный вариант в своём первом посте)
RO>Стандарт смотрел?
стандарт-то тут при чём, грозный стандарзяка?

Я мог либо забыть, либо не знать. Зачем лезть в стандарт, если забыл (на то хелп есть или код под рукой)? А если не знал, то по стандарту вектор изучать — это как-то... опрометчиво
Здравствуйте, Максим2006, Вы писали:
М>Либо попозже
М>М>global_vect.reserve(777);
М>
Это действие никак не изменяет размер вектора
... << RSDN@Home 1.1.4 beta 4 rev. 358>>