Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Har et siste spørsmål, får feilen "vector subscript out of range" på denne snutten. Kan vær jeg ikke ser det fordi jeg er utrolig sliten, men flere øyne på saken kan kanskje hjelpe også!

 

Det er alltid en god ide 1) å påpeke eksakt hvor feilen inntreffer 2) å poste det minste komplette eksempelet som illustrerer problemet. Snutten som du postet forteller ingenting om verdien til trigger. Hvordan skal man hjelpe deg da?

 

for(b=0; b<length[trigger]; b++) {
   randint = (rand()%length[trigger])+1;
   if ( randint < length[trigger]/2 ) {
       sentence[b]=context[trigger][b]; 
   } else{
       randint2 = (rand()%words.size())+1;
       sentence[b]=words[randint2];
   } 
}

 

Selv med så lite informasjon som er tilgjengelig, ser man at det er en off-by-one feil i indeksering av words (randint2 kan være lik words.size() => 1 for mye i indeksen).

Endret av zotbar1234
Lenke til kommentar
  • 2 uker senere...
Videoannonse
Annonse

Hei igjen! Fikset feilen, men driver nå å fikler med å konvertere std::string til lpcwstr slik at jeg kan bruke speech APIen til microsoft, SAPI.

 

Har denne koden her, men det vil bare ikke fungere..

Input er string2 som er en std::string og output skal være result.

 

std::wstring s2ws(const std::string& string2);
{
int len;
int slength = (int)string2.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, string2.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, string2.c_str(), slength, buf, len);
std::wstring rstr(buf);
delete[] buf;
return rstr;
}



#ifdef UNICODE
std::wstring stemp = s2ws(string2); // Temporary buffer is required
LPCWSTR result = stemp.c_str();
#else
LPCWSTR result = string2.c_str();
#endif

Lenke til kommentar
  • 4 måneder senere...

Hvor skal egentlig "min kode" inn i et wxWidgets prosjekt i Code::Blocks?

 

Funksjonene til GUI'et ligger jo under klassenavnet, f.eks:

void AppFrame::OnButton1Click2(wxCommandEvent& event)
{
//
}

 

AppFrame ser slik ut:

class AppFrame: public wxFrame

 

Så noen som vet hvor egen kode skal inkluderes og hvordan bruke den?

Hvis jeg har en klasse som heter Test, og en funksjon i denne som heter TestFunksjon. Hvordan kan jeg kalle TestFunksjon på riktig måte i AppFrame::OnButton1Click2?

 

Har prøvd utvide klassen og inkludere og litt slikt uten hell :p

class AppFrame: public wxFrame, public Test

Lenke til kommentar
  • 11 måneder senere...
Gjest Gjest slettet-ld9eg7s96q

Kan nokon fortelje meg kva return funksjonen gjør? Forstår ikkje kvifor vi må skrive return 0; eller andre verdiar.

 

Når du implementerer en funksjon i C/C++ spesifiserer du hvorvidt denne funksjonen skal returnere en verdi. Hvis du ikke vil at funksjonen skal returnere en verdi implementerer du funksjonen som type void. For eksempel:

 

int kalkyle() { // returnerer verdien 4 (heltall int) når du kaller denne funksjonen
int verdi = 2+2;
return verdi;
}

 

eller

 

void objekt::kalkyle() {
this->verdi = 2+2;
}

Endret av Gjest slettet-ld9eg7s96q
Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q

Det er opp til programmereren å avgjøre videre hva verdien skal utføre, verdien i seg selv utfører ingen ting. All behandling av data foregår før du returnerer verdien. Du kan også returnere data som returneres av en annen funksjon igjen, f.eks:

 

int kalkyle() { // returnerer verdien 4 (heltall int) når du kaller denne funksjonen
int verdi = 2+2;
return verdi;
}

int kalkylegangerto() { // returnerer verdien 8
return kalkyle()*2;
}

 

Det er slik alle programmeringspråk er bygget opp. Man kan dele opp koden i moduler med f.eks funksjoner for at koden skal bli lettere å lese, forstå og brukes om igjen. Eksempelet jeg skrev over er jo veldig forenklet, vanligvis sender du verdier til funksjonen som videre behandles innenfor denne stacken og som lagrer resultatet eller returnerer det.

Endret av Gjest slettet-ld9eg7s96q
Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q

Hvis du bokstavelig talt skal teste for kun en verdi bruker du bare en if kontroll

 

if (var == "verdi") {
gjoernoe();
}

 

Ellers må du teste det i en if/else statement:

 

if (var == "verdi1") {
gjoernoe();
} else if (var == "verdi2") {
gjoernoeannet();
} else if (var == "verdi3") {
gjoerdetsiste();
}

Endret av Gjest slettet-ld9eg7s96q
Lenke til kommentar

Takk :)

 

Det var ikkje til denne oppgaven eg meinte men den fungerar vel til det same.

Eg trenar litt på C++ og har laga ein BMI-kalkulator. Alt funka heilt til eg byrja å skrive inn kva for ein kategori dei går under. Uansett kva tal eg førar inn, så vert alle "undervektig".

 

#include <iostream>
#include <cmath>
#include <cstdlib>
int main(){
using namespace std;

double vekt;
double lang;
double lengde;
double lengde5;
double bmi;


cout << "Kor mykje veg du? (skriv i kilogram/kg) " << endl;
cin >> vekt;
cout << "Kor lang er du? (Skriv i centimeter/cm) " << endl;
cin >> lang;

lengde = lang / 100;
lengde5 = pow(lengde,2);
bmi = vekt / lengde5;

cout << "Din BMI er på: " << bmi << endl;

if(bmi<18,5){
 cout << "Du er undervektig" << endl;
}
else if(18.5<bmi<24.9){
 cout << "Du har normalvekt" << endl;
}
else if(25<bmi<29.9){
 cout << "Du er overvektig" << endl;
}
else if(30<bmi<34.9){
 cout << "Du er under kategorien fedme" << endl;
}
else if(35<bmi<39.9){
 cout << "Du er under kategorien fedme 2" << endl;
}
else if(39.9<bmi){
 cout << "Du er under kategorien fedme 3 (ekstrem fedme)" << endl;
}

cin.get();
return 0;
}

 

Kan nokon sjå kva som er feil?

Endret av Svigermors drøm
Lenke til kommentar

Det gir lite mening å skrive

18.5<bmi<24.9

(teknisk sett vil 18.5 < bmi da evalueres, og så vil verdien av det -- enten 0 eller 1 -- sammenlignes med 24.9, og 0 og 1 er jo begge mindre enn 24.9, derfor stopper programmet ditt her.)

 

Prøv heller med

18.5 < bmi && bmi < 24.9

Lenke til kommentar

Hmm, bmi intervallene dine overlapper ikke helt. Hva skjer hvis bmi er 24.91?

 

Dessuten trenger du ikke sjekke det nedre intervallet i de andre else if testene da det allerede er sjekket i de foregående. Dvs, i den første sjekker du om den er mindre enn 18.5, da trenger du ikke sjekke om den er større en det i test 2. Det er ikke feil, bare litt smør på flesk ;)

 

Dette fikser begge deler:

 

if(bmi < 18.5){
 cout << "Du er undervektig" << endl;
}
else if(bmi < 25.0){
 cout << "Du har normalvekt" << endl;
}
else if(bmi < 30.0){
 cout << "Du er overvektig" << endl;
}
else if(bmi < 35.0){
 cout << "Du er under kategorien fedme" << endl;
}
else if(bmi < 40.0){
 cout << "Du er under kategorien fedme 2" << endl;
}
else {
 cout << "Du er under kategorien fedme 3 (ekstrem fedme)" << endl;
}

 

En annen ting er hva hvis brukeren taster inn noe som ikke er et tall? Det er kanskje ikke så viktig med slik feilhåndtering i en skoleoppgave, men verdt å tenke over ;)

Lenke til kommentar

Det funket :)

 

Kan du fortelje meg kvifor ein må skrive

bmi && bmi

?

 

Først og fremst, se på koden i posten til kavorka ovenfor. Du trenger ikke disse doble sjekkene uansett. Når det er sagt, && betyr "og". Linja

18.5 < bmi && bmi < 24.9

leser du som "18.5 mindre enn bmi og bmi mindre enn 24.9".

Lenke til kommentar

Tusen takk for hjelpen :)

 

 

Jeg har lekt litt videre, hvor jeg har en til kalkulator ( 2 til sammen). Kalkulatorene er en funksjon. Det jeg vil er at når man starter, så skal man få velge hvilken kalkulator som skal brukes.

 

Slik jeg tenker er at om personen sier "1" så går han til feks BMI og velger han "2" så går han til den andre. Jeg har funksjonene utenfor

int main(){
{

slik at når personen velger hvilken kalkulator så blir han sendt til funksjonen via "int main()".

 

Variabelen har eg kalla "valg" , men hvilken type skal "valg" være? int, double, string osv. Personen skriver inn 1 ord for å velge. Jeg får det til å funke om jeg skriver inn 1 tall, men ikke med ord.

 

Håper dere skjønner hva jeg mener. Evt, kan jeg bygge litt videre og sende inn skjemaet.

Lenke til kommentar

Skal brukeren skrive inn ord kan du lese de inn i en std::string med std::cin.

 

For eksempel:

 

#include <string>
#include <iostream>
int main()
{
std::string user_input;
std::cin >> user_input;
if (user_input == "BMI")
{
	// Call BMI function.
}
else if (user_input == "Calculator")
{
	// Call calculator function.
}
}

Endret av Glutar
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...