- Vivo X200 Pro - a kétszázát!
- One mobilszolgáltatások
- Megérkezett a Google Pixel 7 és 7 Pro
- Hatalmas kedvezménnyel nyit az Ulefone új csúcsmodellje
- Okosóra és okoskiegészítő topik
- Motorola Moto G84 - színes egyéniség
- Magisk
- Redmi Note 12 Pro - nem tolták túl
- Telekom mobilszolgáltatások
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
Hirdetés
Ú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!
- Vivo X200 Pro - a kétszázát!
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- One mobilszolgáltatások
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- Tuningmesterek, teszterek, figyelem! Itt a Thermal Grizzly spéci tesztpadja!
- Motoros topic
- SamKnows és NMHH internet sebességmérés
- gban: Ingyen kellene, de tegnapra
- Luck Dragon: Asszociációs játék. :)
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
- További aktív témák...
- Eladó PC i7 8700, 16 GB RAM, GTX 1060, 460 GB SSD
- Szép! HP EliteBook 840 G8 Fémházas Hordozható Laptop Ultrabook 14" -65% i5-1145G7 32/512 Iris Xe FHD
- Eladó Lego Star Wars - Mandalorian Fang Fighter vs Tie Interceptor (75348)!
- Asus AM1M-A AMD AM1 alaplap + Quad Core AMD Sempron 3850 Processzor
- HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 16/512 Iris Xe FHD
- LG 40WP95XP-W - 40" NANO IPS - 5120x2160 5K - 72Hz 5ms - TB 4.0 - HDR - AMD FreeSync
- Hp Prodesk 600 G3/ G5/ G6 SFF/ i5 8-9-10 gen / Elitedesk 800 G4 /Win11- Számla, garancia
- Fujitsu USB Port Replicator PR09 docking station (1x5K vagy 2x4K felbontás) (DisplayLink)
- iKing.Hu - Vivo X200 FE Blue Használt, újszerű állapotban 12 GB RAM / 256 GB tárhely Garancia!
- Új MSI Katana 15 Gamer FHD IPS 144Hz i7-13620H 10mag 16GB 512GB Nvidia RTX 4060 8GB Win11 Garancia
Állásajánlatok
Cég: FOTC
Város: Budapest