Új hozzászólás Aktív témák
-
FehérHolló
veterán
Bocs, most látom, hogy közben szerkesztetted az előzőt.
A destruktor jó, valamit közben szúrtál el. A két legvalószínűbb dolog a te esetedben, ami heap corruptiont okozhat:
- valahol közben már kitörölted a tort tömböt, a destruktor is törölni szeretné és ez nem tetszik az oprendszernek
- zárójeles a new, delete pedig zárójel nélküli (ez az esetedben fenn áll)Skynet is real. It's called Google.
-
norbiphu
senior tag
válasz FehérHolló #101 üzenetére
#include <iostream>
class T{
char* t;
public:
T(char* z) {
t=new char[strlen(z)+1];
strcpy(t,z);
t[strlen(z)+1]='\0';
};
~T() {delete[] t;}
};
int main() {
T A(''323232'');
}
ez se fut le...
[Szerkesztve]"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
-
FehérHolló
veterán
válasz norbiphu #102 üzenetére
Kicímzel a tömbből a '\0' berakásánál. A legnagyobb index strlen(z).
Másrészt ezzel egy nagyobb baj is van. Ha z alapból nem nullterminált, akkor nem működik rá a strlen() függvény. Ha pedig z nullterminált, akkor szükségtelen a t végére berakni egy '\0'-t.
A harmadik gond pedig a main()-en belül az A objektum inicializálásánál van. A () zárójelbe nem két ''-t (shift+1) kell rakni, hanem egy ''-t (shift+2). De ha így adod be neki a stringet, akkor zárd le '\0'-al, és nem lesz baja a konstruktornak sem. (A két első hibát kiküszöbölöd.)
Szerk: Jé, most látom, hogy két shift+1 egymás mellett ugyanúgy néz ki, mint a shift+2, ha code blokkba rakom.
[Szerkesztve]Skynet is real. It's called Google.
-
bpx
őstag
válasz norbiphu #102 üzenetére
#include <iostream>
class T{
char* t;
public:
T(char* z) {
t=new char[strlen(z)+1];
strcpy(t,z);
t[strlen(z)]='\0';
// tulcimezted a tombot, nem kell a +1, mert 0-tol indul a cimzes
}
~T() {
if (t!=NULL) delete[] t;
// destruktort eszedbe ne jusson enelkul megirni, kulonben ugy szall el, hogy csak na}
// ehhez persze param. nelkuli konstruktor is kell, ami beallitja NULL-ra akkor is, ha nem csinalsz semmit
};
int main() {
T A(''323232'');
}
[Szerkesztve] -
norbiphu
senior tag
-
-
FehérHolló
veterán
Tudtommal ha nullpointerre hívod meg a delete-et vagy a delete[]-t, akkor nem csinál semmit. Rosszul gondolom ezek szerint? Órai anyagban, és netes forrásokban is mindenhol ezt írják, hogy nem csinál semmit. Sőt, a tapasztalat is ezt mutatja, amikor másolókonstruktorban felhasználom az operátor egyenlőt, és előtte törlöm, ami ott volt.
Skynet is real. It's called Google.
-
Zulfaim
csendes tag
Szevasztok!
Bufferelten kezelt fájlt kellene írnom c++-ban OO-an.
Csináltam egy buffer osztályt, ahol tárolok egy pointert és a méretet.
Ennek kéne működnie:
buffer+=szoveg;
ahol mindketten string-et tároló tömbök.
a szoveget is úgy tárolom, hogy pointer+méret, de azt a main()-ben hozom létre.
Ezt operátor overloaddal kéne megoldani, de nem tudom hogy.
Tudna valaki segíteni? -
bpx
őstag
válasz FehérHolló #108 üzenetére
az igaz, de null-ra akkor is be kell állítani
a destruktoros ellenőrzés inkább már ilyen bme-s mánia, hogy a legkisebb 3 soros példaprogramban is 6szor ellenőrzünk, hogy a későbbi bővítésnél ne legyen gond -
norbiphu
senior tag
válasz norbiphu #107 üzenetére
KÉSZ!
operator= - ben is túlindexeltem a /0 - t, csak nem ott kerestem a hibát.
valamint a kivonásban úgy pakoltam a result int tömbből az eredményeket a visszaadandó tört stringbe, hogy nem is volt neki memória foglalva (ezt miért engedi a vs, miért nem warningolt? )
FehérHolló, -Zeratul-"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
-
Ramius
őstag
Sziasztok.
A következő adatbevitelnél hogyan tudom ellenőrizni, hogy egy megadott határon belül legyenek a számok?
for(a=0;a<5;a++)
{
printf(''\nKerem a(z) %d. tippet: '',a+1);
fflush(stdin);
scanf(''%d'',&tipp[a]);
}gyakorlat teszi a mestert...tönkre...
-
amargo
addikt
A Scanf-el is meg lehet csinálni, csak én már untam, hoyg annyi mindent kell lekezelni sokszor.. Pointerekkel lehetne még igazán jól lekezelni a dolgot, hogy ne is legyen pazarló, de amilyen szinten a tanárok elvárják, ahhoz most ez is jó:
//---------------------------------------------------------------------
bool IsDigit(char ch)
{
return ((ch >= '0' && ch <= '9') || ch == '.');
}//bool IsDigit(char ch)
//---------------------------------------------------------------------
template <class Var>
void getNum(Var &n, Var lob, Var hib) //lob az alsó határ
{
bool error;
do
{
string str;
n = 0;
error = false;
cin >> str;
for(int h = 0; h < (signed)str.length(); h++)
{
if(!IsDigit(str[ h ]) || str[ 0 ] == '-' )
{
error = true;
cout << ''Hiba, Szamot adjon meg!\n'' << endl;
break;
}
}
if(!error)
{
n = (Var)atoi(str.c_str());
}
if((n < lob || n >= hib) || error) //Nem engedjük meg a hib-ig menni és a lob-nál nagyobbnak kell lennie!
{
cout << ''Hibas a bevitt ertek\n'' << lob << '' -tol, '' << hib << '' -ig. Adja meg a szamot.'' << endl;
error = true;
}
}while( !(lob <= n) || error);
}//int getNum()
Szerk: az előnye, hogy lebegőpontos számokat is képes kezelni.. Nem kell hozzá átírkálni.
[Szerkesztve]“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
Ramius
őstag
A megoldásod nem lett 100%-os, de az alapján kijavítottam a kódomat erre:
for(a=0;a<5;a++)
{
printf(''\nKerem a(z) %d. tippet: '',a+1);
fflush(stdin);
scanf(''%d'',&tipp[a]);
if (tipp[a]<1 || tipp[a]>90)
{
printf (''\nHibas tipp, 1 es 90 kozott lehet csak a szam! Add meg ujra!\n'');
printf(''Kerem a(z) %d. tippet:'',a+1);
scanf(''%d'',&tipp[a]);
}
}
Köszönöm a segítséget
[Szerkesztve]gyakorlat teszi a mestert...tönkre...
-
Ramius
őstag
-
Jester01
veterán
előnye, hogy lebegőpontos számokat is képes kezelni.. Nem kell hozzá átírkálni.
Biztos? Ha jól látom az atoi függvényt hívod, abból hogy jön majd ki lebegőpontos? Egyéb problémák:
* str[ 0 ] == '-' Ez a feltétel miért van a ciklusban? Sőt, miért van egyáltalán? Nem lehet negatív számot beadni?
* Ha egész szám bekérése esetén pl. 3.3-at adok be akkor szerintem nem ad hibát.
* Hibás számra (mondjuk amiben több pont van) szintén nem ad hibát.
* isdigit függvény van ám ''gyárilag'' (és a pont az bizony nem digit -- így félrevezető a függvény neve)
Az én verzióm soronként egy szám beolvasására a következő lenne:
template <class Var>
void getNum(Var &n, Var lob, Var hib)
{
while(!cin.eof())
{
string str;
getline(cin, str);
istringstream tmp(str);
tmp >> n;
if (!tmp.fail() && tmp.eof() && n <= hib && n >= lob) break;
cerr << ''Invalid input'' << endl;
}
}
Nyugodtan tessék belekötni ha van benne hiba.Jester
-
shev7
veterán
ezt gondold at megegyszer.
Ha a 6. szamot is bekeri, akkor nem azzal van a gond amit leirt, hanem amit koreirtal. A tesztelesedrol meg annyit, hogy probald meg egymas utan ketszer beirni neki, hogy 91''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
-
Ramius
őstag
-
amargo
addikt
válasz Jester01 #119 üzenetére
Hi!
Egyetértek. Bambán csak beszurtam a template-et.. hogy lebegőpontosra is jó legyen.. figyelmen kívűl hagyva dolgokat.. rengeteg részletet ki is hagytam, a figyelésből..
Viszont ez a istringstream egyből leveszi a válunkról a feladatot ezért hálás vagyok, hogy megmutattad!
Kicsit belekontárkodtam:
template <class Var>
void getNum(Var &n, Var lob, Var hib)
{
string str;
while(getline(cin, str))
{
istringstream tmp(str);
tmp >> n;
if (!tmp.fail() && tmp.eof() && n <= hib && n >= lob) break;
cerr << ''Invalid input'' << endl;
}
}
Belekötni nem tudok, mert minek is?“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
amargo
addikt
Hamár, a másikat így eltoltam.. ebben mi a hiba?
template <class Var>
void fgetNum(Var &n, Var lob, Var hib)
{
string str;
n = 0;
while(getline(cin, str))
{
bool error = false;
int dot = 0, i = 0;
if( str[ 0 ] == '-')
i = 1;
for( ; i < str.length(); ++i )
{
char ch = str[ i ];
if (IsDigit(str[ i ])) continue;
else if(str[ i ] == '.' && dot < 1)
{
dot++;
}
else
{
error = true;
}
}
if(!error)
{
n = (Var)atof(str.c_str());
}
if((n < lob || n >= hib) || error)
{
cout << ''Hibas a bevitt ertek\n'' << lob << '' -tol, '' << hib << '' -ig. Adja meg a szamot.'' << endl;
}
else
{break;}
}
}
atof-nél van valami jobb átalakító? mint borlandéknál az StrToInt?“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
ktg3
őstag
na ebben megint nem találom, a bugot...
segít vki??
[link] -
ktg3
őstag
válasz Jester01 #127 üzenetére
nekem összesen 2 db hibaüzit dob..
az a baja h nem működik meg annyira nem is értem h h működik ez a template..
elvileg le kéne h fusson ez a baja: D
mmint a tudásom szerint
mert ugyen aza akar lenni h a vector osztály tudjon megadott típussal működni..
szal azokat az inteket ( eredetileg inteket tárolt) írtam át tre ahol sztem kellett..
szal annyira konkrétan a szintaktikát sem tudom
annyit találtam róla ha a headeren belül implementálod a fgv-eket akkor mindegyik elé kell az a temlate <class T>... -
Jester01
veterán
Az a <class T> az olyan mint a függvényeknek (vagy makróknak) a paramétere. Tehát a T az tetszõleges név lehet. Az egész úgy mûködik, hogy a T helyére a példányosítás során adott osztályokat (típusokat) helyettesít be. A te kódodban Vector osztály nem létezik, az csak egy minta (template). Tehát igazából sehova sem írhatod azt, hogy Vector, mindenhol meg kell adnod a behelyettesítendõ típust vagy konkrétan vagy pedig template paraméterrel (ez alól azt hiszem vannak kivételek, de olyanról nem tudok, hogy ne lehetne kiírni -- vagyis az a biztos ha mindenhová kiírod).
Ezen felül csak annyi hiba volt a progiban, hogy hiányzott az assert.h és az operator<< visszatérési típusánál egy helyen lemaradt az & jel, valamint a friend deklarációnál is kell a template kulcsszó.Jester
-
caddie
csendes tag
Azt hiszem, hogy a problemak egy reszet mar leirtak, en meg javasolnek 1-2 dologt:
- nagyon nem illik a headerekbe a using namespace std;-t beleirni
- a standard konyvtar definial egy vector template osztalyt, majdnem azonos neven
- a kiiro operator definialasakor te igazabol egy free (''globalis'') fuggvenyt definialsz, amely egyik parametere template osztaly. ebbol kifolyolag az altalad definialt kiiro operatornak is templatenek kell lennie (alatta ki is van kommentezve)
- konstruktoroknal erdemes hasznalni az inicializalasi listat (ezzel kikerulheto a telejsen felesleges default konstrualas es az ezuatni ertekadas)
- unsigned int-ek helyett, erdemes hasznalni az STL-hoz hasonloan a size_t tipust
- ertekado operatorok tipikusan T& ternek vissza a lancbafuzes tamogatasa miatt, de persze lehet, neked pont az volt a celod, hogy ilyen dolgokat ne engedj meg
- mivel letezik a vektor meretenek lekerdezesere kialakitott interface (size()), ezert velemenyem szerint felesleges a kiiro template operatort friendkent deklaralni
- a NULL nem szabvanyos! nullat hasznalj helyette
- a copy konstruktort biztos igy akartad csinalni?
{
Vector<int> a;
// a-t feltoltod elemekkel
Vector<int>b(a);
}
// megsemmisul a, felszabadul a.pData;
// felszabadul(na) b.pData;
// de mivel a.pData == b.pData ami mar megsemmisult,
// ehelyett katasztrofa lesz
// alternativ eset
a.clear(); // felszabadul a.pData (b.pData is oda mutat)
b[5];
// szerencses esetben elcrachel a programod
// peches esetben pedig fut tovabb csak hulyeseg irodik ki
// megpechesebb esetben jo irodik ki
// klasszikus undefined behaviour
- copy konstruktor egyertelmuen hibas
- assert.h helyett majd inkabb cassert-et hasznald
- erase eseten, ha egy elemed volt akkor -1-re alitod az elemenNum-t
- postfix increment / decrementalas helyett erdemes a prefixet hasznalni (ahol persze azonos a ketto funkcionalitasa)
- erase eseteben a torlendo elem kihagyasa nem tul elengas, sott gyanus, hogy a for ciklusnal a ciklusfeltetel tulindexelest fog eredmenyezni
- insert-nel erdemes lenne const T& -et atadni
- ennek nem latom sok ertelmet:
if(elementNum==UINT_MAX)
{
return false;
}
de ha mar ilyenekre figyelsz, akkor erdemes lenne inkabb a C++ std altal biztositott dolgokat hasznalni, tovabba inkabb a new sikeres memoriafoglalasat ''leellenorizni''* (bar egy beadando eseteben egyiknek sincs tul sok jelentosege)
* erdemes eszrevenni, hogy alap esetben std::bad_alloc exceptiont dob, de nothrow-os valtozat hasznalataval ra lehet venni arra is, hogy nullpointert adjon vissza sikertelen foglalas eseten
- insertnel megint az kell, hogy modnjam, hogy ez nem tul elegans modja az elem beszuarasanak
- insertnel ha pos > mint az aktualis vektor merete, akkor ne egyenkent toltsd fel nullaval, hanem default konstruald nullaval inkabb
- insertnel nem latom pontosan, hogy miert pos + 1 meretu tombot foglalsz
- [] operator eseteben az az altalanos STLes megkozelites, hogy [] nem ellenoriz indexhatarokat, csak at teszi azt, igy az at fuggvenyt a [] segitsegevel valositjak meg.
- eddig sem lattam sok ertelmet az asserteknek, az amlitett dolgok nem olyan hibak amiert le kene shutdownolni az egesz programot, de ertekado operator eseteben egyenesen a jozan esz ellen megy. Abban az esetben inkabb egy return *this; kellene, amennyiben onertekadasrol lenne szo
Igy elso atfutasra en ezeket a furcsasagokat vettem eszre, nehany kozulok talan csak sznobizmus, de azert akadt kozottuk par tervezesi hiba es eletveszelyes undefined behaviour is.
[Szerkesztve]''C++ : Where friends have access to your private members.'' — Gavin Russell Baker.
-
Zulfaim
csendes tag
class buffer {
char* buff;
int size;
public:
//buffer() : buff(0), size(0){}
buffer(int s=10){buff=new char[size=s];}
buffer(const buffer&);
buffer& operator=(const buffer&);
friend ostream& operator<<(ostream& s, const buffer b);
~buffer(){ delete[] buff; }
buffer& buffer:perator=(const char* value)
{
delete[] buff;
if( size=strlen(value))
{
buff=new char[size+1];
strncpy(buff,value,size);
}
return *this;
}
};
buffer::buffer(const buffer& e)
{
buff=new char[size=e.size];
for(int i;i<size;i++)
{
buff=e.buff;
}
}
buffer& buffer:perator=(const buffer& e)
{
if( this!= &e)
{
delete[] buff;
buff=new char[size=e.size];
for(int i=0;i<size;i++)
{
buff=e.buff;
}
}
return *this;
}
ostream& operator<<(ostream& s, const buffer b)
{
for(int i=0;i<b.size;i++)
{
s << b.buff;
}
return(s);
}
int main()
{
buffer b;
b=''xyz'';
b+=''-=EZ A BUFFERHEZ FUZOTT RESZ=-'';
cin.get();
return 0;
}
Ezzel mi a baj?
[Szerkesztve] -
Zulfaim
csendes tag
már megvan.
Valaki tudna segíteni, hogy hogy lehetne ezt még kibővíteni egy operator+= overloaddal? -
Zulfaim
csendes tag
buffer& buffer:perator+=( const char* value)
{
char* temp=new char[size+strlen(value)+1];
if(value)
{
strcpy(temp,buff);
strcpy(temp + strlen(buff), value);
delete[] buff;
buff = temp;
}
return *this;
}
int main()
{
char s[7]=''BUFFER'';
buffer b;
b=s;
cout<<b;
b+=s;
cout<<b;
cin.get();
return 0;
}
nem működik rendesen. -
BaKeSZ87
senior tag
Sziasztok! Amit a programmal bekérek adatot, gets-sel, azt egy txt fileba kell beleíratni. Hogy tudom ezt megvalósítani?
-
ktg3
őstag
húbazz kaptam a fejemre
kösz szépen..
megfontolom..
de aki ilyen kezdő -
Lortech
addikt
válasz BaKeSZ87 #136 üzenetére
pl:
FILE *fp;
if ((fp = fopen(''c:\\valami.txt'', ''a'')))
puts(''szar'');
else
{
puts(''jo'');
char string[11];
puts(''Mit írjak ki? : '');
fgets(string,10,stdin); /*vagy gets(string); ha mindenáron gets, de akkor a char tömböt halálbiztos méretűre kell állítani, mert ír a tömb maxindex után is, ha kell ha nem..*/
if (fputs(string,fp) != EOF) puts (''siker'');
}
[Szerkesztve]Thank you to god for making me an atheist
-
Zulfaim
csendes tag
nem tudom hova feltölteni.
#include <cstring>
#include <iostream>
using namespace std;
class buffer {
char* buff;
int size;
public:
buffer(){buff=''ZZZ''; size=3;}
buffer(const buffer&);
buffer& operator=(const buffer&);
friend ostream& operator<<(ostream& s, const buffer b);
~buffer(){ delete[] buff; }
buffer& buffer:: operator+=( const char* value)
{
char* temp=new char[strlen(buff)+1];
strcpy(temp,buff);
if(size+=strlen(value))
{
delete[] buff;
buff=new char[size+1];
strcpy(buff,temp);
strcpy(buff+strlen(value),value);
}
delete[] temp;
return *this;
}
buffer& buffer:: operator=(const char* value)
{
delete[] buff;
if( size=strlen(value))
{
buff=new char[size+1];
strcpy(buff,value);
}
cout<<''__az '=' this-je__''<<*this;
return *this;
}
};
buffer::buffer(const buffer& e)
{
buff=new char[size=e.size];
for(int i;i<size;i++)
{
buff=e.buff;
}
}
buffer& buffer:: operator=(const buffer& e)
{
if( this!= &e)
{
delete[] buff;
buff=new char[size=e.size];
for(int i=0;i<size;i++)
{
buff=e.buff;
}
}
return *this;
}
ostream& operator<<(ostream& s, const buffer b)
{
for(int i=0;i<b.size;i++)
{
s<<b.buff;
}
return (s);
}
int main()
{
char s[7]=''BUFFER'';
buffer b;
cout<<b;
b=s;
cout<<b;
cout<<endl;
b+=s;
cout<<b;
cin.get();
return 0;
}
most az a baj vele, hogy a this-be ilyen baromságokat rak( memóriaszemét), de nem tudom, hogy mitől kapja. Nem hiszem, hogy a konstruktor hibája lenne. -
Ramius
őstag
Üdv! Újabb kérdésem van:
Azt hogyan tudom megoldani, hogy ha lefut egy program, akkor kérdezzen rá, hogy újra akarja-e kezdeni a kedves júzer, vagy kilép?gyakorlat teszi a mestert...tönkre...
-
Ramius
őstag
Érzem, hogy ismét valami egyértelmű marhaságot nézek el, de nem akar működni
akármit nyomok, újraindul.gyakorlat teszi a mestert...tönkre...
-
amargo
addikt
main()
{
char c='I';
do {
/*...*/ <- EZ ITT A KÓDOD HELYE, azt is csinálhatod, hogy kirakod egy függvénybe a kódod és ide csak a függ hívást rakod.
cout<<''Ujra kezdes( I/N )?''<<endl;
}
while( (c=getchar())!='N');
}“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
Ú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!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Kerékpárosok, bringások ide!
- Rövid előzetesen a S.T.A.L.K.E.R. 2: Heart of Chornobyl
- Milyen NAS-t vegyek?
- Milyen monitort vegyek?
- HP ProLiant MicroServer Gen8
- Helldivers 2 (PC, PS5)
- Milyen TV-t vegyek?
- Gördeszka topic
- Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
- További aktív témák...