Gå til innhold

Får feilmelding når jeg skal kjøre program


Anbefalte innlegg

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 :dontgetit:

 

Noen som har noen anelse om hva som kan være feil?

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

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

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

<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

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

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

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

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

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 av f00b
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...