Как создать и работать с массивом указателей структуры ?
К примеру есть структура:
int a;
int b;
char c[20];
}
1 - Как создать массив указателей на элементы этой структуры? Так как мне нужно создавать элементы динамически при считывании инфы из файла.
2 - Как выделять память под каждый новый элемент массива структуры этой?
Очень срочно нужна помощь, за ранее спасибо.
количество_структур можешь получить сразу прочитав размер файла и разделив на размер структуры (sizeof(s)) т.к. размер уструктуры у тубя фиксированный.
обращение к элементу array[индекс_структуры].a
удаление delete [] array;
А читать надо было не про структуры а про указатели
а что мне делать при добавлении в программе еще одного элемента структуры? Тупо переписывать имеющийся массив структур в новую созданную структура с размером +1 ? или можно как-то сделать красивее, к примеру типа использования realloc() ?
Ну а можно ещё например через std::vector это сделать - попроще будет.
вот объявляю структуру и указатель на нее
{
int id;
int day;
int month;
int year;
int hour;
int minute;
char route[26];
int price;
int totalPlaces;
int busyPlaces;
}*flight;
выделяю под нее память (под 3 элемента) - выделяется вроде норм
считываю данные из файла - считывается без ошибок
считанные данные заносятся в структуру по след образцу, N - это число элементов в структуре, оно увеличивается на +1 при записи новой строки из файла, то есть при добавлении нового элемента в массив структур
но при выводе структуры на экран выводится ерунда какая-то
нормально выводятся только данные из последней прочитанной строки, но они разбросаны по всем 3 элементам массива структур, а в остальных элементах структур мусор выводится
возможно не совсем понятно объяснил, но все же HELP ME )
решил последовать вашему совету и использовать для массива структур vector.
подскажите пожалуйста как мне объявить vector на структуру и каким будет обращение к нему, если я правильно понимаю то будет так:
{
int id;
int day;
int month;
int year;
int hour;
int minute;
char route[26];
int price;
int totalPlaces;
int busyPlaces;
}*flight;
vector <Flight> *f;
f.day=10;
при таком объявлении у меня уже будет массив структур типа Flight в векторе или нет? %)
2. Зачем тебе указатель на вектор? Тебе нужен собственно вектор:
int id;
int day;
int month;
int year;
int hour;
int minute;
char route[26];
int price;
int totalPlaces;
int busyPlaces;
} FLIGHT, *LPFLIGHT;
vector<FLIGHT> flights(размер_массива);
[QUOTE=Antosh]
при таком объявлении у меня уже будет массив структур типа Flight в векторе или нет? %)
[/QUOTE]
Вектор - это и есть, по сути, массив. Только обернутый в класс.
P.S. Какая конечная цель?
подскажите как правильно объявлять структуру для компилятора VS 2008. На мое объявление он пишет:
вот мое объявление:
(id(_id), day(_day), month(_month), year(_year), hour(_hour), minute(_minute), route(_route), price(_price), totalPlaces(_tp), busyPlaces(_bp)){}
и еще ругается на это же объявление:
Конечная цель: читать из файла инфу и писать ее в вектор структур, затем с ней что-то делать (добавлять, удалять, изменять) и писать измененный вектор структур в файл.
В третьих, route лучше копируйте целиком, а не просто указатель переписывайте.
Вместо char[26] сделаю наверное string.
Но появилась новая проблема)
Если убрать конструктор инициализации структуры, то могу сделать vector.resize(5); (к примеру)
А вот если он есть, то vector.resize(5); уже не проходит, пишет ошибку:
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector(712): при компиляции функции-члена "<Нет данных>" класса <Нет данных>
как мне в данном случае с наличием конструктора инициализации структуры увеличивать размер вектора ?
Вообще, личный совет: старайтесь для практически любого класса (в пределах разумного, конечно) создавать конструктор по умолчанию, инициализирующий конструктор и конструктор копирования. Это вас убережет от многих ошибок такого рода.
P.S. arrjj, опередил.)
я перегружаю операторы << и >> для потокового чтения и записи файл. Каким образом мне обращаться к конкретному элементу в структуре для того чтобы изменить именно его значение? (к примеру нужно изменить только день)
В общей сложности у меня есть еще класс Schedule :), в котором и находятся структура и вектор, а также методы для работы с элементами структуры:
{
private:
struct Flight
{
int id;
int day;
int month;
int year;
int hour;
int minute;
string route;
int price;
int totalPlaces;
int busyPlaces;
Flight(){};
Flight (int _id, int _day, int _month, int _year, int _hour, int _minute, string _route, int _price, int _tp, int _bp): id(_id), day(_day), month(_month), year(_year), hour(_hour), minute(_minute), str(_route), price(_price), totalPlaces(_tp), busyPlaces(_bp){}
};
vector <Flight> vecf;
public:
Schedule();
void ReadFile(); //загрузка расписания из файла
void WriteFile(); //выгрузка вектора в файл
void AddFlight(); //добавить рейс
void EditFlight(); //редактировать рейс
void DelFlight(); //удалить рейс
void ShowFlight(int i); //вывод одного рейса
void ShowFlights(); //вывод всех рейсов
//void FindFlightOnDate(); //найти рейсы по дате
void FindFlightOnRoute(); //найти рейсы по направлению
void NextFlight(); //ближайшие рейсы, 3-4 рейса которые соответствуют маршруту
int CheckDate(char b[11]); //проверка даты на правильность
int CheckTime(char b[6]); //проверка времени на правильность
void SetId(int id){}
int GetId(){}
void SetDay(int day){}
int GetDay(){}
void SetMonth(int month){}
int GetMonth(){}
void SetYear(){}
int GetYear(){}
void SetHour(int hour){}
int GetHour(){}
void SetMinute(int id){}
int GetMinute(){}
void SetRoute(string route){}
char* GetRoute(){}
void SetPrice(int Price){}
int GetPrice(){}
void SetTotalPlaces(int totalPlaces){}
int GetTotalPlaces(){}
void SetBusyPlaces(int vusyPlaces){}
int GetBusyPlaces(){}
void SetStr(int i, string s){}
~Schedule();
};
Такое обращение норм работает в методе класса.
Но у меня struct Flight и vector vecf в методе доступа Private и вот таким образом
я не могу обратиться к элементу структуры в перегруженных операторах << и >>.
Или добавь пару методов класса для работы с элементами вектора.
И где у тебя перегружены операторы <<>>?
операторы перегружены в отдельном файле в котором и определен код всех методов класса Schedule (файл schedule.cpp).
вот пример перегрузки оператора >> (код не весь, тут он обрабатывает строку из файла и должен присваивать элементам в структуре значения. можно конечно тут описать написать vecf.push_back(Flight(значения)); но все равно нужно как-то реализовать изменение отдельных элементов структуры) :
{
vecf[0].day=12;
}
так не прокатывает. и еще как мне передавать сюда вместо 0 изменяемый индекс i ?
на счет создать пару методов для работы с вектором, я как-то не совсем понимаю что именно в этих методах описать :confused:
таки VC его по дефолту не делает что ли? должен же компилятором создаваться, если оного нет.
так он создается по умолчанию компилятором, но иногда нет, в данном случае был создан конструктор с параметрами и уже автоматов пустой конструктор не создавался компилятором пока я его не описал руками
Конструктор по умолчанию создается только если не указан никакой другой. Я еще раз подчеркиваю - это не требование, а совет, дабы не напарываться на глупые ошибки.