drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 (endret) ... linje 66: void cb_AddContact(Fl_Widget *x, void *inp) { linje 67: //kode kode linje 68: } Feilen din er i følge dev-c++ på linje 67 da... På linje 56 assigner du forøvrig en char* til en int. Dessuten ville nok ikke programmet ditt ha fungert som forventet uansett, iom at Contact-objektet ditt bare vil inneholde gamle kopier av verdiene. Jeg foreslår at du heller legger "Fl_Input"-ene dine i en container og sender med en peker til denne. Alternativt kan du endre Contact-objektet ditt til å bruke char*. (EDIT: jeg ser i ettertid at char* returnert av value() er midlertidig, så å bruke char* er nok en meget dårlig idè). For den del ser det også ut som om du vil miste både pekerne og Contact-objektet opprettet i cb_AddWindow-funksjonen når den går ut av scope, noe som i såfall vil skape stygge problemer (spesielt iom at du sender med en peker til et ikke-eksisterende Contact-objekt, objektene på heap'en tar vel kanskje fltk seg av). Nå har jeg ikke tolket koden din så veldig nøye, så det er selvsagt mulig jeg misforstår. Endret 3. juni 2005 av drall Lenke til kommentar
Kjeksen Skrevet 3. juni 2005 Forfatter Del Skrevet 3. juni 2005 (endret) Koden jeg pasta istad er ikke den samme som jeg har hjemme. Jeg la uten koden slik som jeg hadde gjort det. Får beskjed fra kompilerern at 'value' has not been declared. Det er feilen. Men kan du gi meg en eksempel på og løse dette? Endret 3. juni 2005 av Kjeksen Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 Det er nok fordi du bruker: Contact c = { FirstnameInput.value(), LastnameInput.value(), NumberInput.value() }; i stedet for: Contact c = { FirstnameInput->value(), LastnameInput->value(), NumberInput->value() }; Lenke til kommentar
Kjeksen Skrevet 3. juni 2005 Forfatter Del Skrevet 3. juni 2005 (endret) Bah såg feil..får en anna feil da ja.. 56 C:\Dev-Cpp\Untitled2.cpp invalid conversion from `const char*' to `int' står der dersom jeg skifter fra . til -> Endret 3. juni 2005 av Kjeksen Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 (endret) Den feilen har jeg nevnt i innlegget over. Du får også feil fordi du gjør "AddButton->callback(cb_AddContact, c);" i stedet for "AddButton->callback(cb_AddContact, &c);". Men som sagt er det andre feil som vil skape store problemer, selv om koden kompilerer. Endret 3. juni 2005 av drall Lenke til kommentar
Kjeksen Skrevet 3. juni 2005 Forfatter Del Skrevet 3. juni 2005 (endret) Den feilen har jeg nevnt i innlegget over. Du får også feil fordi du gjør "AddButton->callback(cb_AddContact, c);" i stedet for "AddButton->callback(cb_AddContact, &c);". Men som sagt er det andre feil som vil skape store problemer, selv om koden kompilerer. Ok..så jeg burde heller bruke vectorer da? Istedenfor struct? Selv om jeg byttet til &c så får jeg alikevell denne feilmeldingen: 56 C:\Dev-Cpp\Untitled2.cpp invalid conversion from `const char*' to `int' eh.. Endret 3. juni 2005 av Kjeksen Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 På linje 56 assigner du forøvrig en char* til en int. Dette er fordi Contact::number er en int, mens Fl_Input::value() returnerer en char*. Ok..så jeg burde heller bruke vectorer da? Istedenfor struct? For eksempel, ja. Du bør i hvertfall sende med pekere som har direkte tilgang til Fl_Input-objektene, ellers risikerer du å sende med en gammel kopi av value, eller at du sender med en char* til et minneområde som ikke eksisterer. I tillegg kan du ikke oprette objektene på stacken innenfor cb_AddWindow-funksjonen, iom at de vil opphøre å eksistere så snart funksjonen har gjort sitt. Lenke til kommentar
Kjeksen Skrevet 3. juni 2005 Forfatter Del Skrevet 3. juni 2005 På linje 56 assigner du forøvrig en char* til en int. Dette er fordi Contact::number er en int, mens Fl_Input::value() returnerer en char*. Ok..så jeg burde heller bruke vectorer da? Istedenfor struct? For eksempel, ja. Du bør i hvertfall sende med pekere som har direkte tilgang til Fl_Input-objektene, ellers risikerer du å sende med en gammel kopi av value, eller at du sender med en char* til et minneområde som ikke eksisterer. I tillegg kan du ikke oprette objektene på stacken innenfor cb_AddWindow-funksjonen, iom at de vil opphøre å eksistere så snart funksjonen har gjort sitt. okai..Hvordan skal jeg få tak i valuen på NumberInput da? Bruke en annen type input kanskje? mener jeg har sett noe som heter int input eller noe sånt. Det med minne og pekere er jeg ikke helt stabil på. Har ikke lært meg så mye der enda. Men visst du kan gi meg et par eksempel så jeg lærer noe og Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 (endret) Tja, dette burde vel fungere: #include <FL/Fl.H> #include <FL/Fl_Window.H> #include <FL/Fl_Box.H> #include <FL/Fl_Input.H> #include <FL/Fl_Button.H> #include <string> #include <iostream> struct Contact { Fl_Input *Firstname, *Lastname, *number; }; //Function declarations void cb_AddWindow(Fl_Widget *x, void*); void cb_AddContact(Fl_Widget *x, void *inp); int main (int argc, char *argv[]) { //MainWindow Fl_Window *MainWindow = new Fl_Window(300, 200, "PhoneBook"); //Buttons Fl_Button *AddButton = new Fl_Button(20, 70, 100, 30, "Add Contact"); Fl_Button *GetButton = new Fl_Button(170, 70, 100, 30, "Get Contact"); Fl_Button *QuitButton = new Fl_Button(110, 150, 70, 30, "Quit"); //Callback AddButton->callback(cb_AddWindow); MainWindow->end(); MainWindow->show(argc, argv); return Fl::run(); } //Add Contact Window void cb_AddWindow(Fl_Widget *x, void*) { //AddContact Window Fl_Window *AddContactWindow = new Fl_Window(400, 300, "Add Contact"); //Inputs Fl_Input *FirstnameInput = new Fl_Input(100, 50, 250, 25, "Firstname: "); Fl_Input *LastnameInput = new Fl_Input(100, 100, 250, 25, "Lastname: "); Fl_Input *NumberInput = new Fl_Input(100, 150, 250, 25, "Number: "); //Buttons Fl_Button *AddButton = new Fl_Button(100, 250, 100, 30, "Add Contact"); Fl_Button *OkButton = new Fl_Button(250, 250, 70, 30, "Ok"); //"static" sørger for at objektet ikke dør med funksjonen. static Contact c; c.Firstname=FirstnameInput; c.Lastname=LastnameInput; c.number=NumberInput; //Callbacks AddButton->callback(cb_AddContact, &c); AddContactWindow->end(); AddContactWindow->show(); } void cb_AddContact(Fl_Widget *x, void *inp) { Contact *c=static_cast<Contact *>(inp); std::string fname=c->Firstname->value(); std::string lname=c->Lastname->value(); std::string number=c->number->value(); std::cout << fname << " " << lname << " " << number << std::endl; } Ellers kan du enkelt og greit lage Fl_Input-pekerne dine globale, lage en global struct/container, sende en struct/container fra main, eller også lage en klasse rundt hele greia som eier pekerne/structen/containeren og funksjonene som trenger dem. Om du skal ha number som en int, bør du nok bruke en annen Fl-klasse, ja. MERK: Dersom det har seg slik at FLTK ikke tar seg av FL-objektene som er opprettet på heapen, har koden over flust med minnelekasjer. Generelt sett må man slette det man opretter med "new" ved å bruke "delete", eller "delete[]". EDIT: fikset en liten tabbe i koden. Bør kanskje nevnes at dersom du åpner flere vinduer samtidig, vil alle "Add Contact"-knappene få pekere til dataene til det siste vinduet, iom at de deler samme Contact-objekt. Endret 3. juni 2005 av drall Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 (endret) Jeg endret litt til på koden din. Denne løsningen takler flere vinduer uten problem. Jeg synes dette er en langt bedre løsning. #include <FL/Fl.H> #include <FL/Fl_Window.H> #include <FL/Fl_Box.H> #include <FL/Fl_Input.H> #include <FL/Fl_Button.H> #include <FL/fl_message.H> class AddContact_Window : public Fl_Window { Fl_Button AddButton, OkButton; Fl_Input FirstnameInput, LastnameInput, NumberInput; public: AddContact_Window() : Fl_Window(400, 300, "Add Contact"), AddButton(100, 250, 100, 30, "Add Contact"), OkButton(250, 250, 70, 30, "Ok"), FirstnameInput(100, 50, 250, 25, "Firstname: "), LastnameInput(100, 100, 250, 25, "Lastname: "), NumberInput(100, 150, 250, 25, "Number: ") {} const char* firstname() const { return FirstnameInput.value(); } const char* lastname() const { return LastnameInput.value(); } const char* number() const { return NumberInput.value(); } void AddButton_callback(Fl_Callback *cb, void *data=0) { AddButton.callback(cb, data); } }; //Function declarations void cb_AddWindow(Fl_Widget *x, void*); void cb_AddContact(Fl_Widget *x, void *inp); int main (int argc, char *argv[]) { //MainWindow Fl_Window *MainWindow = new Fl_Window(300, 200, "PhoneBook"); //Buttons Fl_Button *AddButton = new Fl_Button(20, 70, 100, 30, "Add Contact"); Fl_Button *GetButton = new Fl_Button(170, 70, 100, 30, "Get Contact"); Fl_Button *QuitButton = new Fl_Button(110, 150, 70, 30, "Quit"); //Callback AddButton->callback(cb_AddWindow); MainWindow->end(); MainWindow->show(argc, argv); return Fl::run(); } //Add Contact Window void cb_AddWindow(Fl_Widget *w, void*) { //AddContact Window AddContact_Window *AddContactWindow = new AddContact_Window; //Callbacks AddContactWindow->AddButton_callback(cb_AddContact); AddContactWindow->end(); AddContactWindow->show(); } void cb_AddContact(Fl_Widget *w, void *) { AddContact_Window *wd=static_cast<AddContact_Window *>(w->parent()); fl_message("%s %s %s", wd->firstname(), wd->lastname(), wd->number()); } I følge FLTK-dokumentasjonen destruerer Fl_Group-baserte klasser tilhørende objekter i destructoren, så om du lager callbacks som dreper vinduene burde ikke minneleksaje være noe problem, så vidt jeg forstår. Endret 3. juni 2005 av drall Lenke til kommentar
Kjeksen Skrevet 4. juni 2005 Forfatter Del Skrevet 4. juni 2005 Hmm..jeg testet å kompilere koden din. Fikk noen helt merkelige feil. De lyder sådann: multiple definition of `typeinfo for Fl_Widget' first defined here multiple definition of `typeinfo name for Fl_Widget' first defined here multiple definition of `typeinfo for Fl_Group' first defined here multiple definition of `typeinfo name for Fl_Group' og osv. Men ingen linjenummer ble nevnt.. Lenke til kommentar
drall Skrevet 4. juni 2005 Del Skrevet 4. juni 2005 Det kompilerer fint her med g++ 3.4 og fltk 1.1.6. Lenke til kommentar
Kjeksen Skrevet 4. juni 2005 Forfatter Del Skrevet 4. juni 2005 Ok. Jeg bruker Dev-C++ nå. Hvilken er den beste IDE til Windows? Må prøve noe annet enn Dev. Lenke til kommentar
Dead_Rabbit Skrevet 4. juni 2005 Del Skrevet 4. juni 2005 (endret) Prøvde MinGWStudio en liten stund. Det var ikke så værst. Edit: Men nå bruker jeg vim som tekstredigerinsprogram, g++ som kompilator(og ld som linker, seff) og gdb som debuggingsprogram. Funker fett! Dessuten er det mye raskere å editere filer med program som vim og emacs, enn med et IDE. Endret 4. juni 2005 av zirener Lenke til kommentar
GenericName Skrevet 4. juni 2005 Del Skrevet 4. juni 2005 (endret) ... Endret 11. januar 2011 av Token Lenke til kommentar
Dead_Rabbit Skrevet 4. juni 2005 Del Skrevet 4. juni 2005 (endret) Jeg hadde både vim og emacs da jeg kjørte Win XP.. Edit: Tror jeg skal gjøre meg litt klarere jeg: Nei! Det er ikke bare for Linux. Endret 4. juni 2005 av zirener Lenke til kommentar
GenericName Skrevet 4. juni 2005 Del Skrevet 4. juni 2005 (endret) ... Endret 11. januar 2011 av Token Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå