- Google Pixel topik
- iPhone topik
- Hivatalos a OnePlus 13 startdátuma
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Android szakmai topik
- Milyen okostelefont vegyek?
- Apple Watch
- A hagyományos (nem okos-) telefonok jelene és jövője
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Fotók, videók mobillal
Új hozzászólás Aktív témák
-
bandi0000
nagyúr
-
bandi0000
nagyúr
válasz
Dave-11 #2379 üzenetére
erre már én is gondoltam, mert az első sorban 1db szám van ami megmondja hány adat van, de azt kiszedtem a txt-ből szóval elvileg úgy kell lennie
viszont a charba azt adom meg hogy hány karakteres max szöveg lesz benne ugye?
14 1 2 0 2 Agarak Ovatosak
5 4 0 1 0 Erosek Agarak
4 0 2 0 2 Ijedtek Hevesek
8 1 1 0 0 Ijedtek Nyulakilyeneket kellene beolvasnom csak hogy tiszta legyen a kép
amúgy nem hibát ír, hanem lefut nem csinál semmit és kiírja hogy az exe leállt
A csapatok és a
fordulók száma nem haladja meg a 20, a mérkőzések száma pedig a 400 értéket. Egy csapat
sem rúgott meccsenként 9 gólnál többet. A csapatok neve legfeljebb 20 karakter hosszú, a
névben nincs szóköz.Ezt meg a feladatból vágtam ki, nem tudom van e létjogosultsága
-
h1ght3chzor
őstag
-
dabadab
titán
válasz
Dave-11 #2246 üzenetére
Ize, neked nem is az exec() kell, hanem a system(), ami egyszeruen vegrehajt egy parancsot ugy, mintha parancssorbol beirnad. Hogy a Karma altal linkelt leirasbol vegyem a peldat:
int main(void)
{
// kiirod a kiirnivalot a text.txt-be
system("print /d:\\\\pserver\\laser1 c:\\text.txt");
}Persze ez abszolut hordozhatatlan megoldas, de legalabb tenyleg nem bonyolult
-
dabadab
titán
válasz
Dave-11 #2243 üzenetére
"Van valami egyszerű mód arra, hogy elérjük a nyomtatót és ki tudjunk vele nyomtatni tetszőleges dolgokat?"
Nincs. Ha nyomtatni akarsz akarsz, ahhoz valami kiegeszito konyvtarra van szukseged, pl. a QT nyomtatni is tud, de azert egyszerunek nem neveznem.
"Akár úgy is jó, hogy előtte kiírom őket egy txt-be, és aztán adom ki a nyomtatási parancsot."
Ezt mondjuk megcsinalhatod gond nelkul, erre van az exec().
-
moseras
tag
válasz
Dave-11 #2233 üzenetére
Üdv!
x: az egyedek pillanatnyi száma
x0: az egyedek kezdeti száma (ez lesz a kezdeti feltétel)
t: idő
k: arányossági tényező
e: Euler féle szám
^: hatványozásAz egyedek növekedési sebessége arányos a egyedek pillanyatnyi számával.
Vagyis diff.egyenletben: dx/dt = k*x, ha ezt megoldod (integrálás vagy Laplace),
akkor valami x = x0 * e^(k*t) lesz. Ezt kell számítani programban.Imi.
-
Jester01
veterán
válasz
Dave-11 #2194 üzenetére
Alapesetben a getline() az ajánlott, igény szerint hossz ellenőrzéssel és hibajelzéssel.
Nyilván ha 20 karakternél többet ad a felhasználó és te nem olvasod be, akkor a következő beolvasások onnan folytatják. A getline() az egész sort beolvassa neked, tehát ilyen probléma nem lesz.
-
WonderCSabo
félisten
válasz
Dave-11 #2180 üzenetére
Globális függvényeknél a static kulcsszó annyit tesz, hogy az általa jelölt függvényeket nem lehet használni más fordítási egységekben, tehát csak belső linkelést tesz lehetővé.
Leegyszerűsítve és picit kiferdítve: az ilyen függvényeket más fájlban nem hívhatod meg.
Szerk.: Jester megelőzött.
-
Jester01
veterán
válasz
Dave-11 #2180 üzenetére
A static ilyen használata (mert van neki sajnos több is) azt jelenti, hogy az adott függvény csak az aktuális modulban (fájlban) használható, kívülről nem. Ezáltal a fordító jobban optimalizálhat és nem koszoljuk össze a globális névteret. Jelen esetben persze nem volt jelentősége.
-
Jester01
veterán
válasz
Dave-11 #2178 üzenetére
Ha szabad néhány dolgot megjegyeznem (konstruktív célzattal):
* a magyar és az angol elnevezések keverése nem szép dolog.
* return után nem kell else
* ha már c++ akkor van benne sort gyárilag
* ha nem használod a sort-ot akkor legalább függvénybe illene kitenni a saját implementációt
* a négyzetgyökre még meg kell nézni az oszthatóságot, vagyis <= kell
* nem kell float-ra castolni az sqrt hívásban
* a 2-t nem kell speciálisan kezelni
* nem kell új vektorAz én megoldásom így néz ki (bele szabad kötni):
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
static bool isPrime(int a)
{
if (a <= 1) return false;
for(int i = 2; i <= sqrt(a); i++)
{
if ((a % i) == 0) return false;
}
return true;
}
static void problem5(vector<int>& v)
{
vector<int>::iterator boundary = partition(v.begin(), v.end(), isPrime);
sort(v.begin(), boundary, less<int>());
sort(boundary, v.end(), greater<int>());
}
int main()
{
int numbers[] = { 2, 3, 1, 6, 7, 4, 5, 9, 8 };
vector<int> v(numbers, numbers + sizeof(numbers) / sizeof(numbers[0]));
problem5(v);
for(unsigned i = 0; i < v.size(); i += 1)
{
cout << v[i] << ' ';
}
cout << endl;
return 0;
} -
modder
aktív tag
válasz
Dave-11 #2157 üzenetére
ja, hát igen, ott nem hívsz delete-et, szóval értelemszerűen nem szabadítod fel, tehát ja, memória szivárgás. azért hozzá kell tenni, hogy ahogy meghal a processz, nyilván felszabadul minden lefoglalt memória, de ha egy ilyen kódrészlet valahol be van ágyazva a programban, akkor igen, ez pont az: memóriaszivárgás
Szerk:
Ja várjál, most látom, hogy mit csinálsz. Igen, ez mindenképpen rossz, mert amikor a Pajtit létrehozod, akkor a Dog másoló konstruktora hívódik meg, szóval lesz két változód. Egy a heap-en, amit a makeDog()-ban csináltál, egy pedig a stack-en, a Pajti. És már fel sem tudod szabadítani a heap-en foglalt memóriaterületet, mert elveszetetted, a hozzá tartozó memóriacímet, amikor visszatértél a függvényből. A címet, amit a lenti esetben a Pajti* változód tárol, azaz a pointered. -
kingabo
őstag
válasz
Dave-11 #2124 üzenetére
Szerintem ez az indoklás kicsit sántít, mert átadható ref paraméterként az adat, így az fv lefutása után is eléred az adatot.
Szerintem a dinamikus szó sokkal jobban leírná a lényegét. Vagyis a progid futása közben derül ki pl, hogy mekkora tömböt kell lefoglalnod. Erre szokott példa progi lenni, hogy kérd be usertől, hogy hány adatot akar megadni (n), foglalj le egy ekkora tömböt és utána kérd be. Ugye az n értéket a fordító fordítási időben nem tudja, csak futási időben derül ki. És ahogy már többen is leírták nem szabad elfelejteni a lefoglalt memória területet felszabadítani!
A többiek biztos tudnak még erre más felhasználási lehetőségeket /jobb példát (magyarázatot) hozni, tőlem most sajna csak ennyire futotta... -
WonderCSabo
félisten
válasz
Dave-11 #2121 üzenetére
Nem. A fenti esetben a mutató nem lesz meg, hiszen az egy lokális változó. A dinamikusan legfoglalt int meg lesz, csak a címét nem fogjuk meg tudni soha, ezért memóriafolyás történik.
Igen, egy mutatót bármikor átállíthatunk egy másik memóriacímre.
Nyilván úgy érhetjük el az 5-öt, hogy vhol eltároljuk a memóriacímét.
-
yksz
aktív tag
válasz
Dave-11 #2121 üzenetére
Ha kulsoleg nem tároltad el valahol a mutatót akkor ezentúl sehogy nem éred el, ezért is memory leak a neve... majd felszabadul ha a teljes programod futása véget ér. Az ilyenek viszont nagyon szépen fel tudják zabálni a memet. milliószor lefuttatod és bamm máris van egy 32millió használatlan bited.
Legtobbszo tobb visszatérési érték átadására használják. fuggvényparaméterként megadsz n darab pointert és azokat állítod a fuggvényben így a fuggvény által létrehozott értékek fuggvényen kívulrol is elérhetoek lesznek.
-
WonderCSabo
félisten
válasz
Dave-11 #2119 üzenetére
A statikusan lefoglalt változók a veremben kerülnek tárolásra. Ezek a változók csak addig élnek, amíg az a blokk fut, ahol deklarálták őket (pl. fv, vagy ciklus stb.)
void function() {
int loc;
/* műveletek ... */
/* fv vége */
/* itt a 'loc' változó felszabadul */
}Ez azt jelenti, hogy amint vége van a blokknak, a memóriaterület, ahol a változó volt tárolva, felszabadul, tehát bmilyen más dologra felhasználhatóvá válik, nem lehet ezt a változót többet legálisan használni.
Ha dinamikusan foglalod le a memóriát, akkor az a blokk vége után sem szabadul fel, csak akkor, amikor te explicit mondod neki.
void function() {
int* a = new int;
/* itt maga a mutató felszabadul, tehát a változó, ami az újonnan
lefoglalt érték címét tartalmazza, de maga az újonnan létrehozott érték nem szabadul fel */
}Persze ha itt nem tárolod el vhol az újonann létrehozott objektum címét, akkor sosem fogod tudni manuálisan felszabadítani sem, ezt hívják memory leaknek.
-
Karma
félisten
válasz
Dave-11 #2012 üzenetére
Miért pont a GTK-t választottad? Egyrészt az egy C library, nem C++, másrészt ha nem kötelezően ez a parancs, miért nem Qt?
A kérdésre válaszolva a lib használatához két dologra van szükség: az include path helyes beállítására (hogy a C fordító megtalálja a headeröket, azaz fel kell venned a GTK megfelelő mappáját oda); másrészt a linkernek tudnia kell arról, hogy egybe kéne fordítani a cuccod a GTK library-val.
CB-t már nagyon régen nem használtam, úgyhogy nem mondom meg merre is találod ezeket. De valószínűleg a projekt tulajdonságainál.
-
Karma
félisten
válasz
Dave-11 #1855 üzenetére
Továbbra se javaslom a C++/CLI-t. Ha már egyszer CLI-re dolgozol (amit bevonzottál a Windows Forms-szal), vannak fejlesztőbarátabb nyelvek is, nem véletlen emlegetem a C#-ot
Én eléggé beleszülettem (meg egyetemen tanultam meg a nyelvi alapokat), így nem nagyon tudok jó forrást, de a StackOverflow megér egy keresést. Ez mondjuk egy C#-os topik linkje.
-
Karma
félisten
válasz
Dave-11 #1853 üzenetére
Azt szabad tudni, hogy miért erőlködsz a Visual C++-szal, ha nem értesz hozzá? Miért nem inkább C# kódot írsz? Akkor legalább lenne IntelliSense VS2010-ben is.
A formnak elvileg nincs is Name propertyje a designerben, mert nincs sok értelme. A Text propertyje befolyásolja az ablak címét.
A Location pedig Point típusú, úgyhogy nem fogsz tudni stringet megadni neki. Sőt az se jó, ha a point X vagy Y propertyjét kézzel frissíted, ez a sor viszont működik:
button1->Location = Point(button1->Location.X, button1->Location.Y + 10);
-
sztanozs
veterán
válasz
Dave-11 #1850 üzenetére
Ez kb annyira mellékkérdés, mint sz*r mellett falni, vagy fal mellett sz*rni...
Azt a "nevet" kell használni, amit az osztályból rétrehoztál. A Name property abban tud segíteni, ha egy konténerben név alapján akarsz megkereni egy kontrollt. Elnevezheted akárminek, de az a lényeg, hogy a kódban hogy lett létrehozva az objektum.
Ahogy nézem magára formra nem szokott lenni létrehozva változó, de a Form1 kódján belül a Form1->Location helyett a this->Location-t tudod használni (vagy csinálsz egy változót és átadod neki a this referenciáját).
Kicsit bővebben: this
-
Karma
félisten
válasz
Dave-11 #1850 üzenetére
Nem értem a kérdés azon részét, hogy elérni az adatokat. Nem a Form codebehind fájljába írod ezt a logikát?
Már ha Windows Formsot használsz a Designerrel.
Ha igen, akkor megadhatsz minden komponensnek egy Name tulajdonságot, amivel el tudod érni kódból (ha a GenerateMember.vagy nagyon hasonló nevű property true, ami alapból az).
Ha meg kézzel csinálod a GUI-t, akkor te irányítasz mindent.
Hozzá kell tennem, hogy én elsősorban C#-os vagyok, és abból indulok ki jobb híján.
-
dabadab
titán
válasz
Dave-11 #1830 üzenetére
Az srand() inicializalja a randomgeneratort, ezt csak egyszer kell megcsinalni, praktikusan a program elejen. Ez altalaban nem tul bonyolult kod es elmondhato rola, hogy ha ugyanazzal a szammal inicializalod, akkor utana pontosan ugyanazokat a "veletlen" szamokat fogod kapni, ezert nepszeru megoldas, hogy a jelenlegi idovel inicializaljak, valahogy igy: srand( time() );
A rand() meg ezek utan egyszeruen visszaad egy veletlenszamot (ami a 0 - RAND_MAX intervallumba esik).
Ha intervallumot akarsz (mondjuk X es X+Y koze), akkor az egyszeru, ertheto es naiv megoldas az, hogy a rand altal visszaadott szamnak az Y-nal valo osztasanak a maradekat veszed es hozzaadod X-et. Konkretan a te peldadban (1-50, ahol X = 1 es Y = 49):
int random_number = rand() % 49 + 1;Es akkor most egy kicsit kenytelen vagyok arrol szolni, hogy valojaban miert istentelen nagy szivas ez az egesz veletlenszam-temakor: a fenti peldaban, ha Y nem ketto valamelyik egesz szamu hatvanya (1, 2, 4, 8, 16 stb), akkor a veletlen szamaid eloszlasat megnezve fel fog tunni, hogy nem azonos esellyel kapod a szamokat, hanem lesz egy hatar es az alattiak valamivel nagyobb valoszinuseggel fordulnak elo. A miert megmagyarazasat az olvasora bizom
A masik problema meg a kiszamithatosag: a Firefoxban (illetve akkor meg Mozillanak hivtak) volt egy olyan biztonsagi hiba, hogy a fenti modon inicializalta a randomgeneratort amikor titkositashoz generalt veletlenszamokat. Csakhogy - a fentiek miatt - a tamadonak eleg volt azt kitalalnia, hogy milyen idot mutatott a gep oraja, amikor legeneralta a titkositashoz szukseges szamokat, marpedig ha egy titkositott kapcsolatot 12:54-kor kezd a bongeszo, akkor jo esellyel a gep oraja is 12:54-et fog mutatni, vagy akornyeken valamit - es mivel a time() felbontasa csak masodperces, ezert nem is kellett olyan tul sok szamot vegigprobalni ahhoz, hogy fel lehessen torni a titkositast.
Szoval a veletlenszamgeneralas nehez problema, ahol komolyan erre van szukseg, ott valami plusz hardverrel generaljak, ami valami kellokeppen veletlenszeru fizikai folyamaton alapszik.
szerk: Latom, en irtam a legtobb ideig, de legalabb latszatja is van
-
kispx
addikt
válasz
Dave-11 #1830 üzenetére
srand(); inicializálja a randomszámgenerátort. Mindig a legelső szám generálása előtt kell ezt megtenni.
"srand(12);" Konstanssal nem illik inicializálni, mert minden egyes futás során ugyanazokat a számokat fogja előállítani. Helyette olyan módszert kell választani, ami futásról futásra változik, pl idő:
srand ( time(NULL) );rand(), egy véletlen számot fog visszaadni 0 és RAND_MAX között.
Ha kisebb értéktartományon szeretnénk véletlen számot generálni akkor, akkor egy X számmal kell a maradékát képezni, pl
rand() % X ez [0; X-1] tartományban képez egy véletlen számot
Szerk.: látom túl sokáig írtam a hszt
-
Karma
félisten
-
Karma
félisten
válasz
Dave-11 #1824 üzenetére
Hát bármi más, amit visszatérési típusnak megadsz. Amíg helloworldözöl valószínűleg int, double, vagy egyéb primitív típusok főleg - ezt írod a void helyére és kész.
Egyébként a void *-nak különleges jelentése van, ez az általános pointer amihez nem tartozik típus. Manuális memóriakezelésnél (C-ben malloc/free) kerül elő főleg, de ideális viszonyok között C++-ban nem kellene ezzel találkoznod (magasabb szintű absztrakcióknak hála).
-
kispx
addikt
válasz
Dave-11 #1820 üzenetére
Vannak olyan függvények amiknek nem kell visszaadnia értéket csupán csak valamit meg kell csinálniuk. (pl. clearerr) Ezeket eljárásoknak is nevezik.
C/C++-ban nincs külön kulcsszó a függvények és az eljárások megkülönböztetésére. C-ben ha eljárást szeretnénk csinálni akkor a visszatérési típusnak void-nak kell lennie. Ezzel jelezzük a fordítónak, hogy valójában semmit sem fog visszaadni a függvény. Egy ilyen függvényben értéket nem adhatunk vissza (pl.: return 1; ) mert ez fordítási hibához vezet. Viszont használhatjuk függvényből való visszatérésre a return; utasítást. (A függvényt lezáró kapcsos zárójel elé nem kötelező kitenni)
void f () { //.... }
az függvényt így hívjuk meg:
//...
f(); //változónak nem adhatunk vele értéketint g() { //.... return valami; }
a g függvényt így hívhatjuk meg:
int x = g(); //a g() visszatérési értékét az x változónak adjuk át
g(); // a g() visszatérési értékét minek sem adjuk át, így ez az érték elveszlikSzerk.:
"void Osztaly::Tag(){...}
Mondjuk ebben kiszámítok valamit, és a végére odaírom hogy: return vegeredmeny; Akkor hogy-hogy nem tér vissza semmi?"
Az fordítási hibához vezet.(#1821) dabadab
Régebben volt kezemben egy ősköri C++ fordító, ott lehetett main-nak void visszatérési értéke -
kispx
addikt
válasz
Dave-11 #1818 üzenetére
Függvény.
A main függvénynek lehet visszatérési értéke:
- ha int akkor program visszaad egy hibakódot az oprendszernek (hívó programnak). 0 a sikeres végrehajtás (ilyenkor egy fordítási hibaüzenetet fogsz kapni, ha elfelejtkezel a return 0; utasításról)
- void, visszatérési érték hiánya semmit sem ad vissza -
Davs
tag
válasz
Dave-11 #1816 üzenetére
Ha ertesz angolul, akkor ajanlanam a Stanford egyetem programozas-eloadas triojat. Nem csak c/c++ van benne, hanem altalanos programozas, memoriarol es assemblerrol is van kicsit szo, hogy tudd mi folyik a hatterben..Youtube-on keress ra a programming methodology, programming abstractions es programming paradigms-re(ebben a sorrendben), mindharom playlist kb 25-28 ~50perces eloadast tartalmaz (nagyon jok, nekem nagyon tetszenek). A methodology a legkonnyebb, Java nyelven "tanitanak", de nem is igazan a nyelvet, hanem amolyan bevetezest a programozasba (kezdoknek valo). Az abstractions mar c++ orientaltabb, mindenfele sorting-algorithm-eket, adatstrukturakat taglal (array, vector,map, hashmap, binary search tree, queue, stack stb - ezekkel nagyon jo tisztaban lenni, hogy tudd melyik hol eros es miben verzik el). Aztan a 3. a programming abstractions (most nezem, kb 10. eloadasnal tartok). C-vel kezdi, nagyon ramegy a pointerekre, hogy megtalnuld kezelni a memoriat, aztan most kezdi kicsit az assembly-t, hogy kb tudd mi tortenik a hatterben pl egy i++ parancsnal, vagy egy funkciohivasnal, aztan lesz szo alap concurrecy-rol is ("parhuzamositas", szoval multithreaded alapok)..a harmadik elegge low-level szintu (hardver-hez kozeli). Amugy lattam meg MIT-nek is eloadasaint iTunes-on, de meg nem lestem nagyon belejuk..Amugy en is hobbiprogramozonak vallom magam, viszont fosuli utan ebbol szeretnek megelni.
-
Davs
tag
válasz
Dave-11 #1813 üzenetére
Ha van egy tombod, pl int x[10], akkor az x valojaban egy pointer a tomb elso elemere..
x[0] az ugyanaz, mint a *(x+0), x[1] ugyanaz, mint az *(x+1), szoval a char *y lenyegeben karaktertombot jelez. Amugy pointereket akkor is szokjak meg hasznalni, ha egy funkcioban egy masik funkcio (pl akar a main() ) valtozoit akarod modositani, vagy ha dinamikusan hozol letre valtozokat (a konyv remelem jobban elmagyarazza majd, mint en)
-
kispx
addikt
válasz
Dave-11 #1813 üzenetére
Karaktersorozat vagy string (szerk.: lehet, hogy a könyv jobban fog fogalmazni, mint a linkem)
"int main( ...,char* ) {"
Nem ezt láttad, hanem: int main(int argc, char *argv[]) vagy int main(int argc, char **argv)
-
kispx
addikt
válasz
Dave-11 #1811 üzenetére
Pontosan annyiszor használom őket ahányszor kellenek (se többször, se kevesebbszer
)
Feleslegesen nem fogom tele pointerezni a forráskódot, azért mert csak azzal is meglehet vele oldani a feladatot. Végig kell gondolni a programot, hogy éri meg lekódolni és aszerint fejleszteni.Legtöbbször használom: (hirtelen ennyi jutott eszembe)
- ha külső függvénykönyvtárok megkövetelik
- char*
- ha olyan paramétert adok át aminek az értékét meg kell változtatni (bár ha már C++ a nyelv, akkor inkább referencia) -
Davs
tag
válasz
Dave-11 #1800 üzenetére
Szerintem eloszor is egy kis alap memory management lecket kellene venned, aztan egyszerubb lesz megerteni (stack vs heap)..angol tudas jol jon, van par nagyon jo video Youtubeon (Stanford vagy MIT youtubeos videoi, egesz eloadassorozatok vannak fent playlistre osztva)
Azt meg, hogy mire jo, hat..tombokre pl., meg majd utananezhetsz a valtozok scope-janak (lokalis vs globalis valtozok) meg meg biztos kismillio dologra
-
Sk8erPeter
nagyúr
válasz
Dave-11 #1800 üzenetére
Pedig most rákerestem, és WonderCSabo elkezdte már neked magyarázni.
A C programozás topicban is érdemes lenne rákeresned, itt nagyon sok hsz.-ben szerepel a szó, de ahogy elnézem, kingabo egy igen hosszú hsz.-ben elég korrekt módon elmagyarázta a dolog lényegét:
[link]
Itt is van még egy. -
proci985
MODERÁTOR
válasz
Dave-11 #1579 üzenetére
kicsit kompaktabban és konyhanyelven:
a program leképezi a valós dolgot, innentől könnyebben elképzelhető, könnyebben használható. az emberi agy szeret kötni dolgokat valahova, tehát végereményben logikusabb lesz a felépítés.
ez azt is jelenti, hogy általában a dologok közötti egymásrahatások is átláthatóbbak, jól csinálva egyszerűbben átlátható lesz az architektúra (tehát a classok kapcsolata, egymásraépülése és végeredményben a program felépítése), tisztábbak lesznek az interfacek. a funkciók és változók szintén köthetőek lesznek a valós dologhoz, tehát könnyebben átlátható lesz, hogy mi miért kellhet, kevesebbet kell kommenteket/dokumentációt olvasni, emiatt könnyebben módosíthatóvá és megérthetővé válik a program. az ember kvázi építőkockákat kap, amik segítségével a nagy egész könnyebben feldarabolhatóvá (főleg design patternsek alkalmazásával), így könnyebben megérthetővé válik.
másik fontos szempont, hogy a dolgok elkülönülnek egymástól, tehát egy dolog nem több egységben (component/class) lesz megvalósítva, ez megint átláthatóbb kódot jelent. ami egyben azt is jelenti, hogy egyszerűbben átláthatóvá válik a programlogika. ez ismét a módosíthatóság/karbantarthatóság/megérthetőség hármast erősíti, illetve a tesztelhetőséghez is kell. htlmt generáló php+jquery+css+sqlnél pl elég vicces tud lenni, amikor az ember elkezdi keresni, hogy a 20+ fileból ugyanmár mi is felelős egy adott gomb működéséért, ha nincsen szépen megtervezve a rendszer (és persze a html útközben változik).
tesztelhetőséghez amiatt fontos, mert egyszerűbb egységek szintjén kezdeni, és általában minél kevesebb egység kell egy adott feladat kipróbálásához (elsősorban itt dependencykre kell gondolni), annál könnyebben lesz tesztelhető egy adott megoldás. a jól definiált interface szintén nagyban segíti a blackbox testinget. azt nem szabad elfelejteni, hogy az OO design egyben ronthat is a tesztelhetőségen, bizonyos design patternek (pl singleton vagy insulation classek) ilyen szempontból problémásak.
ami még lényeges, hogy az OO design nem igazán enged meg globális változókat, amik megintcsak nagyban rontják a későbbi karbantarthatóságot.
namost, ami az egésznek a lényege: a programok életciklusa hosszú lehet, ezalatt cserélődhet a teljes fejlesztői gárda, cserélődhetnek a célok, amiket az ember elvár a terméktől. az OO design ezekre a kérdésekre ad (részleges) választ és segít abban, hogy az a kód, amit az ember megír, később is használható legyen, amikor módosítani kell.
-
WonderCSabo
félisten
válasz
Dave-11 #1577 üzenetére
Egyébként van valamilyen szisztéma, ami alapján a címekbe rakja az értékeket?
Sajnos ez egy nagyon bonyolult kérdés. Az alap koncepció az, new operátor hívásakor keres egy akkora összefüggő, üres területet a heap-en, amitbe belefér a változó, és ennek a területnek a címe kerül bele a pointeredbe. Hogy milyen szisztéma alapján keresi a területet, az egyrészt rendszerenként is változó, másrészt az adott szituációtól is függ. Ennél sokkal többet nem tudok erről a dologról, mert nem igazán volt szükséges utánajárnom eddig. De ha további kérdéseid vannak, talán a hozzáértőbbek tudnak válaszolni rá.
-
WonderCSabo
félisten
válasz
Dave-11 #1575 üzenetére
Nem, nem erre való. A memóriában valóban egy címen van a változó értéke, de ehhez szükségtelen pointereket használni. A címet egyébként is le lehet kérni az & operátorral.
A pointerek azért jók, mert segítségével láncolt adatszerkezeteket tudunk létrehozni. Pl. nem kell a tömbben tárolni a bazinagy képeket, elég csak a rá mutató pointert, és emiatt a tömb sokkal jobban kezelhető, vagy létrehozhatsz láncolt listát, fákat, stb.
A másik dolog, amit Te is írtál, hogy a pointerek segítségével tudunk dinamikusan lefoglalni memóriaterületet, és ezt bármikor fel is szabadíthatjuk. Ettől a program nem fog feltétlenül gyorsabban futni, viszont a memóriahasználata nyilvánvalóan csökkenni fog. Ellenkező esetben a sima automatikusan lefoglalt változók esetén a változó csak az adott blokk lefutása végén szabadul fel.Ezen kívül C++ - ban még a pointereken keresztül lehet megvalósítani a polimorfizmust és a dinamikus kötést, és még ezer dolog van, hogy miért is jók a pointerek.
-
Jhonny06
veterán
válasz
Dave-11 #1565 üzenetére
Ezzel hozol létre egy vektort:
vector<Entry> phone_book(1000)
vector -> vektor, egy adatszerkezet, ami nagyon hasonló a tömbökhöz
<Entry> -> a vektor típusa, lehet pl. int, string, egy struktúra, kvázi amit akarsz
phone_book -> a vektor neve, értelemszerűen bármi lehet
(1000) -> a vektor mérete, nem kötelező megadni, mert dinamikusan tudja bővíteni magátÚgy éred el az elemeit, mint a tömbnek:
phone_book[0], stb..
Ha nem adsz meg neki méretet, akkor a push_back()-el tudsz egy elemet beilleszteni:
int x = 3;
phone_book.push_back(x);Röviden ennyi. Ne hagyd ki, mert elég alap dolog szvsz. Ha megy az angol, ezt érdemes átolvasni (meg úgy alapvetően ajánlom figyelmedbe az oldalt).
[ Módosította: philoxenia ]
-
Jhonny06
veterán
válasz
Dave-11 #1562 üzenetére
Ha visszatérsz egy függvénnyel, az csak 1 érték (ráadásul ugye lokális, ennek nézz utána). Ellenben mutatókkal a függvényen belül annyit módosítasz, amennyit akarsz.
pl.:
int main(void) {
int a = 5;
int b = 3;
cout << osszead(a, b) << endl;
return 0;
}
int osszead(int x, int y) {
return x + y;
}Itt látszik a korlátja a dolognak. Egy összeadó függvénnyel tökéletesen működik, mert csak egy értékkel tér vissza, az eredménnyel. De ha mondjuk van egy olyan függvény, ami két számot külön-külön négyzetre emel, ott már elbukott az egész, mert érték szerinti paraméterátadásnál másolat készül a változóról és amit a függvényben változtatsz rajta, az visszatérés után/vagy nélkül elveszik. És csak 1 értéket tudsz visszaadni.
-
PazsitZ
addikt
válasz
Dave-11 #1005 üzenetére
Nagyon nem ajánlom. cygwin-el nekem sem ment.
MinGW-t raktam fel végül, de az pedig olyan hibákat dobált, amelyeket nem is tudtam feloldani. Az időm nagy részét azzal k*rtam el, hogy ezeket próbáltam javítani/debuggolni.
Kipróbálva winen dev-cpp-ben és linuxon gcc-vel a kódom simán fordult és amivel azelőtt napokig szenvedtem egy nap alatt összeraktam.
Szóval max fejlesztésre, de fordításra nem ajánlom a netbeans esetleges megoldását.note: Azért próbálkoztam netbeans-el, mert addig php,java fejlesztésre ezt használtam, megszoktam és szeretem.
Ú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!
- Gurulunk, WAZE?!
- Google Pixel topik
- Vicces képek
- One otthoni szolgáltatások (TV, internet, telefon)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Anime filmek és sorozatok
- Lalikiraly: SÜNI energiaital.
- A fociról könnyedén, egy baráti társaságban
- Nintendo Switch 2
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- További aktív témák...
- Telefon felvásárlás!! iPhone 15/iPhone 15 Plus/iPhone 15 Pro/iPhone 15 Pro Max
- Csere-Beszámítás! AMD Ryzen 7 9700X Processzor!
- Lejárt a gyártói garancia? Mi tovább támogatjuk az IT infrádat!
- ÁRGARANCIA! Épített KomPhone i5 12400F 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- TELJES KÖRŰ IT BESZERZÉS
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged