Na ez már jobb
Van main függvényed?
Jester
Na ez már jobb
Van main függvényed?
Jester
végülis az egesz program a main-ben van
Van olyan sor a programodban, hogy:
int main(int argc, char **argv)
?
[Szerkesztve]
Raw Dark Pure
ha adnék egy linket a forrasfajlról meg tudnád nézni mi a gond?
Egyből meg is tehetted volna
Jester
Nekem fordul, igaz néhány warning az van:
$ gcc -Wall huffman2.c
huffman2.c:28: warning: return type defaults to ‘int’
huffman2.c: In function ‘main’:
huffman2.c:37: warning: unused variable ‘freq’
huffman2.c:35: warning: unused variable ‘betu’
huffman2.c:32: warning: unused variable ‘total’
huffman2.c:31: warning: unused variable ‘head’
huffman2.c:104: warning: control reaches end of non-void function
/tmp/cc4T5VqL.o: In function `main':
huffman2.c.text+0x104): warning: the `gets' function is dangerous and should not be used.
Működni éppenséggel nem működik.
Ez mondjuk C nem pedig C++.
Jester
Mire? Fordításra? Ott van, hogy én hogy csináltam. De te még mindig nem írtad ide, hogy neked hogyan sikerült a hibát előidézni.
Jester
szoval van ez a program [link]
es ugy szeretném megcsinalni, hogy 1 fajlbol olvassa ki a dolgokat, csak nemnagyon megy
vki pls help me
mindjárt leverem a gépet az asztalról mert nem megy és 1szerűen nem tudom h hol a hiba
//main
#include ''fifo.h''
#include <stdio.h>
void main ()
{
int array[]={0,1,2,3,4,5,6,7,8,9};
fifo m;
for(int i=0;i=9;i++)
m.push(array);
printf (''%d\n'', m.pop());
}
//fifo.h
#ifndef FIFO_H
#define FIFO_H
class fifo
{
int *t,elementnum;
public:
fifo () {t=0,elementnum=0;}
void push (int n);
int pop ();
~fifo (){delete []t;}
};
#endif
//fifo fgvk
#include <stdio.h>
#include ''fifo.h''
void fifo::push (int n)
{
int *tmp,i;
tmp=new int [elementnum+1];
for (i=0;i<elementnum;i++)
tmp=t;
tmp[elementnum-1]=n;
delete []t;
elementnum++;
t=tmp;
}
fifo::pop ()
{
int *tmp,i,x;
tmp=new int [elementnum-1];
for (i=0;i<elementnum-1;i++)
tmp=t;
x=t[elementnum];
delete []t;
elementnum--;
t=tmp;
return x;
}
// main
void main ()
... helyett ...
int main (int, char**)
(és persze return 0; a végére)
for(int i=0;i=9;i++)
... helyett ...
for(int i=0;i<=9;i++)
// fifo.cpp
tmp[elementnum-1]=n;
... helyett ...
tmp[elementnum]=n;
fifo::pop ()
... helyett ...
int fifo::pop ()
x=t[elementnum];
... helyett ...
x=t[elementnum - 1];
Jester
sziasztok
aki nekem megmondja h mi a hiba leírja és el is magyarázza annak 1-2 heineken jár bp-n!
itt a link ahol van a progi:[link]
üdv:ktg
mod:ja és persze csak az 1. segítőnek jár sör
megoldást püben várok
[Szerkesztve]
Rengeteg baj van vele, sört nem szeretem és azt se ha valaki több topikba is beírja ugyanazt.
Mindenesetre az elsõ 2 probléma (futásidei sorrendben)
1) v1.erase(12) miatt exception lesz hiszen csak 10 elem van a vektorban (szerintem tévedésbõl felcserélted a 2 sort)
2) az Exception osztályodnak nincs copy constructora, emiatt (és mert nem dinamikus példányt hozol létre) a message kétszer lesz felszabadítva.
Jester
az direkt volt 12
azzal akartam tesztelni az exceptionst..
de ezt nem értem..
mi az h nincs copy konstruktora amikor ottvan ..
más is ezt mondta de nem értem.
mit kell változtatni h jó legyen?
Az Exception osztálynak nincs olyan konstruktora, ami egy másik Exception-t fogad paraméternek. A copy constructor szignatúrája így néz ki:
Exception(const Exception& source)
MOD: ha te nem csinálsz ilyet akkor a fordító generál egyet. De az tagonkénti értékadás lesz így aztán több példány is ugyanazt a message tagot fogja használni és mindegyik fel akarja szabadítani. Le kell másolni.
[Szerkesztve]
Jester
üdv!
kéne egy kis help nem értem mi a hiba... (csak az idevágó kódrészeket emelem ki)
header:
class Num{
int egesz;
char* tort;
long exp;
public:
Num Add(Num X, Num Y);
fgv (maga a művelet még nincs megírva)
Num Num::Add(Num X, Num Y) {
Num Result(0,''0'',0);
return Result;
}
így hívom meg:
Num::Add(A,B);
és ezt a hibát kapom:
1>j:\documents and settings\palotai norbert\dokumentumok\visual studio 2005\projects\nagyhazi\nagyhazi\main.cpp(9) : error C2352: 'Num::Add' : illegal call of non-static member function
1> j:\documents and settings\palotai norbert\dokumentumok\visual studio 2005\projects\nagyhazi\nagyhazi\num.h(19) : see declaration of 'Num::Add'
de miért?
ha ezt az összeget értékül adom egy C típusú Numnak akkor az így néz ki C=Num::Add(A,B); ehhez ugye, nem kell operator=, csak copy konstruktor?
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
itt a teljes forrás, ahogy áll most:
[link]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
á már leesett! csak valamelyik példány metódusaként kellett hívni
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
újabb kérdés:
[link]
C = A + B;
operator+ meghívódik, amik benne vannak le is futnak, de amikor a return tmp; - hez ér elszáll, és fogalmam sincs, hogy miért. szintaktialig elvileg ok.
előre is köszi a helpet!
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
C=A+B hez már operator= kell
Szerintem nem kell, mivel ha megnézed a + operátor meg van írva (és num-ot ad vissza).
Screammm: Nekem egyébként lefut a program. (DEV C++) PrintNumot megírva azt dobta amit beleégettél a +-ba. Bár nem nagyon néztem meg, mert lefutott. Megj: () konstruktort írtál hozzá, ami alapból 0,''0'',0, akkor meg felesleges num peldany(0,''0'',0)-lal példányosítani.
Thank you to god for making me an atheist
megírtam operator= - t és most már működik!
a felesleges dolgokat javítom, köszi, hogy szóltál, csak ma egyelőre egy vázat akartam neki összerakni
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
Akkor lehet igaza volt a kollégának, és csak szerencse kérdése hogy nálam így is működik. Melózok úgyhogy nem nézek bele megint.
Thank you to god for making me an atheist
Num& Num:perator+(const Num& b){
Num tmp(0,''0'',0);
tmp.SetEgesz(3);
tmp.SetTort(''000'');
return tmp;
}
Num& Num:perator=(const Num& b){
this->egesz=b.egesz;
this->tort=b.tort;
this->exp=b.exp;
return *this;
}
A = B kódra lefut, A megkapja B értékeit..
C = A + B -re lefut az operator+ visszadja tmp-t, de operator= nem kapja meg valamiért
szerk: operator= fejléc még megkapja a tmp értékeit, de amikor belép a műveleti részbe, b értékei 0, bad ptr, 0 lesz. miért felejti el?
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
tegnap mikor megnéztem a kódodat, a VS2005 warningot dobott az operator+-ra, mert lokális változóra (tmp) mutató referenciát adsz vissza, lehet az lesz a baja de ez csak tipp )
letöltésnél csak a ''this file is hosted by dynamicweb, stb...''-s gif jön be
és nem tudja értelmezni, azt hogy C = A + B ?
operator+ - nál muszáj valami helyi dolgot visszaadnom ami az eredményt tárolja. operator+ meg operator= nem akar együttműködni vagy mi lehet a gáz? lövésem sincsen...
operator=
mi a tökömnek kell operator overload jobb lenne nekem egy Add fgv
szerk:
wow micsoda fejlemények: A + B = C - vel működik
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
idő lejárt: a kód így már lefut, de értelemszerűen nem úgy működik ahogy kellene, mert az összeg csak simán felveszi C értékét
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
ja valóban igazad volt, értéket kell visszaadni nem pedig referenciát és így már jó is
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
Vki elmagyarázná nekem konyhanyelven, hogy az adatbevitelt sztringbe elvégezni mit jelent és mi az előnye a sscanf+fflush függvények meghívásával szemben?
<< Heimdal >>
operator+ - nál muszáj valami helyi dolgot visszaadnom ami az eredményt tárolja
ha egy helyi pl. tmp változót létrehozol, és abba teszed az eredményt, akkor azt ne referenciaként add vissza, mert a fv lefutása után a lokális változó megszűnik
referenciaként pl. this-t vagy az egyik kapott opreandust tudod visszaadni
c++ ban van string típus, nem kell pointerezni, nem kell format-stringezni
vki segítesen legyen szíves!!!
combos kis hsz lesz...
szokásszerint megint nem tudom h hol a hiba
biztos lesz benne egy rahedli..
amig nem írtam meg az utólsó 4 fgv-t addig működött jól..
szal ott keresendő a hiba!
köszönöm!
//string.h
#ifndef STRING_H
#define STRING_H
#include <iostream>
namespace TheUltimateString
{
class String
{
// A karakterek aktuális száma:
unsigned 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ó konverziós konstruktor
// Ez felel a char*-> String konverzióért
String(const 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(){delete[]pData;}
// Visszatér a sztring hosszával
unsigned int getLength()const{return elementsNum;}
// Kiírja a sztringet a megadott kimeneti adatfolyamba (a 'cout' ostream típusú):
void print(std:stream& os);
// Visszaadja a megadott pozícióban lévo karaktert, egyébként nullát:
char& operator[](unsigned int pos);
// Konstans objektumokat is le szeretnénk kérdezni
const char& operator[](unsigned int pos)const;
// Összefuz két Stringet
String operator+(const String& theOther)const;
const String& operator+=(const String &theOther);
const String& operator=(const String& theOther);
bool operator==(const String& theOther)const;
bool operator!=(const String& theOther)const;
// Visszaad egy csak olvasható hozzáférést a stringhez
operator const char*()const;
// --- 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);
unsigned int strlen(const String& s);
int strchr(const String& s,char c);
bool strcmp(const String& s1,const String& s2);
char* strstr(const String& s1,const String& s2);
};
}
#endif /* STRING_H */
//string.cpp
#include ''String.h''
using namespace std;
using namespace TheUltimateString;
// Argumentum nélküli konstruktor:
String::String()
{
elementsNum=0;
pData=new char[1];
pData[0]='\0';
}
// Másoló konstruktor:
String::String(const String& string)
{
*this=string;
}
// Egy NULL végu sztringet váró konverziós konstruktor
// Ez felel a char*-> String konverzióért
String::String(const char* str)
{
elementsNum=strlen(str);
pData=new char[strlen(str)+1];
for(unsigned int i=0;i<strlen(str)+1;i++)
pData=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::String(char c, unsigned int times)
{
elementsNum=times;
pData=new char[elementsNum+1];
for(unsigned int i=0;i<elementsNum;i++)
pData=c;
pData[elementsNum]='\0';
}
// Kiírja a sztringet a megadott kimeneti adatfolyamba (a 'cout' ostream típusú):
void String::print(ostream& os)
{
os<<pData<<endl;
}
// Visszaadja a megadott pozícióban lévo karaktert, egyébként nullát:
char& String:perator[](unsigned int pos)
{
return pData[pos];
}
// Konstans objektumokat is le szeretnénk kérdezni
const char& String:perator[](unsigned int pos)const
{
return pData[pos];
}
// Összefuz két Stringet
String String:perator+(const String& theOther)const
{
String s;
s.pData=new char[elementsNum+theOther.elementsNum+1];
for(unsigned int i=0;i<elementsNum;i++)
s.pData=pData;
for(i=0;i<theOther.elementsNum;i++)
s.pData[i+elementsNum]=theOther.pData;
s.elementsNum=elementsNum+theOther.elementsNum;
s.pData[s.elementsNum]='\0';
return s;
}
const String& String:perator+=(const String &theOther)
{
char* tmp=new char[elementsNum+theOther.elementsNum+1];
for(unsigned int i=0;i<elementsNum;i++)
tmp=pData;
for(i=0;i<theOther.elementsNum;i++)
tmp[i+elementsNum]=theOther.pData;
this->elementsNum+=theOther.elementsNum;
tmp[elementsNum]='\0';
delete[]pData;
this->pData=tmp;
return *this;
}
const String& String:perator=(const String& theOther)
{
elementsNum=theOther.elementsNum;
pData=new char[theOther.elementsNum+1];
for(int i=0;i<theOther.elementsNum;i++)
pData=theOther.pData;
pData[elementsNum]='\0';
return *this;
}
bool String:perator==(const String& theOther)const
{
if(elementsNum!=theOther.elementsNum)
return false;
else
{
int not=0;
for(int i=0;i<elementsNum;i++)
{
if(pData!=theOther.pData)
{not=1; break;}
}
if(not) return false;
else return true;
}
}
bool String:perator!=(const String& theOther)const
{
if(theOther==*this)
return false;
else return true;
}
// Visszaad egy csak olvasható hozzáférést a stringhez
String:perator const char*()const
{
return pData;
}
// --- Statikus függvények. Ezek két stringen végeznek muveletet. ---
// Összefuz két sztringet, és visszatér vele:
String String::concatenate(const String& string1, const String& string2)
{
String s;
s.elementsNum=string1.elementsNum+string2.elementsNum;
s.pData=new char[s.elementsNum+1];
for(int i=0;i<string1.elementsNum;i++)
s.pData=string1.pData;
for(i=0;i<string2.elementsNum;i++)
s.pData[string1.elementsNum+i]=string2.pData;
return s;
}
// Összehasonlít két sztringet:
bool String::compare(const String& string1, const String& string2)
{
if(string1.elementsNum!=string2.elementsNum)
return false;
else
{
int not=0;
for(int i=0;i<string1.elementsNum;i++)
{
if(string1.pData!=string2.pData)
{not=1; break;}
}
if(not) return false;
else return true;
}
}
// A második sztringet az elso sztringbe másolja:
void String::copy(String& string1, const String &string2)
{
string1.elementsNum=string2.elementsNum;
string1.pData=new char[string2.elementsNum+1];
for(int i=0;i<string2.elementsNum+1;i++)
string1.pData=string1.pData;
}
unsigned int String::strlen(const String& s)
{
return s.elementsNum;
}
int String::strchr(const String& s,char c)
{
for (int i=0;i<s.elementsNum;i++)
if (s.pData==c)
return i+1;
}
bool String::strcmp(const String& s1,const String& s2)
{
if (s1.elementsNum==s2.elementsNum)
for (int i=0;i<s1.elementsNum;i++)
{
if (s1.pData!=s2.pData)
return false;
if (i==s1.elementsNum-1)
return true;
}
else return false;
}
char* String::strstr(const String& s1,const String& s2)
{
char* s=''nincs benne/0'';
char* string2=new char [s2.elementsNum+1];
for (int i=0;i<s2.elementsNum;i++)
string2=s2.pData;
string2[s2.elementsNum]='/0';
for (i=0;s1.elementsNum;i++)
{
if (s1.pData==s2.pData[0])
{
for (int j=0;j<s2.elementsNum;j++)
{
if (s1.pData[j]!=s2.pData[j])
return s;
if (j==s2.elementsNum-1)
return string2;
}
}
}
}
//theultimatesample.cpp
#include <iostream>
#include ''String.h''
using namespace std;
using namespace TheUltimateString;
int main()
{
String str1=''Hello Moneypenny.'';
printf(str1);
str1=''My name is Bond. '';
str1+=''James Bond.'';
printf(''\n%s\n'',(const char*)str1);
if(str1==(String)''My name is Bond. James Bond.''
&&!(str1!=(String)''My name is Bond. James Bond.''))
{
cout<<''Oh, Mr. Bond!''<<endl;
}
return 0;
}
belefért
ezt még fordítani sem tudom, egyszerűbb ha felteszed a forrásfájlt vhova
(smile-kat + stringkonstansokat még visszairogattam, de így is elég sok errort dob, pl. char*-nak adsz chart értékül, vagy char*-ot hasonlítasz össze char-ral)
vagy pl. egy helyen így inicializál stringet:
String::String(char c, unsigned int times)
{
elementsNum=times;
pData=new char[elementsNum+1];
for(unsigned int i=0;i<elementsNum;i++)
pData=c; // pData az char* típusú
// esetleg pData = c; a fenti helyett
pData[elementsNum]='\0';
}
[Szerkesztve]
no mire beírtam már nem tudom újból szerkeszteni, de úgy tűnik a szögletes zárójeleket lenyeli, mert pData [ i ] -t írtam szal mindenképp töltsd fel vhova
class Num{
int egesz;
char* tort;
unsigned long long exp;
ez lenni adatstruktúra, ennek a destruktorát így kell megírni elvileg:
Num::~Num(){
delete tort;
};
csak mert ha írok destruktort elszáll a progim
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
delete [] tort;
Másrészt a függvény definíció után nem kell pontosvessző, bár nem zavarja a kutyát sem.
[Szerkesztve]
Skynet is real. It's called Google.
Ha ez lenne a megoldás, a sima delete miért okozna hibát ezzel szemben? Meg még az sem biztos, hogy tömböt akar.
Szerintem nem foglalt le helyet a tortnek, és azért dob neki hibát a delete miatt.
Thank you to god for making me an atheist
Ha Visual Studioban programozik (amiben elvileg kötelező lenne BME-s létére - a világ legnagyobb baromsága), akkor emlékeim szerint fordítási hibát kap, de figyelmeztetést biztosan.
Nem ártana egy pontos hibaüzenet.
Szerk: Neked van igazad, ''elszáll a progim'' - tehát futási idejű hiba (=lefordul).
Szerk 2: Tömbös megoldás a javallott a feladatához, onnét gondolom, hogy tömb kell neki.
[Szerkesztve]
Skynet is real. It's called Google.
delete[]-vel sem megy
memóriát pedig a konstruktor foglal neki még az elején:
tort=new char[strlen(t)+1];
szerk:
Program ...
HEAP CORRUPTION DETECTED: after Normal block (#134) at 0x001A3A20.
CRT detected that the application wrote to memory after end of heap buffer.
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
Milyen hibaüzenettel száll el?
Skynet is real. It's called Google.
egyébként nagyon sok helyen szabadítok fel memót char*-ok után szimplán delete - vel és sehol sem jelez hibát
szerk:
okok, de arra nincs ötleted destruktornál miért hal meg?
[Szerkesztve]
"Hmm," sed teh lolrus. "Maybe we shud go ask Ceiling Cat?"
Amíg nem telik meg a memória, addig nem is fog (ezek szerint Vis Studio sem). Viszont elég erősen folyik a szegény, ha nem zárójeles delete-tel szabadítasz fel tömböt.
Skynet is real. It's called Google.
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!