f00b Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Heisann, har prøvd meg litt på structures nå, og har fått den til å fungere sånn halveis. Problemet er at jeg får en feilmelding når jeg har kjørt .exe filen jeg har laget. Feilmeldingen lyder slik; Microsoft Visual C++ Debug Libary Debug error: ... HEAP CORRUPTION DETECTED: after Normal block (#109) at 0x003A4F40 CRT detected that the application wrote to memory after the end of heap buffer. Her er koden: #include <iostream> using namespace std; struct character { int age; char gender; char *name; }; int main() { character arne; arne.age = 25; arne.gender = 'm'; arne.name = new char; cout << "Skriv inn arne's nye navn: "; cin >> arne.name; cout << "Arne's navn: " << arne.name << "\n"; cout << "Arne's alder: " << arne.age << "\n"; delete arne.name; } Jeg hadde trodd at "delete arne.name;" skulle fikse dette problemet, men det gjør det tydeligvis ikke Noen som har noen anelse om hva som kan være feil? Lenke til kommentar
jh_ Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Denne bør gjøre susen: cin.get(); return 0; delete arne.name; } Lenke til kommentar
A_N_K Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Det ser ikke ut til at du setter av alt for mye plass til arne.name :_p Prøv heller en std::string du. Lenke til kommentar
Ernie Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Først og fremst bør main returnere noe. Det vanligste er åpenbart 0. Neste feil er at du lager en char og skal putte mange tegn inn i den. Ganske usikker på hvordan det går. Lenke til kommentar
Ernie Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 (endret) Det ser ikke ut til at du setter av alt for mye plass til arne.name :_p Prøv heller en std::string du. ja for det går jo utmerket bra i Visual C++. #include <iostream> #include <cstring> using namespace std; int main() { string test; cin >> test; return 0; } ...det funket dårlig. error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion) Edit: Det som faktisk feiler i koden er merkelig nok følgende: delete arne.name; Uten den linja fungerer faktisk alt tilsynelatende bra. Endret 24. juli 2005 av Ernie. Lenke til kommentar
A_N_K Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 (endret) Jeg bruker ikke Visual C++, så jeg vet ikke hvorfor kompilatoren hoster opp den feilmeldingen. Du bør forresten inkludere <string> og ikke <cstring>. Edit: Åpenbart inkluderes string-klassen gjennom <iostream> siden du aldri inkluderer <string>, men det er rart at overlastingen av operator >> ikke kommer med. Endret 24. juli 2005 av A_N_K Lenke til kommentar
Ernie Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Jeg bruker ikke Visual C++, så jeg vet ikke hvorfor kompilatoren hoster opp den feilmeldingen. Du bør forresten inkludere <string> og ikke <cstring>. Hmm... okey. Det funker faktisk feilfritt hvis jeg bruker <string>. Lenke til kommentar
A_N_K Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Hvorfor inkluderte du cstring i utgangspunktet? Lenke til kommentar
Ernie Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Nei si det... Alltid gjordt det siden eksemplene jeg har fått servert har gjordt det Lenke til kommentar
A_N_K Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Kanskje like greit å få det forklart først som sist? En C++-programmerer har i praksis to standardbiblioteker å forholde seg til, C- og C++-standardbiblioteket. For å skille mellom de to ender ikke standard C++-headere med .h, f.eks eksisterer det allerede en string.h i standard C. For å inkludere det standard C-biblioteket i standard-namespacet i C++ (std: foreligger det også tilsvarende headere som starter med c og uten .h-endingen. Ta f.eks <cstring>, alt denne gjør er å inkludere C-headeren string.h (inneholder funksjoner som memcpy etc.) i namespace std. Altså: <cstring> og tilsvarende tilhører C-standarden, det er best å unngå disse med mindre du vet hva du gjør. Lenke til kommentar
Ernie Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 ...og da tilhører altså <string> C++-standardbiblioteket og bør foretrekkes? For en lærerik dag Lenke til kommentar
A_N_K Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 <string> er C++ ja. Jeg vil ikke si at det handler om å foretrekke, men hvis du ønsker å bruke std::string-klassen må du inkludere <string>. <cstring> inneholder som sagt en rekke funksjoner, men har ingenting med std::string å gjøre. Lenke til kommentar
f00b Skrevet 24. juli 2005 Forfatter Del Skrevet 24. juli 2005 (endret) Det fungerte når jeg gjorde som jh_ sa, og det fungerte også når fjernet delete jarle.name som Ernie. sa Jeg tenkte jeg skulle prøve meg på en litt ny en, her har jeg tenkt til å opprette to personer, sånn at når jeg skriver inn navnet på en av de personene jeg lager så skal den komme med alder og vekt. Jeg er ikke helt sikker på hvordan jeg skal gjøre dette, har ikke noen tutorial å følge etter, og er ganske fersk i dette. Noen som har lyst til å ta en titt på koden og gi meg noen tips? Her er koden: #include <iostream> using namespace std; struct person { int age; int weight; char *name; }; int main() { person jarle, kjartan; jarle.name = "Jarle"; jarle.age = 25; jarle.weight = 76; kjartan.name = "Kjartan"; kjartan.age = 22; kjartan.weight = 69; cout << "Skriv inn navn: " << person.name << "\n"; cin >> person.name; cout << "Personens navn er: " << person.name << "\n"; cin.ignore(); cout << "Personens alder er: " << person.age << "\n"; cout << "Personens vekt er: " << person.weight << "kg" "\n"; cin.get(); return 0; } Endret 24. juli 2005 av f00b Lenke til kommentar
Dead_Rabbit Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Du burde bruke std::string fremfor char* som nevnt ovenfor. Da ville du ha sluppet det der med å allokere og deallokere minne hele tiden. Men så ser jeg også at du prøver å skrive til og lese fra selve typen person, noe som kompilatoren klager på. Det er fordi du ikke har noe objekt ved navn person, du har bare en type. Og hvis du tenker over det, så blir det du gjør over her, litt av det samme som å gjøre noe slik som dette: #include <iostream> //... std::cin >> int; //og std::cout << int; Lenke til kommentar
f00b Skrevet 24. juli 2005 Forfatter Del Skrevet 24. juli 2005 zirener: Hvor er det jeg skal bruke string? Prøvde å legge til #include <string>, og byttet ut char med string, men det funker ikke. Har sitti med koden i 1 1/2 time nå, jo mer jeg prøver, jo mer mister jeg oversikten over hva det er jeg egentlig gjør. Tror du at du kunne ha editert koden litt, sånn at du endrer litt på noe av det jeg bør endre på? Lenke til kommentar
☀ ❄ Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 (endret) Edit: Tenkte ikke over at du fikk kompileringsfeil, så jeg endret bare til bruk av std::string. Følgende bør fungere: #include <iostream> #include <string> // Lagt til using namespace std; struct person { int age; int weight; string name; // Endret }; int main() { person jarle, kjartan; jarle.name = "Jarle"; jarle.age = 25; jarle.weight = 76; kjartan.name = "Kjartan"; kjartan.age = 22; kjartan.weight = 69; person new_person; cout << "Skriv inn navn: " << new_person.name << "\n"; cin >> new_person.name; // Bruk denne i stedet dersom du ønsker å tillate mellomrom i stringen // getline(cin, new_person.name); cout << "Personens navn er: " << new_person.name << "\n"; cin.ignore(); cout << "Personens alder er: " << new_person.age << "\n"; cout << "Personens vekt er: " << new_person.weight << " kg" "\n"; cin.get(); return 0; } Endret 24. juli 2005 av Myubi Lenke til kommentar
f00b Skrevet 24. juli 2005 Forfatter Del Skrevet 24. juli 2005 Myubi: får følgende feilmelding på denne koden: error: 'person' : illegal use of this type as an expression Lenke til kommentar
Dead_Rabbit Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Den feilen er som nevnt ovenfor at du ikke har noe objekt som heter person, det er bare en type , slik som f.eks. int, double, char, string, vector, whatever. person er en type, ikke et objekt! Derfor klager kompilatoren! Lenke til kommentar
☀ ❄ Skrevet 24. juli 2005 Del Skrevet 24. juli 2005 Har redigert innlegget. Det bør fungere nå. Lenke til kommentar
f00b Skrevet 24. juli 2005 Forfatter Del Skrevet 24. juli 2005 (endret) Nå har jeg fått det til å fungere, ikke akkuratt sånn jeg ville ha det men.. Poenget er at jeg skal skjønne hvordan strukturer brukes, og hvordan de fungerer. Sånn jeg egentlig ville hatt det var at dersom man skrev kjartan på den første linjen, så skulle den vise informasjonen om kjartan, men isteden så viser den den første variabelen. Men jeg antar at man må bruke endel andre funksjoner dersom man skal få til dette? if bl.a? Her er iallefall koden: #include <iostream> #include <string> using namespace std; struct person { int age; int weight; string name; }; int main() { person arne; arne.age = 25; arne.weight = 79; arne.name = new char; cout << "Skriv inn Arne's nye navn: "; cin >> arne.name; cout << "\n" << "Arne's navn er: " << arne.name << "\n"; cout << "Arne's vekt er: " << arne.weight << " kg" "\n"; cout << "Arne's alder er: " << arne.age << "\n"; cin.ignore(); person *kjartan; kjartan = new person; kjartan->age = 19; kjartan->weight = 67; cout << "\n" << "Skriv inn Kjartan's nye navn: "; cin >> kjartan->name; cout << "\n" << "Kjartan's navn er: " << kjartan->name << "\n"; cout << "Kjartan's vekt er: " << kjartan->weight << " kg" "\n"; cout << "Kjartan's alder er: " << kjartan->age << "\n"; cin.ignore(); cin.get(); return 0; } Ser denne grei ut, eller er det noe jeg bør fikse på den? Den fungerer slik det er nå, men dersom det er noe jeg ikke trenger å ha der, eller noe jeg bør fjerne så er det kjekt å vite det Tusen takk for all hjelp! Endret 24. juli 2005 av f00b 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å