Új hozzászólás Aktív témák
-
Dave-11
tag
válasz
WonderCSabo #2196 üzenetére
Ez nem néz ki rosszul, csak az a bajom, hogy valami érthetetlen eredményt kapok :S
És nem csak most fordul elő, korábban próbáltam használni az strcpy() és strncpy() függvényeket, és azok is hasonló eredményt dobtak. Ez miért lehet? -
Dave-11
tag
válasz
Jester01 #2195 üzenetére
És azt a hossz ellenőrzést hogyan tudnám például megoldani?
Mondjuk legyen két példa:
1. A szöveg hosszabb mint 20 karakter, simán levágom a végét úgy, hogy egy for ciklussal átmásolom az első 20 karaktert egy másik stringbe vagy tömbbe.
2. A bemenet kisebb mint 20 karakter, ekkor pedig teljesen rendben van a dolog.
És akkor ezt a kettőt egy if-else szerkezetben. Ez így okés, vagy van rá jobb mód? -
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.
-
Dave-11
tag
Be akarok kérni a felhasználótól egy szöveget, ami maximum 20 karakter hosszú lehet, és akár szóköz is lehet benne. Próbálkoztam egy csomó függvénnyel, de egyik se működik rendesen.
A cin ugye csak a szóközig olvas, a cin.get() jó lenne, mert meg tudom határozni hogy maximum mennyi karaktert olvasson be, de ha ütök egy Entert akkor az utána lévő cin.get()-eket kihagyja, tehát úgy értem automatikusan "leenterezi" azokat is, a getline() pedig engedi a szóközöket, de nem tudom megszabni a maximális hosszt.
Tudtok valami jó megoldást, vagy lehet hogy csak rosszul csináltam valamit ezekkel a függvényekkel? -
Köszi a válaszokat, már a kérdésem után feltoltam az Eclipset, egyelőre a céges notimra, amit persze Win7. Kipróbálom, aztán meglátjuk.
Egyiket sem zártam ki, de korábban én is VS-ban dolgoztam, és nincs tapasztalatom a többi környezettel.
Amúgy kell majd adatbázis is mellé.Amargo: igen, kellene GUI-is majd később.
-
Sziasztok!
Régen dolgoztam C/C++-ban, ráadásul azóta javarészt Linuxra váltottam. Az lenne a kérdésem, melyik a legjobb IDE most? Eclipse-t nézegettem, de sok kritikát hallottam róla.
-
cattus
addikt
Esetleg ez jó lehet indulásnak: Tanuljuk meg a C++ programozási nyelvet 24 óra alatt
-
DGerg
csendes tag
Szevasztok!
Most fejeztem be az egyetemet és programozóként szeretnék elhelyezkedni. Eddig elsősorban a Java EE platformal foglakoztam, de most míg munkanélküli vagyok el szeretnék kezdeni C++-szal is foglakozni. Grafikus programozás érdekelne elsősorban. Mit ajánlanátok, hogy kezdjek neki? Tippeket, tanácsokat szívesen veszek. Kösz!
-
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.
-
Dave-11
tag
válasz
Jester01 #2179 üzenetére
Na hát jó de én még nem vagyok ennyire pro
A sort-ról eddig még nem hallottam, az isPrime() függvényt meg igazából a neten néztem, mert amit mi írtunk nem akart működni
A tiéd pedig egyszerű is. A static szó egyébként mit tesz? Mert ugyan láttam már, de még nem tanultam róla. -
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;
} -
Dave-11
tag
válasz
zulu_mester #2175 üzenetére
Összeültünk két haverommal, és megcsináltuk az 5. feladatot, ha még aktuális, akkor itt megtalálod a függvény forráskódját
http://pastebin.com/DLJEiTRS -
aprila44
csendes tag
Sziasztok.
Tudnátok esetleg ajánlani egy jó Magyar nyelvű könyvet vagy pdf-t C++ programozást kezdőknek?
Amelyiknek normálisan érthetően magyaráz egy kezdő számára is, hogy az alapokat és a gondolkodás mentett megértsem. -
zulu_mester
tag
válasz
WonderCSabo #2174 üzenetére
Lehet, hogy erre gondolt. De sajnos nem igazán kaptunk megfelelő fejtágítást ezekről a részekről :S
-
WonderCSabo
félisten
válasz
zulu_mester #2173 üzenetére
Nem tanultál még az std::vector konténerről? Feltételezem arra gondolt a feladat kiírója.
-
zulu_mester
tag
válasz
WonderCSabo #2171 üzenetére
A feladatod C++ függvények megvalósítása lesz. A függvényeket ugyanabban a CPP fájlban
implementáld, a main() függvényben mutass legalább egy-egy példát az összes függvény
működésére! A kódot az érthetőség kedvéért lásd el megjegyzésekkel!
1) Írj C++ függvényt , amely kiírja egy paraméterként adott egész szám abszolút értékét!
Például:
abszolut(10) → 10
abszolut(-5) → 5
2) Írj C++ függvényt, amely bekér két egész számot, és kiírja annak a számtani sorozatnak az
első 10 elemét, amelynek az első tagja az első bekért szám, a differenciája pedig a második!
Például:
szamtani(0,2) → 0 2 4 6 8 10 12 14 16 18
3) Írj C++ függvényt, amely bekér két egész számot, és kiírja annak a mértani sorozatnak az
első 10 elemét, amelynek az első tagja az első bekért szám, a differenciája pedig a második!
Például:
szamtani(1,2) → 1 2 4 8 16 32 64 128 256 512
4) Írj C++ függvényt, amely meghatározza (és kiírja), hogy az argumentumként megadott,
egész számokat tartalmazó vektorban van-e negatív elem, és ha van ilyen, akkor meghatározza
(és kiírja) az egyik ilyen elem indexét!
Például:
vektor = [ 2 , 3 , 4 ]
vannegativ( vektor ) → "Nincs negatív elem."
vektor = [ 2 , -3 , 4 , -5 ]
vannegativ( vektor ) → "Van negatív elem. Az indexe: 1"
5) Írj C++ függvényt, amely az argumentumként megadott, pozitív egész számokat tartalmazó
vektor elemeit rendezi olyan módon, hogy az új sorrendben elöl szerepeljenek a prímszámok
növekvő sorrendben, majd ezt a nem prím számok kövesség csökkenő sorrendben!
Például:
vektor = [ 2 , 3 , 1 , 6 , 7 , 4 , 5 , 9 , 8 ]
rendez( vektor ) → 2 3 5 7 9 8 6 4 1Az 1-3 feladat már kész van, csak a 4-5 feladatban nem tudom, hogy hogyan lehetne vektorként bekérni a számokat.
-
zulu_mester
tag
Lentebb van a teljes feladat.
-
WonderCSabo
félisten
válasz
zulu_mester #2170 üzenetére
Én nem értem a kérdést.
-
zulu_mester
tag
Sziasztok!
Egy olyan problémám van, hogy a mellékelt forráskódban, a 4-5-ös feladatban hogyan tudok argumentumként felvenni számokat?
-
cog777
őstag
Udv!
A memoria szivargas kereso g++ alatt remekul mukodik az std::map sajat allocatorral. Viszont Blackberry alatt a qcc nem birja leforditani.
Itt a cod:
Igy hasznalom:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <map>
#include "allocator.h"
#include "mynew.h"
#undef new
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
typedef struct node node_t;
struct node {
void * ptr;
bool array;
unsigned int line;
const char *file;
};
std::map<void *, node_t *, std::less<void *>,
fooStdAllocator<std::pair<void *, node_t *> > > booking;Hibauzenetek:
/Applications/bbndk/target_10_1_0_1020/qnx6/usr/include/cpp/xtree:174:51: error: no type named 'difference_type' in 'std::_Tree<std::_Tmap_traits<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> >, false> >::allocator_type {aka class fooStdAllocator<std::pair<void* const, node*> >}'
...
/Applications/bbndk/target_10_1_0_1020/qnx6/usr/include/cpp/xtree:189:8: error: no type named 'difference_type' in 'std::_Tmap_traits<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> >, false>::allocator_type {aka class fooStdAllocator<std::pair<void* const, node*> >}'
../src/mynew.cpp: In function 'void removeFromList(void*, bool)':
../src/mynew.cpp:42:64: error: conversion from 'std::_Tree<std::_Tmap_traits<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> >, false> >::iterator' to non-scalar type 'std::map<void*, node*>::iterator {aka std::_Tree<std::_Tmap_traits<void*, node*, std::less<void*>, std::allocator<std::pair<void* const, node*> >, false> >::iterator}' requested
../src/mynew.cpp:44:28: error: no match for 'operator!=' in 'itr != booking.std::map<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> > >::<anonymous>.std::_Tree<_Traits>::end [with _Traits = std::_Tmap_traits<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> >, false>]()'
...
../src/mynew.cpp:46:26: error: no matching function for call to 'std::map<void*, node*, std::less<void*>, fooStdAllocator<std::pair<void*, node*> > >::erase(std::map<void*, node*>::iterator&)'Ha van valakinek otlete, orulnek neki ha megosztana hogy merre induljak el.
-
modder
aktív tag
válasz
pvt.peter #2160 üzenetére
az eredeti példát kiegészítettem másoló konstruktorral:
http://pastebin.com/ryGfdzyzAmi egyébként ilyen egyszerű esetben nem szükséges, mert a nyelv csak byteról bytra lemásolja az eredeti objektumot inicializálásnál, tehát:
// copy konstruktor hívódik, amikor egy objektumot egy másik objektummal inicializálsz
Dog pajti2 = *makeDog();A nyelv átmásolja az egyenlőség jel jobb oldalán álló objektumot byteról byte-ra, vagy ha létezik, akkor a másoló konstruktor segítségével az egyenlőségjel bal oldalán lévő objektumba. Másoló konstruktor csak inicializálásnál hívódik meg, ami az új függvény deklarációja és egyből értékadás.
bővebben:
http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html
(van példa kód, hogy mikor hívódik meg) -
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. -
Dave-11
tag
Csináltam egy kis példát magamnak a mutatókkal kapcsolatban. A lényege az, hogy egy függvényen belül csinálok egy objektumot, aminek a dinamikus memórián belül foglaltam le helyet, és ezzel a mutatóval térek vissza. És a main()-en belül létrehozok egy-egy objektumot (két példán belül), és ezeknek az értékét beállítom a függvény visszatérési értékére.
Kérdés: az első megoldásnál nekem gyanús hogy memóriaszivárgás lép fel, a másiknál szerintem minden oké, de azért inkább megkérdezem tőletekItt a forráskód: http://pastebin.com/iCc2e225
-
pvt.peter
őstag
Sziasztok!
Eltudná nekem vki magyarázni (lehetőleg) példán keresztül a C++11 -es lambda függvényeket?
Miért érdemes használni illetve mikor?
Tlképpen bármiféle kézzelfogható példa jó lenne.Előre is köszi,
Peti -
D®. GeNy@
aktív tag
Szia!
Igen, tehát amikor indul az *.exe vagy *.bat file, akkor a keretprogramnak 2x TAB-ot és végül egy entert kellene küldenie.
Holnap de. áttanulmányozom a linkedet, aztán ha kérdés merülne fel (és miért ne merülne
) akkor újból a segítségedet/teket szeretném majd kérni!
Előre is köszönöm!
Üdv,
Norbi
-
cog777
őstag
válasz
WonderCSabo #2135 üzenetére
Találkoztam már vele igen, de pár platform sajnos nem támogatja.. így ezt találtam ki. Még fejlesztenem kell rajta, rendezett listát akarok csinálni és bináris kereséssel hamarabb megtalálni a keresett pointert. Fákat nem hiszem hogy akarok implementálni.
-
amargo
addikt
válasz
Jester01 #2148 üzenetére
Oks,
modder a leirasod alapjan mar inkabb felre ertettelekAz async es pelda pedig nem bonyolult. Ha elinditod a request-et es egybol a main threaden kiakarod szedni az adatokat, akkor kapsz egy ordas hibat rosszabb esetben pedig nem erted mirt nincs benne adat. Mikozben az adatod majd az responsba jon vissza.
-
Jester01
veterán
Szerintem azt akarta mondani, hogy explicit szinkronizáció nélkül nem szabad arra építeni, hogy a feldolgozás hogyan halad az egyes szálakon. Pl. attól hogy az egyik szálon gyorsabb műveletek vannak, még lehet, hogy adott körülmények között valamiért mégis megakad és a másik szál hamarabb végez.
-
modder
aktív tag
Azt akartam mondani, hogy alapvető, hogy két futó szál között nem feltételezed, hogy A szálban futó kódrészlet előbb fut le, mint a B szálban futó, akármilyen kontextusban, hanem párhuzamosan futnak.
Az async szervizes példádat pedig nem értem, talán ha megfogalmaznád, úgy egyszerűbb lenne.
-
amargo
addikt
"de én úgy tudom, hogy egy több szálú alkalmazásnál alapvető, hogy nem szabad feltételezni semmiféle sorrendiséget szálak között."
Már mint ne szabadna? Azt pl, hogyan oldod meg, hogy van egy asyc szervized és kipakolod a main thread-en? Két szál és még sem pakolhatod ki előbb a nemlétező adatokat
Szerintem ide valami mást akartál írni vagy én értem félre. -
modder
aktív tag
válasz
Zoli133 #2144 üzenetére
én is csináltam ilyet, hogy az egyik szál loggolt fájlba, a másik szál pedig gyártotta a log üzeneteket, de én az üzeneteket blocking queue-ba tettem, így ha a loggoló szál lassabban loggol (a queue megtelik), a másik szál is lassabban fut, mert a lista blokkol. Bármelyik szál belassulhat, akkor is helyes eredményt fog produkálni.
Ha te kitesztelted, hogy 2mp-enként kell takarítani ahhoz, hogy a többi szál ne terhelje túl a heap-et, de ráteszed egy másik gépre, környezetre, ahol gyorsabban termelődnek az objektumaid, akkor már egyből módosítani kell a takarító szálat is, ez így nem fasza. Legalábbis ez jött le eddig, de korrigálj, ha tévedekszerk.: bár én javaban csináltam de a blocking queue koncepciója C++-ban is létezik
-
Zoli133
addikt
Vegyünk egy esetet, hogy van egy szál ami logol értékeket Xmp-enként másik takarítja a memóriát Y időközönként.
Valgrindel a logolás az harmadára / negyedére is tud lassulni, míg a takarítás időköze megmarad.
De ha nincs is takarítás akkor egy probléma ami valgrinddel úgy tűnik, hogy 24h alatt sem megterhelő, az a valóságban 1-2 óra után akár lehet sok is.
-
modder
aktív tag
válasz
Zoli133 #2140 üzenetére
Mit értesz szinkronizáció alatt?
Mondjuk nem írtam még több szálú alkalmazást C++-ban, csak Javában, de én úgy tudom, hogy egy több szálú alkalmazásnál alapvető, hogy nem szabad feltételezni semmiféle sorrendiséget szálak között. Valami olyasmit tudok elképzelni, hogy éheztetés lép föl azért, mert valamelyik szál olyan lassan hajtódik végre, hogy az OS ütemezője lelépteti, mielőtt befejezné a feladatát. De ha alapvetően azt nézzük, hogy minden szál egyenlő eséllyel egyenletes eloszlásban kap futási időt, akkor nem értem, hol lehet a probléma. -
Zoli133
addikt
válasz
WonderCSabo #2137 üzenetére
Annyira lassít, hogy az elvileg szinkronban levő szálak kiesenek a szinkronból emiatt más történik mint normál esetben. Persze jobb híján ezt használom, de vannak dologkk amiket emiatt nem találok meg vele.
-
Zoli133
addikt
válasz
WonderCSabo #2135 üzenetére
Valgrind nálam befolyásolja a program futását, emiatt (nálam legalábbis) nem mindig az igazat mondja.
-
cog777
őstag
válasz
D®. GeNy@ #2132 üzenetére
Hello!
Ez azt jelenti hogy a programnak vissza kellene adni a keretprogramnak 2x tabot és 1 entert? (Nem teljesen világos a feladat)
TAB billentyű 2x bevitel egymás után, majd ezután egy ENTER parancs küldése.
TAB-ot /t
Entert a /n jelöli.Tehát [link] a példa szerint, neked ezt kellene írnod:
cout << "/t/t/n";
(Nézd meg a teljes példát)
-
D®. GeNy@
aktív tag
Sziasztok!
Azzal a kérdéssel fordulnék a szakikhoz, h. megoldható e az alábbi problémám:
Egy *.bat vagy *.exe kiterjesztésű file-ra lenne szükségem, amely egy keretprogramban behívható és futtatható.Idáig oK a dolog.
Viszont az alábbi műveleteket kellene tartalmaznia a *.exe vagy *.bat file-nak:
TAB billentyű 2x bevitel egymás után, majd ezután egy ENTER parancs küldése.
Mivel igen kezdő vagyok, így azt szeretném kérdezni, h. ezt hogyan tudnám kivitelezni?
Előre is nagyon köszönöm a segítséget!
-
cog777
őstag
Üdv!
Ha valakit érdekel, egyszerű de nagyszerű memória foglalás/felszabadítás nyilvántartót írtam (interneten található példákat felhasználva), segítségével a memory leak-ot lehet könnyen detektálni. Igaz, Qt-s GUI programokra hegyeztem ki, de át lehet alkalmazni nem Qt-s programokra is. Csak be kell illeszteni a kívánt forráskód include blokkjának a végére a #include "mynew.h"-t. Illetve a program végén meghívni a printList(); deleteList(); függvényeket.
https://github.com/zhanisch/DetectingMemLeak.git
Git-tel letölteni:
git clone https://github.com/zhanisch/DetectingMemLeak.git
Futtatva:
Starting /home/zhanisch/documents/QtProjects/build-DetectingMemLeak-Desktop_Qt_5_0_2_GCC_32bit-Debug/DetectingMemLeak...
Not relased object at: 162713376, file: ../DetectingMemLeak/mainwindow.cpp, line: 19
Not relased object at: 162711392, file: ../DetectingMemLeak/mainwindow.cpp, line: 23
/home/zhanisch/documents/QtProjects/build-DetectingMemLeak-Desktop_Qt_5_0_2_GCC_32bit-Debug/DetectingMemLeak exited with code 0 -
kingabo
őstag
válasz
WonderCSabo #2129 üzenetére
Sejtettem, hogy vannak még (sztem) fontosabb érvek is.
(#2128) Dave-11: bocs, annyi fórumot, topikot olvasok, hogy nem rémlik ki, hol, mit írt korábban.
-
WonderCSabo
félisten
válasz
kingabo #2127 üzenetére
A láncoláshoz még kell a dinamikus memóriakezelés, illetve a polimorfizmust is csak így tudjuk megvalósítani C++-ban. De ezek már bonyolultabb dolgok.
Az indoklás annyiban helyes az indoklás, hogy a fv-ben lokális pointeren keresztül létrehozott adat túléli a fv-t.
Mellesleg a stacken eleve nem szoktunk nagy objektumokat tárolni, mert betelik / gáz másolgatni. Ezt is lehet egy indoklás.
-
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... -
Jester01
veterán
Azért nem, mert "nem egyenlő" a feltételed tehát j-vel elmegy a tömb végéig az első olyan elemnél aminek nincs párja, és onnantól már nem is találja meg a többit. Csak addig szabad előremenni amíg a másik tömb elemei kisebbek az aktuális elemnél (ha növekvő sorrendben vannak). Ahol megálltál ott pedig meg kell nézni, egyezik-e az elem és ha igen akkor hozzáadni a metszethez.
-
Brumi˘
addikt
Üdv. mindenkinek!
Ismét egy kis segítségért fordulok hozzátok. Elméletileg a kövi kód egy metszet képzés, de valamiért nem akar működni, valaki le tudná írni miért?
int cdb=0; // seged tombok metszete
int j=1;
for (int i = 0; i < eladott_jegyek; i++)
{
while (j<eladott_jegyek && seged_tomb[i]!=seged_tomb2[j])
{
j++;
}
if (j<=eladott_jegyek)
{
cdb++;
seged_tomb3[cdb]=seged_tomb[i];
}
}Seged_tomb és seged_tomb2 is eladott_jegyek méretű és rendezett. Seged_tomb3-nak is eladott_jegyek méret hely van lefoglalva és ki van nullázva elméletileg. (seged_tomb3=0 -val) Nem tudom hogy ez így helyes-e.
Köszönöm előre is a segítséget.
-
Dave-11
tag
Na így már kezd világossá válni, miért is hasznosak a mutatók
-
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.
-
Dave-11
tag
válasz
WonderCSabo #2120 üzenetére
Tehát ha jól értem akkor mondjuk ha egy függvényben létrehozok egy mutatót (pl.: int * p = new int;), akkor a függvény visszatérése után a mutatót még meglesz nekünk, csak már nem fog arra a memóriaterületre mutatni, ahova a függvényen belül. És azon a memóriaterületen továbbra is ott lesz az az érték, amit beállítottunk (pl.: 5), illetve a mutatót továbbra is használhatjuk a függvény után, mutathatunk vele egy másik területre is?
Ez nekünk miért lesz jó? És ahol az 5-öst eltároltuk azt utána hogyan érhetjük el/szabadíthatjuk fel/adhatunk neki más értéket? -
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.
-
Dave-11
tag
A C++ könyvemben van egy ilyen mondat, ami magyarázatot ad arra, hogy miért éri meg nekünk dinamikusan lefoglalni a helyet változók számára:
"A memóriában deklarált objektumok megmaradnak a függvények visszatérése után is."
Ezt hogy kéne elképzelnem? -
Jim-Y
veterán
Sziasztok
Nálam jártasabbak a témában nem tudnának mondani valami hot topikot C++ 11-ből? Erősen iskolai beadandó gyanus a dolog, és hát az is. A forrásokat kikeresem, de, hogy mi az, amiről érdemes lenne írnom, mi az amiről fellelhető írás található a neten, azt nem tudom. Valami ötlet?
-
Dave-11
tag
válasz
WonderCSabo #2115 üzenetére
Hát igen, de még csak gyakorolgatok, szóval max 2 esetleg 3 fájllal fogok dolgozni, nagyobb projektet még csak későbbre tervezek. Na jó most erre mondhatod hogy akkor miért kell a code completion, de jobban tetszene ha ott lenne.
Amúgy nem is értem hogy miért nincs ott. Vagy egy vagy másfél hete még sima .cpp fájloknál is működött, meg is lepődtem mikor észrevettem hogy most meg már nem dobja. -
Dave-11
tag
válasz
WonderCSabo #2112 üzenetére
Érdekes, de ha létrehozok egy projektet és abban írom meg akkor működik, de ha csak egy sima .cpp fájlt csinálok abban pedig nem. De mi lehet a baj, nagyon idegesít
-
Dave-11
tag
válasz
WonderCSabo #2112 üzenetére
Igen be van, de így sem jó
Az ilyen alap dolgokat egyébként kihozza, mint például public vagy namespace, de amiket én definiálok azokat nem. -
Dave-11
tag
Sziasztok!
A CodeBlocks-omban nem működnek ezek a rövid gépelős cuccok, vagy nem is tudom hogy nevezzem őket. Mondok konkrét példát:
Pl.: ha van egy hosszabb nevű függvényem, és mikor meg akarom hívni és elkezdem begépelni a nevét akkor nem hozza fel azt a lenyíló listát amiből ki tudom választani gyorsan. Meg mikor egy osztály tagfüggvényeit deklarálnám akkor is fejből vagy visszaolvasásból kell megírnom a nevét.
Kicsit zavaró, mert nyilván így könnyebben elgépelhetem, másrészt meg ugye sokkal gyorsabbá teszi a munkát.
Szóval nem tudjátok hol tudnám ezt visszaállítani? -
chabeee
aktív tag
válasz
WonderCSabo #2107 üzenetére
huu, bele se gondoltam a helyzetbe hogy másnak ez hirtelen lehet hogy nagy lesz.
köszönöm a segítséget és bocsánat.@2108 feldobom majd
-
WonderCSabo
félisten
válasz
chabeee #2106 üzenetére
Ez most komoly? Beraksz egy ekkora projektet ez zipben ilyen általános kérdéssel? Legalább szűkítenéd le, hogy hol keressük.
De rendes vagyok és megnéztem... Eleve nem fordul, egyrészt azért, mert a MenuBuilder* VarazsloFactory::createMenuBuilder() metódusban polimorf módon egy VarazsloMenuBuilder-t akarsz visszaadni, csak ez nem gyereke a MenuBuilder-nek. A másik probléma az, hogy hiányzik a void jatekos::elotortenet() függvény implementációja.
-
chabeee
aktív tag
ennek megtudnátok mondani mi a baja? vagy miért nem jó?
12 -
modder
aktív tag
válasz
WonderCSabo #2104 üzenetére
azt magyarul úgy mondják, hogy kazalmemória
-
chabeee
aktív tag
- hülyekérdés
-
Ú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!
- Apple iPhone 14 128GB , Kártyafüggetlen
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Bomba ár! Lenovo ThinkPad T490s - i7-8GEN I 16GB I 256SSD I 14" WQHD HDR I Cam I W11 I Gari!
- Samsung Galaxy S24 Ultra / Kártyafüggetlen / 12/1024GB
- Bomba ár! Lenovo ThinkPad T450s - i5-5GEN I 12GB I 500GB SSD I 14" HD+ I Cam I W10 I Garancia!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest