Új hozzászólás Aktív témák
-
papa019
senior tag
Sziasztok!
Valaki segítsen nekem legyen szíves.
Megírtam egy fifo osztályt, de valami probléma van, mert a program nem fut le normálisan, annak ellenére, hogy minden hiba nélkül lefordul.fifo.h
#ifndef fifo_h
#define fifo_h
class FiFo{
int elementNum;
double*pData;
public:
FiFo();
FiFo(const FiFo&theOther);
~FiFo();
double get();
bool put(double element);
bool empty();
};
#endiffifo.cpp
#include "fifo.h"
#include<stdio.h>
FiFo::FiFo()
{
elementNum=0;
pData=0;
}
FiFo::FiFo(const FiFo&theOther)
{
if(theOther.elementNum==0)
{
elementNum=0;
pData=0;
}
else
{
elementNum=theOther.elementNum;
pData=new double[elementNum];
for(int i=0;i<elementNum;i++)
{
pData[i]=theOther.pData[i];
}
}
}
FiFo::~FiFo()
{
delete[]pData;
}
double FiFo::get()
{
if(elementNum==1)
{
double element=pData[0];
delete[]pData;
elementNum=0;
return element;
}
elementNum--;
double element=pData[0];
double*pTemp=new double[elementNum];
for(int i=0;i<elementNum;i++)
{
pTemp[i]=pData[i+1];
}
delete[]pData;
pData=pTemp;
return element;
}
bool FiFo::put(double element)
{
double*pTemp=new double[elementNum+1];
elementNum++;
for(int i=0;i<elementNum-1;i++)
{
pTemp[i]=pData[i];
}
pTemp[elementNum-1]=element;
delete[]pData;
pData=pTemp;
return true;
}
bool FiFo::empty()
{
elementNum=0;
pData=0;
return true;
}Mi lehet a baj?
Előre is kösz.
Üdv.: Papa019[ Szerkesztve ]
-
papa019
senior tag
válasz Jester01 #685 üzenetére
Oké. Megfogadom a tanácsaid.
A nem fut le normálisan alatt azt értem, hogy a copy konstruktor használata esetén a cmd megállt futás közben, illetve amikor a destruktor nem volt kikommentezve, akkor is tapasztaltam ezt a jelenséget.
ez a main.cpp tartalma:
#include "fifo.h"
#include<stdio.h>
void main(){
FiFo valami;
valami.put(3.14);
valami.put(6.14);
valami.put(1.23);
valami.put(7.23);
valami.put(6.79);
printf("%lf\n",valami.get());
printf("%lf\n",valami.get());
printf("%lf\n",valami.get());
printf("%lf\n",valami.get());
printf("%lf\n",valami.get());
/*FiFo valami1(valami);
FiFo valami2=valami;
printf("%lf\n",valami1.get());
printf("%lf\n",valami1.get());
printf("%lf\n",valami1.get());
printf("%lf\n",valami1.get());
printf("%lf\n",valami1.get());*/
}Köszönöm a sok segítséget, megpróbálom kijavítani a tanácsaitok alapján.
Ezt a pData=0-t így tanítják nekünk az egyetemen... :S Eddig én is NULL-t használtam, aztán a gyakvezérünk minden programot 0-val írt fel :SA tömb újrafoglalgatása azért van, mert most kezdtünk bele a nyelvbe és még nem bonyolítjuk láncolt listával. (én meg inkább a gyakorlati anyag alapján írom meg a házimat
Mégegyszer köszönöm a hozzászólásokat.
Ha esetleg lesz valaki, aki megnézi a programom a main.cpp-vel, és úgy talál valami hibát benne, akkor kérem értesítsen. -
papa019
senior tag
Sziasztok.
Van egy hatalmas problémám. :SStringekből (osztály) álló vektor osztályt kellett készítenünk.
Minden megy szuperül egy dolgot kivéve://using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Így olyan hibákat dob ki a rendszer, hogy:
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2143: syntax error : missing ';' before '&'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2065: 'os' : undeclared identifier
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2059: syntax error : 'const'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2143: syntax error : missing ';' before '{'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2447: '{' : missing function header (old-style formal list?)
Ha a namespace nincs kikommentezve, akkor pedig egy nagyon hosszú hibasort, mely az ostream-re mutat...A forráskódok:
Vector.cpp:
#include <limits.h>
#include <assert.h>
#include <iostream>
#include "Vector.h"
#include "string.h"
using namespace HomeMadeString;
Vector::Vector(const Vector& theOther)
{
pData=NULL;
*this=theOther;
}
void Vector::clear()
{
elementNum=0;
delete [] pData;
}
void Vector::erase(unsigned int position)
{
assert(position<elementNum);
if(elementNum==1)
{
delete []pData;
pData=NULL;
elementNum=0;
return;
}
elementNum--;
String* pTemp=new String[elementNum];
for(unsigned int i=0, j=0;i<elementNum+1;i++,j++)
{
if(i==position)
{
j--;
}
else
{
pTemp[j]=pData[i];
}
}
delete[] pData;
pData=pTemp;
}
String& Vector::at(unsigned int position)
{
assert(position<elementNum);
return pData[position];
}
const String& Vector::at(unsigned int position)const
{
assert(position<elementNum);
return pData[position];
}
bool Vector::insert(unsigned int position, String element)
{
if(elementNum==UINT_MAX)
{
return false;
}
if(position<elementNum)
{
String* pTemp=new String[elementNum+1];
for(unsigned int i=0,j=0;i<elementNum;i++,j++){
if(j==position){
pTemp[i]=element;
j--;
}
else pTemp[i]=pData[j];
}
delete[] pData;
pData=pTemp;
elementNum++;
}
else{
String* pTemp=new String[position+1];
for(unsigned int i=0;i<=position;i++){
if(i<elementNum)pTemp[i]=pData[i];
else{
if(i==position)pTemp[i]=element;
else pTemp[i]=0;
}
}
delete[] pData;
pData=pTemp;
elementNum=position+1;
}
return true;
}
String & Vector::operator [](unsigned int position)
{
return at(position); // Miért nem return pData[position]; ???
}
const String & Vector::operator [](unsigned int position)const
{
return at(position); // Miért nem return pData[position]; ???
}
const Vector& Vector::operator= (const Vector & theOther)
{
assert(this!=&theOther);
delete[] pData;
elementNum=theOther.elementNum;
if(elementNum==0) pData=NULL;
else {
pData=new String[elementNum];
for(unsigned int i=0;i<elementNum;i++) pData[i]=theOther.pData[i];
}
return *this;
}
using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Vector.h:
#ifndef VECTOR_H
#define VECTOR_H
#include <iostream>
#include "string.h"
// Egy dinamikus tömb osztály
using namespace HomeMadeString;
class Vector
{
// A tömb mérete
unsigned int elementNum;
// Az adatokra mutató pointer
String *pData;
// Diagnosztikai célú globális kiiratóoperátor
friend std::ostream & operator << (std::ostream& os,const Vector& v);
public:
// Konstruktorok, destruktor
Vector() {elementNum=0;pData=NULL;}
Vector(const Vector& theOther);
~Vector() {delete[]pData;}
// Visszatér a tömb méretével.
int size()const{return elementNum;}
// Törli a tömböt (ez konzisztens állapotba is hozza a tömböt, nem csak a dinamikus adatterületet szabadítja fel)
void clear();
// Törli a megadott indexu elemet. A 0 és size()-1 közötti indexek érvényesek.
void erase(unsigned int position);
// Visszatér a megadott indexu elemmel, amely módosítható is egyben.
// A 0 és size()-1 közötti indexek érvényesek.
String& at(unsigned int position);
// Visszatér a megadott indexu elemmel, amely csak olvasható.
// A 0 és size()-1 közötti indexek érvényesek. Az int típus esetén nem kellene
// const referencia, de saját típus esetén igen, lásd házi feladat.
const String& at(unsigned int position)const;
// Beszúr egy elemet a megadott indexu helyre.
// Ha az index nagyobb, mint a tömb mérete, megnöveli a tömb méretét,
// és a szükséges új helyeket nullákkal tölti fel.
bool insert(unsigned int position, String element);
// Operator=
const Vector& operator= (const Vector & theOther);
// Két operator[]. Az at() tagfüggvény operator formában is.
String & operator [](unsigned int position);
const String & operator [](unsigned int position)const;
};
// Diagnosztikai célú kiiratás
std::ostream & operator << (std::ostream& os, Vector& v);
#endif /*VECTOR_H */String.h:
#ifndef STRING_H
#define STRING_H
#include <iostream> // A coutnak
namespace HomeMadeString
{
class String
{
// A karakterek aktuális száma:
int elementsNum;
// A karaktereket tartalmazó memóriaterületre mutató pointer:
char *pData;
public:
// Argumentum nélküli konstruktor:
String();
// Másoló konstruktor:
String(const String & string);
// Egy NULL végu sztringet váró konstruktor
String(char * str);
// Egy karaktert és egy elojel nélküli egészet (times) váró konstruktor,
// amely times darab c karakterrel inicializálja a stringet:
String(char c, unsigned int times);
// A destruktor:
~String();
// A string objektum tartalmát a megadott bufferbe másolja, és NULL-lal lezárja
// (a buffernek a hívó foglal helyet):
void getStr(char * pBuff);
// Visszatér a sztring hosszával
unsigned int getLength(){return elementsNum;}
// Kiírja a sztringet a megadott kimeneti adatfolyamba (A 'cout' ostream típusú.
// A .h állományban nem használunk using namespace-t, mert nem tudjuk, hova lesz
// beépítve, és ott milyen hatása lesz. Ezért kiíjuk az std::-t. Ez a .cpp állományban
// már nem kell, ot használhatjuk a using namespace std utasítást):
void print(std::ostream& os);
// Visszaadja a megadott pozícióban lévo karaktert, egyébként nullát:
char getChar(unsigned int pos);
// --- Statikus függvények. Ezek két stringen végeznek muveletet. ---
// Összefuz két sztringet, és visszatér vele:
static String concatenate(const String& string1,const String& string2);
// Összehasonlít két sztringet:
static bool compare(const String& string1,const String& string2);
// A második sztringet az elso sztringbe másolja:
static void copy(String& string1,const String & string2);
};
}
#endif /* STRING_H */String.cpp:
#include <iostream>
#include <locale>
#include <string.h>
#include "String.h"
using namespace std;
using namespace HomeMadeString;
String::String()
{
elementsNum=0;
pData=NULL;
}
String::String(const String & string)
{
int i;
this->elementsNum=string.elementsNum;
this->pData=new char[elementsNum];
for (i=0;i<elementsNum;i++)
pData[i]=string.pData[i];
pData[i]='\0';
}
String::String(char *str)
{
int i;
for (i=0;str[i];i++);
elementsNum=i;
pData=new char[i];
for (i=0;str[i];i++)
pData[i]=str[i];
pData[i]='\0';
}
String::String(char c, unsigned int times)
{
int i;
elementsNum=times;
if (!times)
pData=NULL;
else
{
pData=new char [times];
for (i=0;i<elementsNum;i++)
pData[i]=c;
pData[i]='\0';
}
}
String::~String()
{
//delete[] pData;
}
void String::getStr(char *pBuff)
{
int i;
for (i=0;pData[i];i++)
pBuff[i]=pData[i];
pBuff[i]='\0';
}
char String::getChar(unsigned int pos)
{
if (elementsNum>pos)
return pData[pos];
else
return 0;
}
String String::concatenate(const String& string1,const String& string2)
{
String str;
str.elementsNum=string1.elementsNum+string2.elementsNum;
str.pData=new char[str.elementsNum];
int i,j;
for (i=0;string1.pData[i];i++)
str.pData[i]=string1.pData[i];
for (j=0;string2.pData[j];j++)
str.pData[i+j]=string2.pData[j];
return str;
}
bool String::compare(const String& string1,const String& string2)
{
if (!(strlen(string1.pData)==strlen(string2.pData)))
return false;
for (int i=0;i<string1.elementsNum;i++)
if (!(string1.pData[i]==string2.pData[i]))
return false;
return true;
}
void String::copy(String & string1,const String & string2)
{
delete[] string1.pData;
string1.elementsNum=string2.elementsNum;
if (!string1.elementsNum)
string1.pData=NULL;
else
{
string1.pData=new char[string1.elementsNum];
int i;
for (i=0;string2.pData[i];i++)
string1.pData[i]=string2.pData[i];
}
}
void String::print(std::ostream & os)
{
for (int i=0;i<elementsNum;i++)
os<<pData[i];
}És a tesztelésre használt VectorSample.cpp:
#include "Vector.h"
#include "String.h"
using namespace std;
int main()
{
Vector v1;
// Insert tesztelése
for(int i=1;i<10;i++)
{
v1.insert(i,"i");
}
// A kiírás (operator<<) és az at() függvény tesztelése
cout<<v1<<endl;
//Helyes eredmény:
// 0 1 2 3 4 5 6 7 8 9
// Másoló konstruktor
Vector v2(v1); // Lehetne: Vector v2=v1;
// op=
Vector v3;
v3=v2;
// Megváltoztatjuk v1-t (erase tesztelése)
v1.erase(0);
// v1.erase(9); //Ennek assertelni kell
cout<<endl<<v1<<endl<<v2<<endl<<v3<<endl;
// Helyes eredmény:
// 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
v2.insert(0,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 9
v2.insert(10,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9
v2.insert(12,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1
v2.insert(15,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -1
v2[15]="-2";
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -2
// v2[16]=3; //Ennek assertelni kell
return 0;
}Kérem valaki segítsen nekem, már több órája ezzel harcolok, de nem jövök rá, hogy mi a probléma. :S
Üdvözlettel: Papa
-
papa019
senior tag
válasz Jester01 #748 üzenetére
Köszi, rengeteget segítettél, kijavítottam az általad említett hibákat.
A Vector.h-ban a 2. paraméter elé odaírtam a const-ot, illetve beírtam az os<<' '<<v.at(i).print(os); sort is.Nekem viszont nem fordul és ezt írja ki:
"d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(127) : error C2662: 'HomeMadeString::String::print' : cannot convert 'this' pointer from 'const HomeMadeString::String' to 'HomeMadeString::String &'"
-
papa019
senior tag
Oké, köszi.
[ Szerkesztve ]
-
papa019
senior tag
Sziasztok!
Van egy új problémám. :S
A feladat szövege:
Írjunk C++ programot a következő feladatra:
A Húsvéti Nyúl háromfajta ajándékot (Gift) oszt:
színes tojást (ColoredEgg),
csokitfigurát (ChocolateFigure),
cukrot (Candy).
Mindegyik különböző súlyú, az alapegység egy statikus változója az alaposztálynak (baseWeight=10).
A színes tojás súlya darabonként ennek konstansszorosa (eggFactor=9), míg a csoki esetében ez a tényező chocolateFactor=10.5, a cukornál candyFactor=13.2.
A Nyúlnak írt programunk egy tömbben tartja nyilván a kiosztott ajándékokat. Az egyes ajándékok darabszámot is tartalmaznak. A színes tojásnál saját paraméterként nyilvántartjuk még a színt (RED, GREEN, BLUE, VIOLET), a csokifiguránál az olvadáspontot (MeltingPoint), a cukorkánál a minőséget (HARD, SOFT). A célunk kiszámolni és kiírni az egyes ajándékok súlyát (getWeight()).
a) Implementáljuk az osztályokat és konstansokat az EasterBunny névtérben figyelve arra, hogy esetlegesen egyes konstansokat is tagként vagy statikus tagként érdemes implementálni. Ne legyen egy függvénytörzsben sem felesleges, nem használt kód! Egy új ajándéktípus esetleges felvételéhez ne kelljen a már meglévő osztályokat módosítani!
b) Írjon egy egyszerű programot (nem dinamikus tömbbel!), ami megmutatja legalább három különböző típusú ajándék felvételét, valamint kiírja a nevüket a súlyukat és a paraméterüket.A nem működő megoldásom az alábbi linkeken látható:
Headers.h
http://pastebin.com/YWd9tYSb
Functions.cpp
http://pastebin.com/hYSd5Vu3
Testing.cpp
http://pastebin.com/6SveRAWVA problémáim:
- A Testing.cpp fájlban létrehozott tömböm elemeinek neveit miként tudom kiírni a for ciklusban?
- Az alosztályok egyedi paramétereit hogy tudnám kiírni?
Az általam használt módszer igazábból már ott "megbukott", hogy a getParameter függvényt kéri a Gift osztályba is, de oda a feladat kritériumai szerint nem tehetem be. Ezen megoldásomban még benne van, de itt az ostream ír hibát.Kérlek segítsetek.
Előre is köszönöm.
Üdvözlettel: Papa[ Szerkesztve ]
-
papa019
senior tag
Sziasztok!
Olyan kérdéssel fordulnék hozzátok, hogy egy osztály elemeit "vector<>" template fv.-ben tárolom. És a vektorom elemeit szeretném rendezni az osztályomban lévő "char* name;" változók alapján. Ezt milyen fv.-el tudom véghezvinni?
Üdv: Papa019
-
papa019
senior tag
válasz Jester01 #831 üzenetére
Eddig oké, csak nem tudom felparaméterezni. :S
van egy vektorom így: "vector<Product*>store".Ekkor ugye a sort első két paraméterével így néz ki:
"sort(store.begin(),store.end())"Viszont a 3. paramétert nem tudom hogy írjam meg... Írtam összehasonlító operátorokat a Product osztályba, de azokat nem tudom betenni paraméternek, mert a sort függvény sír, hogy két paramétert vár és 3-at adnék neki.
Valaki vmi ötlet? :$ -
papa019
senior tag
válasz sghc_toma #834 üzenetére
Valamiért nem működik még mindig, pedig így csináltam...
Viszont ha az operátor const referenciákat kap, akkor hibát ad erre a megoldásra...
Viszont nekem nem int értékeket kell rendezni, hanem char* értékek alapján...
meg hiába friend az operátor az osztályomban, a name változót sehogyan sem érem el, így a get_name() fv.-t használom.És az a legnagyobb baj, hogy a sort fv. meg se hívja az operátorom... :S
-
papa019
senior tag
válasz sghc_toma #838 üzenetére
köszi már majdnem jó...
Az operátort kitöröltem, gondolom a compare fv. mellett arra már nincsen szükség...
De a fordító ezt írja ki:
1>Termekek.obj : error LNK2019: unresolved external symbol "bool __cdecl QuickFrozen::compare(class QuickFrozen::Product *,class QuickFrozen::Product *)" (?compare@QuickFrozen@@YA_NPAVProduct@1@0@Z) referenced in function "public: void __thiscall QuickFrozen::Store::sort_by_name(void)" (?sort_by_name@Store@QuickFrozen@@QAEXXZ)
1>D:\Egyetem\2. félév\Programozás alapjai 2\NagyHF\nhf\Debug\nhf.exe : fatal error LNK1120: 1 unresolved externals
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!