Witam, chciałbym z góry powiedzieć że kodu jest duży i czasami kod działa super nic się nie dzieje, a czasami wywala się całkowicie z błędem i zawsze wskazuje na koniec funkcji odczytującej dane z pliku:
Debug Assertion Failed:
bla bla bla
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Kod:
Zacznijmy od struktur:
typedef struct{
std::string tytul,opis;
short int godzina,minuta,p_godzina,p_minuta,dzien,miesiac,rok,ID;
} Wydarzenie;
typedef struct{
std::string username,password,znak_zodiaku,miasto,horoskop;
int dzien_urodznia, miesiac_urodzenia, rok_urodzenia;
Pogoda pogoda;
Biorytm biorytm;
} Profil;
typedef struct{
std::string kawalek_opisu;
short int ID;
GtkWidget* Labels[4];
GtkWidget* Vbox;
GtkWidget* Hboxs[2];
GtkWidget* Event_Box;
} NowyWidget;
Teraz tak naprawdę nie wiem co Wam podać bo kodu jest dużo i sam się nie potrafię zorientować co jest źle, ale mam nadzieję, że pomożecie:
Globalne vectory:
std::vector<Wydarzenie> zbior_wydarzen;
std::vector<NowyWidget> zbior_widgetow;
Zapis/Odczyt z pliku:
int Zapis_Wydarzen(std::vector<Wydarzenie> wydarzenia,Profil profil)
{
unsigned rozmiar = wydarzenia.size();
std::cout << rozmiar << std::endl;
std::ofstream do_pliku;
std::string nazwa_pliku = "Events/";
nazwa_pliku += profil.username;
nazwa_pliku += "-events.event";
do_pliku.open(nazwa_pliku.c_str(),std::ofstream::binary | std::ofstream::trunc);
//if (do_pliku.fail()){
// if (do_pliku.is_open()) do_pliku.close();
// return -1;
//}
do_pliku.write((char*)&rozmiar,sizeof(unsigned));
for (unsigned i = 0; i < wydarzenia.size(); ++i) do_pliku.write((char*)&wydarzenia[i],sizeof(Wydarzenie));
// if (do_pliku.bad()) {
// if (do_pliku.is_open()) do_pliku.close();
// return -2;
//}
if (do_pliku.is_open()) do_pliku.close();
//if (do_pliku.fail()) return -3;
return 0;
}
int Odczyt_Wydarzen(std::vector<Wydarzenie>* wydarzenia,Profil profil)
{
int ilosc = 0;
if (!wydarzenia->empty()) wydarzenia->clear();
Wydarzenie temp;
std::ifstream z_pliku;
std::string sciezka;
sciezka = "Events/";
sciezka += profil.username;
sciezka += "-events.event";
z_pliku.open(sciezka.c_str(),std::ifstream::binary);
//if(!z_pliku.is_open()) return -1;
z_pliku.read((char*)&ilosc,sizeof(int));
std::cout << ilosc << std::endl;
// if (z_pliku.bad()) {
// if (z_pliku.is_open()) z_pliku.close();
// return -2;
//}
for (int i = 0; i < ilosc; ++i)
{
memset((void*)&temp,0,sizeof(Wydarzenie));
z_pliku.read((char*)&temp,sizeof(Wydarzenie));
wydarzenia->push_back(temp);
}
//if (z_pliku.bad()) {
// if (z_pliku.is_open()) z_pliku.close();
// return -2;
//}
if (z_pliku.is_open()) z_pliku.close();
return 0;
}
Chciałbym powiedzieć, że prawie cały czas czyszczę wektor i umieszczam w nim nowe wartości(będzie to zresztą zaraz widać):
void Zapisz_wydarzenie(GtkWidget* widget, gpointer data)
{
Profil* dad = (Profil*) data;
GtkTextIter poczatek;
GtkTextIter koniec;
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(widok_bufor),&poczatek,&koniec);
Wydarzenie temp;
guint dzien,miesiac,rok;
gtk_calendar_get_date(GTK_CALENDAR(Kalendarz),&rok,&miesiac,&dzien);
temp.dzien = dzien;
temp.godzina = atoi(gtk_entry_get_text(GTK_ENTRY(Entrys[1])));
temp.ID = zbior_wydarzen.size();
temp.miesiac = miesiac;
temp.minuta = atoi(gtk_entry_get_text(GTK_ENTRY(Entrys[2])));
temp.opis = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(widok_bufor),&poczatek,&koniec,FALSE);
std::cout << temp.opis << std::endl;
temp.p_godzina = atoi(gtk_entry_get_text(GTK_ENTRY(Entrys[3])));
temp.p_minuta = atoi(gtk_entry_get_text(GTK_ENTRY(Entrys[4])));
temp.rok = rok;
temp.tytul = gtk_entry_get_text(GTK_ENTRY(Entrys[0]));
zbior_wydarzen.push_back(temp);
Zapis_Wydarzen(zbior_wydarzen,*dad);
PokazZdarzenia(Kalendarz,data);
}
Funkcja Pokaz_Zdarzenia:
void PokazZdarzenia(GtkWidget* calendar, gpointer data)
{
Odczyt_Wydarzen(&zbior_wydarzen,*dane);
zbior_widgetow = Laduj_widgety(zbior_wydarzen);
for (unsigned i = 0; i < zbior_widgetow.size(); ++i)
{
if (zbior_wydarzen[i].dzien == dzien && zbior_wydarzen[i].miesiac+1 == miesiac && zbior_wydarzen[i].rok == rok)
{
gtk_box_pack_start(GTK_BOX(VboxScroll),zbior_widgetow[i].Event_Box,FALSE,FALSE,0);
g_signal_connect(G_OBJECT(zbior_widgetow[i].Event_Box), "button_press_event",G_CALLBACK(test_a),&zbior_widgetow[i]);
}
}
}
Funckja Laduj_widgety:
std::vector<NowyWidget> Laduj_widgety(std::vector<Wydarzenie> wydarzenia)
{
std::vector<NowyWidget> all;
NowyWidget temp;
for (unsigned i = 0; i < zbior_wydarzen.size(); ++i)
{
temp = nowy_widget_init(zbior_wydarzen[i]);
all.push_back(temp);
}
return all;
}
Kod zawsze wyrzuca się na samym końcu funkcji: OdczytWydarzen.
Kody są poskracane do tylko najważniejszych części żeby było łatwiej patrzeć. Wiem ,że kodu jest dużo i pewnie nie będzie Wam się chciało czytać, ale jeśli ktokolwiek znalazłby czas to był bym wdzięczny.
Z góry dziękuję.