- Ilyen lesz a Fairphone 6
- 45 wattos vezeték nélküli töltés jön az új iPhone-ba
- Motorola Edge 40 - jó bőr
- Motorola Razr 60 Ultra - ez a kagyló könnyen megfő
- Magyarországon is kapható a Moto G85 5G
- Karaktere biztos lesz az első Nothing fejhallgatónak
- Netfone
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Samsung Galaxy A54 - türelemjáték
- Nothing Phone (3a) és (3a) Pro - az ügyes meg sasszemű
Új hozzászólás Aktív témák
-
Jester01
veterán
válasz
Tuostein #758 üzenetére
Igen, ott a hiba.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400cca in keres (n=@0x7fff4645dc2c, m=@0x7fff4645dc28, k=0x18960b0, min=0x0, kutya=0x0) at t.cpp:118
118 if (kutya[i-1][j-1]<=min[j-1]) {Innen rögtön látszik mi a baj: a min és a kutya paraméter is 0. Ha közelebbről megnézed, az is kiderül miért: mert a beolvas függvény az érték szerinti átadásból következően nyilván nem módosítja a main-ben lévő változókat.
Egyébiránt ezt a fordító (gcc) nekem jelzi is:
t.cpp:15: warning: 'max' is used uninitialized in this function
t.cpp:15: warning: 'min' is used uninitialized in this function
t.cpp:15: warning: 'kutya' is used uninitialized in this functionHa ezeket referenciaként adod át már jobb lesz a helyzet, ekkor működni is látszik a programod
-
Jester01
veterán
Neked igen érdekes hibát dob a fordító, az enyém az "érthetően" megmondja mi a baj:
Vector.cpp:127: error: no match for 'operator<<' in 'std:
perator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std:
stream*)os)), 32) << ((const Vector*)v)->Vector::at(i)'
Magyarul, a Vector-t kiíró operator<< a String-et kiíró operator<< függvényt szeretné hívni, csakhogy ilyen nincs. Van helyette viszont String::print, szóval ez jobb: os<<' '; v.at(i).print(os); Ehhez még szükséges a String::print const-tá alakítása, illetve a Vector.h-ban az operator<< prototípusát is javítani kell mert nem egyezik az implementációval. Ha ez mind megvan, akkor már fordul, csak nem működik
Felhívom a figyelmed továbbá, hogy a string konstansok azok bizony konstansok, tehát const char* típusúak.
-
Jester01
veterán
ss << year << '.'; //Ev
if (month < 10) { // 1 helyett 01 legyen
ss << 0;
}
ss << month << '.'; //Honap
if (day < 10) {
ss << 0;
}
ss << day << '.'; //NapEzt c++ nyelvjárásban úgy mondják, hogy
ss << setfill('0')
<< setw(4) << year << '.'
<< setw(2) << month << '.'
<< setw(2) << day << '.'; -
Jester01
veterán
Nem működő programok esetén
1) használj debuggert
2) használj memória-hozzáférés ellenőrzőt (valgrind)
3) mondd meg pontosan milyen bemenetre milyen hibát ad, vagy mennyiben nem várt eredményt (a "nem fut le normálisan" nulla információ)
4) teljes, futtatható programot postolj, hogy mi is ki tudjuk próbálni (ebben ugye nem volt main) -
Jester01
veterán
Mi meg arra lettünk volna kiváncsiak, hogy milyen operációs rendszer alatt.
Linuxon mindenesetre első közelítésben inkább a parport driver által szolgáltatott ioctl-ek használata javallott. Ha pedig mindenképp közvetlen portelérés kell akkor a megfelelő jogosultságok beállítása után inline asm vagy az előre definiált in/out függvénykkel lehet elérni. -
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."
-
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.
-
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.
-
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.
-
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ó.
-
-
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 = enterAkkor 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.
-
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;
}
} -
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
-
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
-
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.
-
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.
-
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.
-
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); -
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. -
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. -
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. -
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.
-
Jester01
veterán
válasz
FehérHolló #161 üzenetére
Mire is kell itt a ctime?
-
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ó. -
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. -
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] -
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. -
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]; -
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++.
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Milyen egeret válasszak?
- Xbox Series X|S
- Path of Exile (ARPG)
- One otthoni szolgáltatások (TV, internet, telefon)
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- SSD kibeszélő
- Elektromos autók - motorok
- Ilyen lesz a Fairphone 6
- Miért vezet mindenki úgy, mint egy állat?
- További aktív témák...
- DDR5 GAMER PC: Új RYZEN 7 8700F/9700X/9800X3D +RTX 4060/5060/4070/5070 +16-64GB DDR5! GAR/SZÁMLA!
- Dell Latitude 7410 Strapabíró Ütésálló Profi Ultrabook 14" -80% i7-10610U 16/512 FHD
- Szép! HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 32/512 Iris Xe FHD Magyar
- HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 8/512 Iris Xe FHD Magyar
- 512 Gb-os NVME-k
- AKCÓÓÓ!!! Panasonic CF-XZ6 AIO all-in-one laptop tablet 2k touch i5-7300u speciális ütésálló
- BESZÁMÍTÁS! Apple MacBook Pro 14 M4 MAX 36GB RAM 1TB SSD garanciával hibátlan működéssel
- Dell USB-C, Thunderbolt 3, TB3, TB4 dokkolók (K20A) WD19TB/ WD19TBS/ WD22TB4, (K16A) TB16/ TB18DC
- Lenovo Legion Pro 5 16IRX9
- ÁRGARANCIA! Épített KomPhone Ryzen 7 5800X 16/32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged