Új hozzászólás Aktív témák
-
Jester01
veterán
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
-
Jester01
veterán
// 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
-
Jester01
veterán
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
-
Jester01
veterán
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
-
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
-
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
-
Jester01
veterán
-
Jester01
veterán
válasz FehérHolló #167 üzenetére
Szerintem várd meg míg Amargo megmagyarázza, mert nekem sem tiszta mi előnye van a 2 time hívással szemben. Ráadásul ezek windowsos varázslatnak tűnnek.
Jester
-
Jester01
veterán
* Az strcmp az nem boolean visszatérési értékű kellene legyen. Ha a compare viszont igen, akkor az nyugodtan hívhatja az strcmp-t.
* Az strcmp-ben a if (i==s1.elementsNum-1) feltétel elég borzasztó, elég lenne a ciklus után visszaadni igaz értéket
* rendszeresen nem szabadítod fel az előző tartalmat
* hiányzik a lezáró 0 byte a concatenate fvben
* if(not) return false; else return true; ilyet ne csinálj már
* strchr nem mindig ad vissza értéket, de ha igen, akkor biztos, hogy kell a +1 ?
* az strstr gyakorlatilag halvaszületett
Első ránézésre ennyi.Jester
-
Jester01
veterán
strcmp: <0 =0 >0 értéket add vissza attól függően, hogy az első string kisebb, egyenlő vagy nagyobb mint a második. compare fv-t nem tudom honnan vetted, nincs a feladatban.
strstr igazából az strchr-hez hasonlóan pozíciót kellene visszaadjon mivel a te implementációdban a char*-nak szerintem semmi értelme.Jester
-
Jester01
veterán
Elég buta dolog ilyen megkötést adni, hogy az [] operátort kell használni...
Mindenesetre a legegyszerűbb megoldás ha fogsz egy vector<string> változót és szépen beolvasod a sorokat a fájlból. Abban aztán indexelhetsz [] operátorral, beszúrhatsz/törölhetsz és a végén kiírod újra az egészet.Jester
-
Jester01
veterán
válasz atm*RefeeZ #253 üzenetére
Mivel ez a c++ topik, ezért gondolom c++ megoldás kell. Ott meg van string osztály. Kész.
string f() { return "alma"; }
k.t.a: természetesen vissza lehet adni char*-ot, ha olyan helyre mutat ami nem szabadul fel. A konstansok pl éppen ilyenek
const char* f() { return "alma"; }
Hasonlóképpen dinamikusan is lehet foglalni, persze ilyenkor a hívó felelőssége, hogy használat után felszabadítsa.
char* f() { return strdup("alma"); }
...
char *s = f();
printf("%s\n", s);
free(s);Jester
-
Jester01
veterán
Ezt a dinamikus dolgot nem tartom túl elegáns megoldásnak, mégha működik akkor sem.
Hát pedig nagyon sok minden így működik, még azzal is megspékelve, hogy nem is simán free-t kell rájuk hívni, hanem az api-ban van megfelelő felszabadítási párja.
Vagy valamit rosszul értek?
Minden bizonnyal. A konstansok ugyanis nem a veremben laknak, az teljesen jól működik.
MOD: Egyébiránt a te megoldásod 100%osan ekvivalens ezzel, hiszen te sem másoltad le a visszadott értéket. A lényegileg más megoldás az így nézne ki:
void f(char* buf) { strcpy(buf, "alma"); }
Na ez valóban a hívó által beadott területre ír. Persze itt célszerű átadni a puffer méretét is, a túlcsordulás elkerülése végett.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz atm*RefeeZ #260 üzenetére
Arra, hogy a prototípusból lemaradt a csillag.
void mailcim(char*);
Amúgy ez: strcpy(m,mail); nagyon rossz lesz neked. Miért is nem simán mailcim(mail) ?
MOD: ja és a hozzáértő emberek továbbra is látják, hogy ez sima C.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz icespeak #415 üzenetére
Mivel a P tömbben a napi nyereség/veszteség van, ezért az aktuális napi pénzünk az aznapi és az összes megelőző nap P értékének valamint persze a kezdeti pénzmagnak az összege. Amíg ez pozitív vagy nulla, addig nem kell kölcsönkérni. A függvény egyébként hibás, mivel az X értékét nem veszi figyelembe.
Jester
-
Jester01
veterán
Az összegzés megvalósítása hibás, túlcímez a lefoglalt területen. Eleve, ha két darab x jegyű számot összeadok, az eredmény már x+1 jegyű is lehet, de te ráadásul x-1 jegynek foglalsz csak helyet.
MOD: ja majd ha már működik, akkor esetleg érdemes lenne fel is szabadítani a lefoglalt területeket
[ Szerkesztve ]
Jester
-
-
Jester01
veterán
Jó az, csak az a lépés maradt ki, hogy a max változóba a ciklus előtt beletedd a maximum értéket.
void szamok::normalizalas()
{
double max = maximum(); // <---- EZ ITT NI
vector<double>::iterator it;
for(it=szam.begin();it!=szam.end();it++)
{
cout<<*it/max<<" ";
}
cout<<endl;
}MOD: Úgy sejtem erre egy lesz a válasz
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz icespeak #494 üzenetére
1. hiányzik az using namespace std; (fordítófüggő, de ez a helyes)
2. a Megszamol függvénynek felesleges a c paraméter, a t viszont lehet referencia, ha már úgyis const.
3. a Megszamol függvény hívásakor a t vektort viszont illene átadni
4. a Megszamol függvényben a vektor elemeit kellene hasonlítani. Gondolom a hegycsúcs akkor hegycsúcs ha magasabb a tőle jobbra és a tőle balra lévő értéknél is. Tehát feltehetőleg || helyett && feltétel kell, és a szélső elemek nem lehetnek csúcsok.
5. a ReadFromKeyboard függvényben int változóba olvasol be, azt nem lehet összehasonlítani a "quit" stringgel. Vagy olvass stringbe mint a Read12 függvényben, vagy használj más kilépési feltételt. Az én verziómban negatív szám beírásával lehet kilépni.--- t.cpp.orig 2009-03-11 15:04:31.000000000 +0100
+++ t.cpp 2009-03-11 15:18:08.000000000 +0100
@@ -3,7 +3,9 @@
#include <sstream>
#include <vector>
-int Megszamol(const vector<int> t, int &c);
+using namespace std;
+
+int Megszamol(const vector<int> &t);
bool ReadFromFile(const string &fname, vector<int> &t);
void ReadFromKeyboard(vector<int> &t);
int Read12(const string &msg, const string &errormsg);
@@ -52,7 +54,8 @@
// Kiíratás
if(file_ok)
{
- if(Megszamol(c)) cout << "Hegycsúcsok száma:" << c << endl;
+ int c = Megszamol(t);
+ if(c > 0) cout << "Hegycsúcsok száma:" << c << endl;
else cout << "Nincs hegycsúcs"<< endl;
cout << endl << "Futtassam újra? (I/N) "; cin >> ch;
@@ -92,12 +95,9 @@
{
int meres;
cin >> meres;
- while(meres!="quit"){
+ while(meres > 0){
t.push_back(meres);
cin >> meres;
- if (meres < 0){
- meres = 0;
- }
}
}
@@ -128,10 +128,10 @@
return true;
}
-int Megszamol(const vector<int> t, int &c){
+int Megszamol(const vector<int> &t){
int c=0;
- for(int i=0; i<(int)t.size(); i++){
- if(i<i+1 || i+1>i+2){
+ for(int i=0; i<(int)t.size()-1; i++){
+ if(t[i]<t[i+1] && t[i+1]>t[i+2]){
c=c+1;
}
}[ Szerkesztve ]
Jester
-
Jester01
veterán
Hát ez egyszerűnek tűnik, de nem az
Mégpedig azért, mert a bevitel általában soronként pufferelt. Ezt persze át lehet állítani, de macerás. Ilyen kis progik esetén általában bőven megteszi, ha X = enter Akkor pl. egy sima getchar(); jó is (feltéve persze, hogy az összes beadott adatot megette addigra a programod, különben egyből kilép). C++ esetén egy cin >> c; vagy ilyesmi. Mondjuk az esetek 99%-ban kifejezetten ellenjavalt ilyen várakozást tenni a program végére, mert minek.Jester
-
-
Jester01
veterán
válasz #82189568 #554 üzenetére
Hát, az a javítás nem sikerült túl jól. Szerintem kalapáld addig, amíg legalább a -1, +1, +101 értékekre jól működik. Most a 101-re azt mondja víz.
A folytatásra vonatkozó kiírást és bekérést még a while előtt megcsinálhatod és a while-ban csak azt kell ellenőrizni, hogy mit adott be a felhasználó.
Jester
-
Jester01
veterán
válasz #82189568 #556 üzenetére
Ez már majdnem jó. Az a baj, hogy a hőfok bekérésekor a pufferben marad a sorvég jel. Erre a skipws manipulátor a segítség.
Ha egyszer c++, akkor az stdio-t és az stdlib-et felejtsd el és ne használd a standard C i/o műveleteket (de legalábbis ne keverd a kettőt).
Tehát a releváns 2 sor pl így nézzen ki:
cout << "Ujra ? (I vagy i)? ";
cin >> skipws >> repeat;Mivel a bemenet alapból soronként pufferelt, ezért a kérdésre nem elég i-t nyomni, hanem kell az enter is. Ennek kikerülésére nincs egyszerű mód.
Jester
-
Jester01
veterán
válasz Darth_Revan #564 üzenetére
Valami ilyesmire gondoltál?
#include <iostream>
#include <vector>
using namespace std;
template<class T>
class Array
{
public:
T& operator[](unsigned int i)
{
if (i >= _vector.size())
{
_vector.resize(i + 1);
}
return _vector.at(i);
}
operator T*()
{
return (_vector.size() > 0) ? &_vector.at(0) : 0;
}
private:
vector<T> _vector;
};
int main()
{
Array<char> s;
s[0] = 'a';
s[1] = s[0] + 1;
s[3] = 'c';
cout << (char*)s << endl;
Array<int> a;
a[1] = 3;
a[2] = 2;
a[3] = a[0] + a[1] + a[2];
for(int i = 0; i < 5; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}Az átméretezésnél szokás inkább duplázni a méretet.
Jester
-
Jester01
veterán
Úgy nagy vonalakban belegondoltál mennyi memória kellene ahhoz? Ugye abszolút minimum szinten egy 32 bites rendszeren verem alapú paraméterátadás esetén ez legalább 12 byte/hívás. Ha 1 milliárdig szeretnél menni akkor az már 12GB lenne amit persze már meg sem tudsz címezni. 64 bites rendszeren pedig 24GB kellene, de azt legalább van esélyed megcímezni
MOD: ja persze ha a szám megy 1 milliárdig akkor az sqrt miatt kevesebb is elég lesz az igaz.
[ Szerkesztve ]
Jester
-
Jester01
veterán
A sizeof(char) nem fogja megmondani a char méretét mert az definíció szerint mindig 1 lesz. C szabvány, 6.5.3.4.3 pont a sizeof operátorról: "When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1."
A CHAR_BITS az viszont igen
Jelenleg azonban nem ez a probléma, hanem az, hogy a ~ operátor (unsigned) int típusra automatikus konverziót csinál, lásd szabvány 6.5.3.3.4: "The result of the ~ operator is the bitwise complement of its (promoted) operand ... The integer promotions are performed on the operand, and the result has the promoted type."
Jester
Ú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!
- Redmi Watch 4 - olcsó hús, sűrű a leve
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- A fociról könnyedén, egy baráti társaságban
- Itt az első kép a 2024-es Nokia 3210-ről
- Hogy is néznek ki a gépeink?
- OLED TV topic
- Ford topik
- Filmvilág
- Milyen cserélhető objektíves gépet?
- Call of Duty: Modern Warfare III (2023)
- További aktív témák...