Gå til innhold

Bruk av string ved FLTK


Anbefalte innlegg

...
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 av drall
Lenke til kommentar
Videoannonse
Annonse

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 av Kjeksen
Lenke til kommentar

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 av drall
Lenke til kommentar
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 av Kjeksen
Lenke til kommentar
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
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

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 av drall
Lenke til kommentar

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 av drall
Lenke til kommentar

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

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 av zirener
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...