Avatar billede babafisk Nybegynder
07. maj 2003 - 09:52 Der er 11 kommentarer og
1 løsning

Lommeregner virker ikke

Jeg har lavet denne lommeregner:

int intTal1,intTal2;

void CVcalcDlg::OnPlus()
{
    CString strInput,strFunk;
    strFunk="plus";
    GetDlgItemText(IDC_FELT,strInput);
    if(strInput = "") {
        MessageBox("Indtast venligst et tal i feltet","Fejl!",MB_ICONERROR);
    }
    else {
        intTal1 = atoi(strInput);
        SetDlgItemText(IDC_FELT,"");       
    }
}



void CVcalcDlg::OnMinus()
{
    CString strInput,strFunk;
    strFunk="minus";
    GetDlgItemText(IDC_FELT,strInput);
    if(strInput == "") {
        MessageBox("Indtast venligst et tal i feltet","Fejl!",MB_ICONERROR);
    }
    else {
        intTal1 = atoi(strInput);
        SetDlgItemText(IDC_FELT,"");
    }
}


void CVcalcDlg::OnGange()
{
    CString strInput,strFunk;
    strFunk="gange";
    GetDlgItemText(IDC_FELT,strInput);
    if(strInput == "") {
        MessageBox("Indtast venligst et tal i feltet","Fejl!",MB_ICONERROR);
    }
    else {
        intTal1 = atoi(strInput);
        SetDlgItemText(IDC_FELT,"");
    }
}


void CVcalcDlg::OnDivider()
{
    CString strInput,strFunk;
    strFunk=("divider");
    GetDlgItemText(IDC_FELT,strInput);
    if(strInput == "") {
        MessageBox("Indtast venligst et tal i feltet","Fejl!",MB_ICONERROR);
    }
    else {
        intTal1 = atoi(strInput);
        SetDlgItemText(IDC_FELT,"");
    }
}

void CVcalcDlg::OnLigmed()
{
   
    int intResultat;
    CString strFunk,strOutput,strInput;
    GetDlgItemText(IDC_FELT,strInput);
    if(strInput == ""){
        MessageBox("Indtast venligst et tal i feltet","Fejl!",MB_ICONERROR);
    }
    else {
        intTal2 = atoi(strInput);
    }   
    if(strFunk="plus") {
        intResultat = intTal1 + intTal2;
    } else if(strFunk="minus") {
        intResultat = intTal1 - intTal2;
    } else if(strFunk="gange") {
        intResultat = intTal1 * intTal2;
    } else if(strFunk="divider") {
        intResultat = intTal1 / intTal2;
    }
    strOutput = itoa(intResultat,NULL,10);
    SetDlgItemText(IDC_FELT,strOutput);
}

Jeg får ikke nogen fejl når jeg compiler, men programmet virker ikke. Jeg forstår det ikke helt for når jeg bruger plus kommer den med fejlmedlelsen, at der ikke står noget i feltet ligemeget hvad der står og hvis jeg bruger en af de andre siger den at der er fejl i hukkomelsen. Jeg håber at i kan hjælpe mig.
Avatar billede segmose Nybegynder
07. maj 2003 - 10:14 #1
Er det kun i plus eller også i minus, prøv med at sætte forskellige tekster på dine fejlmeddelelser så du kan se hvor fejlen opstår om det er i plus eller i ligmed.
Avatar billede babafisk Nybegynder
07. maj 2003 - 10:17 #2
det har jeg lige prøvet og det er i plus delen den melder fejl
Avatar billede mbulow Nybegynder
07. maj 2003 - 10:46 #3
Den første bøf jeg lige har fundet er at du i halvdelen af dine if-sætninger sammenligner med =, og i den anden halvdel med ==

Det skal være ==
Avatar billede babafisk Nybegynder
07. maj 2003 - 10:48 #4
det fik rettet den ene fejl, den med plus delen, men jeg får stadig den windows fejl hvor den siger at hukkomelsen ikke kunne "written"
Avatar billede mbulow Nybegynder
07. maj 2003 - 11:03 #5
En anden fejl er...

Du bruger en CString som du kalder strFunk, til at overføre beregningens type fra en af +-*/ funktionerne, til OnLigmed funktionen. Right?

Problemet er bare at dine strFunk variable altid er lokale i de enkelte funktioner... Dvs i OnPlus, gør du følgende:

1) Opretter variablen strFunk.
2) Giver den værdien "plus"
3) Forlader funktionen, hvorefter variablen går ud af scope, og 'forsvinder'.

Når du så kommer ned i OnLigmed, opretter du en ny strFunk, der endnu ikke har fået tildelt en værdi, og bruger den.



Opret i stedet strFunk-variablen i CVcalcDlg-klassen, så alle funktionerne deler den samme.
Avatar billede mbulow Nybegynder
07. maj 2003 - 11:15 #6
Så... Jeg lavede lige hurtigt et projekt og smed dit kode i... Nu virker det.

Der hvor det gik rigtig galt (Memory could not be written) var i bunden af din OnLigmed hvor der står:

strOutput = itoa(intResultat, NULL, 10);

itoa's parametre er:
1) Variablen med værdien der skal konverteret til en streng
2) En streng-buffer der modtager værdien
3) Talsystemet der skal bruges i konverteringen

Så er det rigtig nok at funktionen fist også nok returnerer en pointer til streng-bufferen, men det betyder ikke at du bare kan skrive NULL, som 2. parameter.



En anden måde der virker bedre er at skrive:

strOutput.Format("%d", intResultat);

Den virker lidt lige som de gode gamle serie af printf-funktioner.



PS!!! Efter at have lavet de tre ændringer som jeg nu har postet virker regnemaskinen hos mig
Avatar billede babafisk Nybegynder
07. maj 2003 - 11:20 #7
tak skal du have nu virker det..... opret lige et svar så du kan få point
Avatar billede mbulow Nybegynder
07. maj 2003 - 11:22 #8
Mit sidste indlæg, hvor jeg skrev at jeg fik det til at virke, er allerede et svar, så her er et "Fortsat svar" ;) hehe

Happy coding
-mbulow
Avatar billede segmose Nybegynder
07. maj 2003 - 11:33 #9
Babafisk du burde have fået en milliard warnings for de tildelinger i if, har du slået alle warnings fra?
Warnings kunne måske også fortælle at strFunc ikke var initialiseret, det er jeg dog ikke 100 på da det er en classe.
Avatar billede babafisk Nybegynder
07. maj 2003 - 11:58 #10
jeg har ikke slået nogen warnings fra men der kommer ingen
Avatar billede segmose Nybegynder
07. maj 2003 - 13:59 #11
Nu ved jeg ikke hvilken compiler du bruger men et eller andet sted burde der stå noget med warnings, prøv din hjælp.

Hvis det er en kommandolinie værktøj er det vist nok parameteren

-wall

warning all, eller du kan prøve at leder efter wall
Avatar billede babafisk Nybegynder
07. maj 2003 - 14:45 #12
jeg bruger MVC++ 6.0 og jeg er begyndt at få nogle warnings fordi jeg kan miste data under konverteringen af mine tal
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester