- Luck Dragon: Asszociációs játék. :)
- VoidXs: Tényleg minden játék optimalizálatlan?
- eBay-es kütyük kis pénzért
- sziku69: Fűzzük össze a szavakat :)
- ricshard444: Fényképező ? Telefon helyett
- Parci: Milyen mosógépet vegyek?
- Mr Dini: Mindent a StreamSharkról!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- bambano: Bambanő háza tája
- Magga: PLEX: multimédia az egész lakásban
Új hozzászólás Aktív témák
-
Silεncε
őstag
válasz
Tomi_78 #4299 üzenetére
Neked egy Bitmap típusú objektum kell, annak lesz egy olyan metódusa hogy MakeTransparent, amit a doksiban látható módon tudsz paraméterezni.
Névtérből alapvetően tényleg nincs System definiálva, de magadnak olyan nevűt hozol létre, amilyet szeretnél, itt a könyvtár írói definiálták (illetve a System itt se névtér, hanem Class, de ilyen szempontból hasonlóan működnek, de egyébként különböző a két dolog!)
-
Tomi_78
aktív tag
Sziasztok!
Code:locks-ban írogatok egy kis programot, amiben egy labda pattog. Ez meg is volna, de nem tudom ezt a bitmap képet áttetszővé tenni, ahol nem szükséges a háttér kirajzolása.
Van erre valami függvény vagy ez csak maszk használatával oldható meg?
Azért kérdezem, mert van, ahol az olvasható, hogy létezik erre a MakeTransparent függvény is, csak nem tudom használni. Itt:
https://apireference.aspose.com/barcode/cpp/class/system.drawing.bitmap
ez olvasható:
"System::Drawing::Bitmap::MakeTransparent(Color transparent_color =Color::get_LightGray()
)"
De C++-ban ha jól tudom, nincs olyan, hogy "System" névtér. Vagy ez mégis csak C#-ra vonatkozik? -
dangerzone
addikt
Így már érthető! Köszönöm szépen!
-
Silεncε
őstag
válasz
dangerzone #4295 üzenetére
Ahogy cattus is mondja, ott van egy csomó kód amit nem látsz (az inputok beolvasasa, az outputok kiértékelése stb.., ezekhez pedig van main)
-
cattus
addikt
válasz
dangerzone #4295 üzenetére
Azért, mert a CodeWars az általad megírt kódot fogja, és belerakja egy saját futtatókörnyezetbe (ahol már van main függvény).
-
Silεncε
őstag
válasz
dangerzone #4293 üzenetére
Minden C++ kód kötelező eleme egy main függvény, ez a program belépési pontja (jó, meg lehet hackelni, hogy ne main legyen, de azt most hagyjuk. Ez így nem fog fordulni, mert nincs main függvényed. Valami hasonlót csinálj:
int main() {
countSheep(bármilyen szám);
return 0;
} -
dangerzone
addikt
Sziasztok!
A következő kódot szeretném futtatni a codeblocks-ban:
#include <string>
std::string countSheep(int number)
{
std::string res;
std::string s = " sheep...";
for (int i = 1; i <= number; i++) {
res += std::to_string(i) + s;
}
return res;
}De a következő hibaüzenetet kaptam: to_string’ is not a member of ‘std
Egy kis utánaolvasás után frissítettem a gcc compiler-t a gépemen, most a 9.2.0-ás verzió van, viszont továbbra is hibaüzenetet kapok. Most a "undefined reference to 'WinMain@16' üzenet jön fel , a program pedig nem fut le.
Van esetleg valamit ötletetek, hogy mit lehetne tenni?!
-
Rula
tag
Sziasztok!
[EZT] a kódot próbálom használni. Viszont az pont nincs benne, hogy hogyan is lehetne a stackból kiszedni az adatokat. Próbálkoztam ugyebár azzal, hogy cout << s.top();, de hibát kapok.
(no operator "<<" matches these operands operand types are: std::ostream << node)Valószínüleg rosszul kerestem rá, de nem igazán tudom, hogy hogy is lehetne adatot kinyerni akkor, hogyha a stack<X> s, X helyén int helyett egy class név található ( gondolom az a legfőbb gond).
-
Rula
tag
Sziasztok!
Kezdő kérdésem lenne. (Remélem legalább azt eltaláltam, hogy ez C++, nem sima C)
Szeretnék egy olyan (hátul tesztelő) ciklust létrehozni, ami akkor lép ki, hogy ha az user beírja, hogy "end". Viszont nem igazán sikerül.#include <iostream>
int main()
{
setlocale(LC_ALL, "");
char kar[80];
do {
printf("írjon be valamit:\n");
scanf("%s", kar);
} while (kar != "end");
}
Előre is köszi a segítséget! (Nem igazán sikerült normálisan formázni, bocsi )
-
ToMmY_hun
senior tag
Sziasztok!
Úgy tudom vannak itt néhányan, akik a budapesti Morgan Stanley-nél dolgoznak. Valakivel felvehetném privátban a kapcsolatot? Szeretnék feltenni néhány kérdést a céggel kapcsolatban.
Előre is köszönöm, ha valaki segít. :)
-
Tomi_78
aktív tag
Köszi nektek!
Még egy kérdésem volna: egy képecskét szeretnék kirajzolni, áttetsző háttérrel, tehát hogy az a szín ne látszódjon. Ezt a következőképpen csinálnám:BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(hdc, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, hdcMem, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, pixelblend);
De erre azt írja ki a Code:locks, hogy:
error: 'AlphaBlend' was not declared in this scope
Ez miért van? Külön deklarálnom kéne még az AlphaBlend függvényt? -
dabadab
titán
válasz
Tomi_78 #4278 üzenetére
A C++ tulajdonképpen két nyelv egyben: egyrészt ott van benne a C, amit mindenestül átvett, másrészt meg ott van benne a C++, ami az elején egy elég szerény OO-s kiegészítés volt, de már már tulajdonképpen az is szinte teljes nyelvvé nőtte ki magát, ennek eredményeképpen C++-ban egy csomó dolgot meg lehet csinálni C-ben meg C++-ban is
(és persze ha lehet, akkor inkább az utóbbit jó használni.)
Ez egy ilyen: a konstansok kezelésére a #define a C-s megoldás, a const int meg a C++-os.
(#4279) Silεncε: a const int is compile time, különben nem menne vele a switch / case
-
Silεncε
őstag
válasz
Tomi_78 #4278 üzenetére
Ilyen esetben mindkettőt (konstans változó/define) szokás használni, mindkettőnek az lesz a végeredménye, hogy a korábban megadott szám fog bekerülni a paraméterlistába. A különbség az, hogy hogyan: a const int egy változó, ami konstans (futásidő), a #define ezzel ellentétben a preprocessornak szóló makró, így ő fordítási időben fog működni: a preprocessor megtalálja jelen esetben az idozito1 szoveget a forrásban, akkor oda simán beilleszti a korábban a #define-ban megadott stringet (ő simán stingcopyt végez a forrásban).
Az hogy melyiket érdemes használni, konvenciófüggő, én C++-ban inkább a const-ot szoktam.
-
Tomi_78
aktív tag
válasz
dabadab #4277 üzenetére
Köszönöm a választ; működött a módszered.
Amúgy én is találtam egy másik megoldást (internetről puskázva), mégpedig hogy ezzel a sorral egészítettem ki a programomat az elején:#define idozito1 1001
Bár nem értem, hogy ez miért jó? Egyenértékű lenne a tiéddel ( const unsigned int idozito1=0x12345; )? -
dabadab
titán
válasz
Tomi_78 #4276 üzenetére
"UINT_PTR idozito1;"
Az a helyzet, hogy a SetTimer() signature-je teljesen el van cseszve, ennek nem UINT_PTR-nek, hanem simán uintnek kellene lennie. A SetTimer() második paraméternek egy azonosítószámot vár, adj neki azt.
A case meg azért nem működik, mert fordításkor tudnia kell a fordítónak, hogy annak a case-nek mi lesz a konkrét értéke - az meg változókkal nem megy.
Szóval kb ez kell neked (fejből, nem próbáltam ki):
const unsigned int TIMER_ID=0x12345;
idozito = SetTimer(hwnd, TIMER_ID, 100, NULL);
case WM_TIMER:
switch (wParam)
{
case TIMER_ID:
//csinál valamit
break;
}
break -
Tomi_78
aktív tag
Sziasztok!
Code:locks C++-ban az időzítővel (Timer) van egy problémám:
Megadom a változóit:UINT idozito;
UINT_PTR idozito1;
majd az ablak WM_CREATE-jében létrehozom az időzítőt:idozito = SetTimer(hwnd,idozito1,100,(TIMERPROC)NULL);
és itt futna le az időzítő:case WM_TIMER:
switch (wParam)
{
case idozito1:
//csinál valamit
break;
}
break;
Viszont ezt a hibaüzenetet kapom az idozito1-gyel kapcsolatban:
error: 'idozito1' cannot appear in a constant-expression|
És nem tudom, hogy ezzel az idozito1-gyel most mit kezdjek, ugyanis innen:
[link] sem tudtam kihámozni semmi érdemlegeset, hogy az időzítő azonosítót, ami ez az idozito1 lenne, hol és milyen típusként kell megadni.
Valaki tud nekem segíteni? -
Tomi_78
aktív tag
Némi haladás:
függvény fejléce: void alakcsinalas()
függvény hívása: alakcsinalas();
függvény deklarációja az Unit1.h-ban: nincs.
Eredmény: program elindul, alakok végigmasíroznak a képernyőn, de másodjára már nem fut le az őket létrehozó függvény, ami az alakmozgatas() függvényen belül van.
Izgi! -
Tomi_78
aktív tag
válasz
dabadab #4270 üzenetére
Na szóval: a fejléc most már így néz ki, mivel nekem nem kell semmilyen paraméter:
void __fastcall alakcsinalas()
Ezek után ha nincs () a függvényhívás után, tehát sima alakcsinalas; akkor a hiba:
[C++ Error] Unit1.cpp(95): E2235 Member function must be called or its address taken
ha meg van () utána, tehát alakcsinalas();, akkor a hiba:
[Linker Error] Unresolved external '__fastcall TForm1::alakcsinalas()' referenced from F:\PROGSETUP\BCB6\BCBPROGIJAIM\ALAKMEGY\UNIT1.OBJ -
Tomi_78
aktív tag
válasz
mgoogyi #4267 üzenetére
Nem, a Unt1.h-ban ez a fejléc:
void __fastcall alakcsinalas(TObject *Sender);
De itt az egész kódom, talán még nem olyan nagy annyira, hogy ne tegyem itt közzé:#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
class egyalak
{
public:
egyalak(int px, int py, Graphics::TBitmap* kep)
{ x=px; y=py; kepe=kep;}
int x;
int y;
Graphics::TBitmap* kepe;
unsigned char alkepvaltoido; //0-255
unsigned char aktalkep;
unsigned char alkepdb;
unsigned char sebessege;
};
const int maxalakdb = 5;
egyalak *alakok[maxalakdb];
int alakdb = maxalakdb;
TTimer *alakmozgato;
Graphics::TBitmap* kepei[4];
int pontok = 0;
unsigned char as = 32;
unsigned char th = 1;
void __fastcall TForm1::alakcsinalas(TObject *Sender)
{
int i;
for (i=0; i<alakdb; i++)
{
alakok[i]=new egyalak(4,i*kepei[0]->Height*2,kepei[0]);
alakok[i]->alkepvaltoido=5;
alakok[i]->aktalkep=0;
alakok[i]->alkepdb=3;
alakok[i]->sebessege=as;
}
}
void __fastcall TForm1::alakmozgatas(TObject *Sender)
{
int i;
for (i=0; i<alakdb; i++)
{
if (alakok[i]->alkepvaltoido>0)
{
alakok[i]->alkepvaltoido-=1;
}
else
{
if (alakok[i]->aktalkep+1<=alakok[i]->alkepdb)
{
alakok[i]->aktalkep+=1;
}
else
{
alakok[i]->aktalkep=0;
}
if (alakok[i]->x+(kepei[0]->Width)<Form1->Width)
{
alakok[i]->x+=alakok[i]->sebessege;
}
else
{
delete alakok[i];
if (i<alakdb)
{
int j;
for (j=i+1; j<alakdb; j++)
{
alakok[i]=alakok[j];
}
};
alakdb-=1;
if (alakdb<1)
{
if (as+4<255)
{
as+=4;
}
&alakcsinalas;
};
}
alakok[i]->alkepvaltoido=5;
}
alakok[i]->kepe=kepei[alakok[i]->aktalkep];
}
Invalidate();
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
kepei[0] = new Graphics::TBitmap;
kepei[0]->LoadFromFile("alak\\alak_all.bmp");
kepei[0]->Transparent=true;
kepei[2] = new Graphics::TBitmap;
kepei[2]->LoadFromFile("alak\\alak_all.bmp");
kepei[2]->Transparent=true;
kepei[1] = new Graphics::TBitmap;
kepei[1]->LoadFromFile("alak\\alak_lep1.bmp");
kepei[1]->Transparent=true;
kepei[3] = new Graphics::TBitmap;
kepei[3]->LoadFromFile("alak\\alak_lep2.bmp");
kepei[3]->Transparent=true;
&alakcsinalas;
alakmozgato=new TTimer(this); //Időzítő létrehozása
alakmozgato->Interval=50; //Időtartam beállítása
alakmozgato->Enabled=true;
alakmozgato->OnTimer=alakmozgatas; //Ez történjen, ha lefutott.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Kirajzol(TObject *Sender)
{
TPoint p = Form1->ScreenToClient(Mouse->CursorPos);
int i;
for (i=0; i<alakdb; i++)
{
if (GetAsyncKeyState(VK_LBUTTON) && p.x>=alakok[i]->x && p.x<=alakok[i]->x+kepei[0]->Width && p.y>=alakok[i]->y && p.y<=alakok[i]->y+kepei[0]->Height)
{
pontok+=1;
delete alakok[i];
if (i<alakdb)
{
int j;
for (j=i+1; j<alakdb; j++)
{
alakok[i]=alakok[j];
}
};
alakdb-=1;
}
Canvas->Draw(alakok[i]->x,alakok[i]->y,alakok[i]->kepe);
}
Form1->Caption = "Alakok: "+IntToStr(alakdb)+" - Pontjaid: "+IntToStr(pontok)+" - Támadóhullám: "+IntToStr(th);
} -
Tomi_78
aktív tag
No még egy furcsa dolog, amibe beleütköztem C++ programozás közben: a saját függvény hívása.
Miért nem lehet azt csinálni, mint a példafeladatokban és leírásokban a könyvekben és a világhálón, hogy:
void függvénynév(paraméterek)
vagy
int függvénynév(paraméterek)
vagy
bool függvénynév(paraméterek)
stb.
és utána egyszerűen a függvénynév használatával hívni azt?
Ugyanis előző programomból kiszerveztem az alakok létrehozását egy függvénybe, mivel több helyen is kellene ugyanez:void __fastcall TForm1::alakcsinalas(TObject *Sender)
{
int i;
for (i=0; i<alakdb; i++)
{
alakok[i]=new egyalak(4,i*kepei[0]->Height*2,kepei[0]);
alakok[i]->alkepvaltoido=5;
alakok[i]->aktalkep=0;
alakok[i]->alkepdb=3;
alakok[i]->sebessege=as;
}
}
aztán ha hívnám valahol ezt a függvényt a nevével:
alakcsinalas;
akkor ezt a hibát kapom:
E2235 Member function must be called or its address taken
Utánanéztem, hogy ez mit jelent, és azt láttam, hogy egy & jel hiányzik előle ([link]).
Nosza, elé is raktam, így meg valami EAccesViolation hibát kaptam. Na most akkor valami baj van a függvényemmel? Az Unit1.h-ban is deklarálva van pedig.
A másik, hogy miért van szükség egy saját függvénynél a TForm1:: és (TObject *Sender) kiegészítésekre? Ez a C++ Builder sajátossága, és egy olyan fejlesztőeszköznél, ami konzolos, mint pl. a Code:locks, ott erre nincs szükség, hanem simán a void név(paraméterek) alak a használatos?
-
Tomi_78
aktív tag
válasz
Silεncε #4262 üzenetére
Az nem baj, ha elem(ek) hozzáadása után több helyet foglal, hiszen ez természetes. Akkor tehát Dabadabbal a vector használatát javasoljátok? Úgy látom, ehhez vannak külön műveletek az elemek módosításához (törlés, hozzáadás, stb).
Sima tömbnél meg gondolom nekem kellene egy ciklussal a törölt elem utáni elemeket eggyel lejjebb rakosgatni, hozzáadni meg nem is tudnék(?). -
-
Tomi_78
aktív tag
És a C++-ban léteznek dinamikus tömbök, vagy a vektorok használatosak erre?
A kódomból a mostaniegyalak *alakok[5];
tömböt szeretném dinamikussá tenni, azaz hogy lehessen törölni belőle, illetve adott esetben hozzáadni újabb elemeket. De a mostani esetben ha az 5-öst egy változóra cserélném, akkor azt const típusúnak engedi a C++. -
Tomi_78
aktív tag
Jupí, most már működik; lépegetnek az alakok a képernyő ablakában!
Nagyon köszönöm nektek a segítséget, Mgoogyinak különösen!
Akkor, ha jól értelmezem, a mutató olyasmihoz hasonlítható, mint egy házszám, ami egy adott épületre mutat, mint helyre, a változó pedig az abban lakó személyre? Tehát ha arra vagyok kíváncsi, hogy hol van, akkor a mutatót használom, ha pedig magára az értékre, akkor a változónevet? -
mgoogyi
senior tag
válasz
Tomi_78 #4256 üzenetére
A pointernek és a LoadFromFile-nak nincs köze egymáshoz.
A pointer csak egy logikai memóriacím.A programod változói mind a memóriában vannak valahol.
Az, hogy valami hol van, azt elrakhatod egy pointerbe, mint pl. egy int * p;
Ebbe a p-be berakhatsz egy memóriacímet és utána azt tudod, hogy azon a memóriacímen - ami a p-ben van - van egy int értéked, azaz 4 byte-od egymás után.Az egyszerűség kedvéért 0-tól 1000-ig legyenek a lehetséges memóriacímek.
Amikor leírok egy olyat, hogy new int, akkor a programod a memóriából kér magának 4 byte-ot egymás után, ahol majd az integer-ed tartalma lesz és ebből a 4 byteből az elsőnek a címét visszaadja. (A másik 3 byte közvetlen utána van.)
Ezért tudod megtenni azt, hogy aint * p = new int;
esetén a baloldalt ott van a p, ami értéket kap. Mégpedig ennek az 1. byte-nak a memóriában lévő sorszámát.Itt egy példakód megdebuggolva:
A programom a (hexadecimális) 12461a8-as byte-tól kezdve kapott összesen 4 byte-ot.
És erre a 4 byte-ra a 3-nak megfelelő adat lett beírva.Ez így világos?
Olvasd el sokszor, ha nem érted, elég fontos, hogy ez meglegyen. -
dabadab
titán
válasz
Tomi_78 #4256 üzenetére
Amit meg kell érteni jelen esetben az, hogy egyetlen darab AlakokKepe objektumod van és beállítottad azt, hogy mind a négy helyen erre az egyetlen egyre mutató link legyen.
A kód, amit írtál, pontosan azt csinálja, mintha ebben a sorrendbe írtad volna:
.
AlakokKepe->LoadFromFile("alak\\alak_all.bmp");
AlakokKepe->LoadFromFile("alak\\alak_lep1.bmp");
AlakokKepe->LoadFromFile("alak\\alak_lep2.bmp");
kepei[0] = AlakokKepe;
kepei[2] = AlakokKepe;
kepei[1] = AlakokKepe;
kepei[3] = AlakokKepe;és ebből következően az, aminek igazából hatása van, csak annyi, hogy
.
AlakokKepe->LoadFromFile("alak\\alak_lep2.bmp");
kepei[0] = AlakokKepe;
kepei[2] = AlakokKepe;
kepei[1] = AlakokKepe;
kepei[3] = AlakokKepe; -
Tomi_78
aktív tag
-
mgoogyi
senior tag
válasz
Tomi_78 #4252 üzenetére
AlakokKepe->LoadFromFile("alak\\alak_all.bmp");
kepei[0] = AlakokKepe;
kepei[2] = AlakokKepe;
AlakokKepe->LoadFromFile("alak\\alak_lep1.bmp");
kepei[1] = AlakokKepe;
AlakokKepe->LoadFromFile("alak\\alak_lep2.bmp");
kepei[3] = AlakokKepe;Anélkül, hogy érteném a teljes kódod, ez a rész biztosan rossz.
Az AlakokKepe egyetlen objektum pointere (memóriacíme).A memóriacím egy szám, ami eldől akkor, amikor a new neked helyet foglal a memóriában:
Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap;
És innentől kezdve ez az érték nem változik.A kepei nevű ugyanilyen pointereket tároló tömbbe berakod ugyanazt a számértéket(pointert/memóriacímet) minden indexre.
Teljesen mindegy, hogy mit csinálsz közben a LoadFromFile függvénnyel.Az AlakokKepe változóra nincs szükséged. Első körben csináld azt, hogy minden alakok elemre ([0], [1], [2], stb.) a benne lévő kepe adattagot külön külön létrehozod
= new Graphics::TBitmap;
hívással és ezeken az alakok[ 0/1/2/.. ] . kepe objektumokon hívod meg a LoadFromFile-t.Azt is megeteheted, hogy nem pointert használsz:
Graphics::TBitmap* kepe;
->Graphics::TBitmap kepe;
és akkor nem kell new sem. -
Tomi_78
aktív tag
Sziasztok!
Napok óta rágódom egy C++-os programrészleten, nevezetesen hogy van egy alak nevű osztály, aminek vannak egy tömbben tárolt alképei, és ezeket az alképeket kellene váltogatnia szabályos időközönként. De sajnos az alképek váltogatása valamiért nem működik. Talán már az alképek beolvasását és eltárolását sem jól oldottam meg? Valaki tud segíteni?
Íme a kód:#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
class egyalak
{
public:
egyalak(int px, int py, Graphics::TBitmap* kep)
{ x=px; y=py; kepe=kep;}
int x;
int y;
Graphics::TBitmap* kepe;
char alkepvaltoido;
char aktalkep;
char alkepdb;
};
Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap;
egyalak *alakok[5];
TTimer *alakmozgato;
Graphics::TBitmap* kepei[4];
void __fastcall TForm1::alakmozgatas(TObject *Sender)
{
int i;
for (i=0; i<5; i++)
{
if (alakok[i]->alkepvaltoido>0)
{
alakok[i]->alkepvaltoido-=1;
}
else
{
if (alakok[i]->aktalkep+1<alakok[i]->alkepdb)
{
alakok[i]->aktalkep+=1;
}
else
{
alakok[i]->aktalkep=0;
}
if (alakok[i]->x+(AlakokKepe->Width)<Form1->Width)
{
alakok[i]->x+=8;
}
else
{
alakok[i]->x=-64;
alakok[i]->y=random(Form1->Height-64);
}
alakok[i]->alkepvaltoido=5;
}
alakok[i]->kepe=kepei[alakok[i]->aktalkep];
}
Invalidate();
}
//Ezeket kéne váltogatnia, ahogy lépked az alak:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AlakokKepe->LoadFromFile("alak\\alak_all.bmp");
kepei[0] = AlakokKepe;
kepei[2] = AlakokKepe;
AlakokKepe->LoadFromFile("alak\\alak_lep1.bmp");
kepei[1] = AlakokKepe;
AlakokKepe->LoadFromFile("alak\\alak_lep2.bmp");
kepei[3] = AlakokKepe;
int i;
for (i=0; i<5; i++)
{
alakok[i]=new egyalak(4,i*AlakokKepe->Height+10,kepei[0]);
alakok[i]->alkepvaltoido=5;
alakok[i]->aktalkep=0;
alakok[i]->alkepdb=3;
}
alakmozgato=new TTimer(this);
alakmozgato->Interval=50;
alakmozgato->Enabled=true;
alakmozgato->OnTimer=alakmozgatas;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Kirajzol(TObject *Sender)
{
int i;
for (i=0; i<5; i++)
{
Canvas->Draw(alakok[i]->x,alakok[i]->y,alakok[i]->kepe);
}
} -
Tomi_78
aktív tag
válasz
mgoogyi #4250 üzenetére
Most ilyen a fejléce a függvényemnek:
void __fastcall alakmozgatas(TObject *Sender)
a hívása pedig:alakmozgato->OnTimer=(TNotifyEvent) &alakmozgatas;
És mégis ezt a hibaüzenetet kapom:
[C++ Error] Unit1.cpp(90): E2031 Cannot cast from 'void (_fastcall *)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'De majd próbálok utánanézni, hogy az OnTimer milyen típust fogadhat.
-
mgoogyi
senior tag
válasz
Tomi_78 #4247 üzenetére
Nem vagyok otthon a Borland TTimer témában, de egy gyors google keresésnél ezt találtam:
https://programmersheaven.com/discussion/357230/creating-component-with-timer-in-it
Ez alapján:
Timer = new TTimer(this);
Timer->Interval = 5;
Timer->OnTimer = (TNotifyEvent) &alakmozgatas;
Timer->Enabled = true;
void __fastcall alakmozgatas(TComponent* Sender)
{
..... Do some stuff .....
} -
Tomi_78
aktív tag
Sziasztok!
Tudna segíteni valaki, hogy Borland C++ Builder 6-ban saját függvényt hogyan lehet hívni egy futásidőben létrehozott időzítő OnTimer eseményével?
Így néz ki a függvényem fejléce (__fastcall-t nem írtam bele, mert - gondolom - nem muszáj, de vele is hibás):void alakmozgatas()
{
...
}
így pedig az időzítő:alakmozgato=new TTimer(this); //Időzítő létrehozása
alakmozgato->Interval=5; //Időtartam beállítása
alakmozgato->OnTimer=alakmozgatas(); //Ez történjen, ha lefutott.és az utolsó sorra azt írja ki, hogy: Not an allowed type.
Ha meg elhagyom a zárójeleit:
[C++ Error] Unit1.cpp(90): E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'Teljesen tanácstalan kezdő vagyok.
-
mgoogyi
senior tag
válasz
Ron Swanson #4243 üzenetére
A mohó mintáshoz hasonló lesz a megoldás, sokat segített volna, ha az elején ismerem már azt a példafeladatot.
Annak a pdf-je többet mond, mint a kódja.
Szerintem távozási idő szerint kell rendezni a vendégeket, venni az elsőt és mindenki, akivel ő találkozik, azzal nem kell foglalkozni, mert az nem lehet jobb nála. Ez a halmaz kiesik és ugyanezt ismételni, amíg el nem fogynak a vendégek.Egyébként neked az alapokat kéne rendberakni, nem algoritmusokon görcsölni.
Majd nekifutok még1x, ha lesz kedvem. -
Zalanius
tag
válasz
Ron Swanson #4243 üzenetére
Az én olvasatomban bármi, amiben van sort() az időpontokra, az legfeljebb olyasmire lesz jó, hogy mikor voltak a legkevesebben, de sok fontos info elveszik. A feladat meg nagyon nem erről szól, egy egyszerű "házigazda" példával könnyen megmutatható:
1 3
1 3
1 3
1 8
5 8
5 8Nyilván nem az a megoldás, hogy ki volt bent mondjuk 4-nél (a "házigazda" egyedül, de ő meg pont nem a megfejtés). Az meg már a múltkor is első olvasatra feltűnt a már törölt hozzászólásokban, hogy az 1 millió vendég és a 100 ezer időegység azért van a feltételek között, hogy kizárjon minden O(n^2)+ vagy teljes mátrixos próbálkozást.
-
Volt egy beadandó feladatom, aminek tegnap este járt le a határideje. Nem sikerült elérnem a 100 pontból 50-et, és buktam a tárgyat. 40 pont volt a legjobb eredmény. Nagyon kiváncsi vagyok a helyes (vagy legalább helyesebb) megoldásra, szeretném megérteni ezt az algoritmust, illetve a jövőben ha újra felveszem ezt a tárgyat akkor sokat segítene.
Ez volt a feladat, mohó algoritmussal kellett megoldani:
3 féle megoldás született (mgoogyi és kobe24 fórumtársunk segített benne rengeteget):
27 / 100 pontos: pastebin
Ez a futási hiba, megszakítási kód 11 a sulis oldal leírása szerint: illegális memória hivatkozás.33 / 100 pontos: pastebin
40 / 100 pontos: pastebin
A suliban csak 1 órát foglalkoztunk ezzel, egy nagyon egyszerű feladatot oldottunk meg, ami így nézett ki: pastebin mohó gyak
Illetve egy minta kódot találtam még, ami ilyen: mohó mintafeladat
Az N max értéke 1 millió lehet, ezért pl a 2. és 3. kódnál amit belinkeltem túllépi az időlimitet, pedig valószínűleg helyes lenne az output.
Hogyan lehetne megoldani?
-
dabadab
titán
válasz
leviske #4229 üzenetére
Én egy külön objektumként hoznám létre, aminek mindhárom másik objektum megkapja a reference-ét, mivel amúgy semmi sem indokolja, hogy a három közül pont a bármelyik tulajdonolja (és akkor már lehet, hogy nem egy nyers vektor<akármiként>, hanem kapna egy wrappert classt maga köré, mert pl. a C++ std template containerek nem teljesen thread safe-ek)
-
leviske
veterán
Sziasztok!
Most felfogok tenni megint egy nagyon amatőr kérdést "good programming practice" témában.
Van egy programom, ami beolvas több száz, sokszor több ezer képet, hogy műveleteket végezhessen rajta. Főbb osztályokat tekintve van egy Feldolgozó, egy I/O és egy UI. Mindháromnak hozzá kell férnie ahhoz a vektor<mátrix> változóhoz, ami a képeket tartalmazza. Az I/O ugye betölti az adatokat, a UI megjeleníti az aktuális állapotot, a feldolgozó osztály meg elvégzi a műveleteket.
A kérdésem a következő:
Az a legjobb megoldás, ha a feldolgozó osztály tartalmazza ezt a vektort és a másik kettőnek a feldolgozó osztály egy objektívének pointerét adogatom oda VAGY az a szebb, ha létrehozok a három osztály számára egy base class-t ami static változó formájában tartalmazza ezt a vektort?Egyelőre az első verziót használom.
Előre is köszi a nem megalázó választ.
-
G.A.
aktív tag
Megvan az erdő!
A for() ciklusban a feltétel a hibás:
for(uint32 i = 0, txbptr = 3; i < sizeToTransfer; i++, txbptr += 4)
{
local_rx_buffer[i] = temp_rx_buffer[txbptr];
}Javítva:
for(uint32 i = 0, txbptr = 3; txbptr < sizeToTransfer; i++, txbptr += 4)
{
local_rx_buffer[i] = temp_rx_buffer[txbptr];
}Az i helyett a txbptr-t (tx buffer pointer) kellett tesztelni.
-
G.A.
aktív tag
Amint leraktam a fejem a párnára, jött is az eureka pillanat... legalábbis azt hittem. Csak egy hibát találtam.
Javítás:
int32 AVR_WRD_Bytes(uint8* local_rx_buffer, uint8* local_tx_buffer, uint32 sizeToTransfer, ...)
{
uint8 temp_rx_buffer[spi_buffer_size];
int32 status = MPSSE_SPI_WRD([B]temp_rx_buffer[/B], local_tx_buffer, sizeToTransfer,...);
if (status == OK)
{
for(uint32 i = 0, txbptr = 3; i < sizeToTransfer; i++, txbptr += 4)
{
local_rx_buffer[i] = [B]temp_rx_buffer[/B][txbptr];
}
}
return(status);
}A gond az előzővel az volt, hogy a local_tx_buffer mérete mindig 4-nek a többszöröse és az MPSSE_SPI_WRD() funkció így mindig 4*n byteot küld vissza. Ha viszont én az AVR_WRD_Bytes(uint8* local_rx_buffer,..) -be eleve csak 1 byteos változót adok meg, mint pl itt:
#define AVR_Get_Lock_Byte() AVR_WRD_Bytes([B]&AVR_Lock_Byte[/B], Read_Lock_Byte, 4)
akkor a local_rx_buffer (példéban: AVR_Lock_Byte) túlcsordul és más változókat is módosíthat,a miket nem kéne. Ezt javítja a temp_rx_buffer.
Sajnos a probléma még így is fenn áll.
-
G.A.
aktív tag
Üdv!
Visual Studio 2015 Update 3-ban egy parancssoros programot irok C/C++ -ban.
Egy FTDI chip(FT2232H) (gyári DLL / header fileokat használok) és egy AVR(ATMega1284P) közötti SPI-n alapuló kommunikációt használok.
Ezzel nincs is igazából gond, a program ezen része azt teszi amit szeretnék. Szerintem.Röviden:
Valamitől módosul némely globális változom, anélkül, hogy használnám.A probléma:
Vannak globális változóim(részlet):uint8 AVR_Signature_Bytes[3] = { 0x00, 0x00, 0x00 };
uint8 AVR_Fuse_Bytes[3] = { 0x00, 0x00, 0x00 };
uint8 AVR_Lock_Byte, AVR_Calibration_Byte, AVR_Prog_Enable_Byte, AVR_Poll_Ready_Byte;
amiket egy funkcióval módosítok/változtatom meg:int32 AVR_WRD_Bytes(uint8* local_rx_buffer, uint8* local_tx_buffer, uint32 sizeToTransfer, ...)
{
int32 status = MPSSE_SPI_WRD(local_rx_buffer, local_tx_buffer, sizeToTransfer,...);
if (status == OK)
{
for(uint32 i = 0, txbptr = 3; i < sizeToTransfer; i++, txbptr += 4)
{
local_rx_buffer[i] = local_rx_buffer[txbptr];
}
}
return(status);
}
Az egyes változó módosításához definícióba raktam a funkciót: (elnézést ha ostobán fogalmaztam meg)#define AVR_Get_Fuse_Bytes() AVR_WRD_Bytes(AVR_Fuse_Bytes, Fuse_Bytes_RD, 12, )
#define AVR_Get_Signature_Bytes() AVR_WRD_Bytes(AVR_Signature_Bytes, Signature_Bytes_RD, 12)
#define AVR_Get_Lock_Byte() AVR_WRD_Bytes(&AVR_Lock_Byte, Read_Lock_Byte, 4)
#define AVR_Get_Calibration_Byte() AVR_WRD_Bytes(&AVR_Calibration_Byte, Read_Calibration_Byte, 4)
Ha lefuttatom a AVR_Get_Fuse_Bytes() funkciót és megjelenítettem (printf) a kapott eredményeket, akkor a várt eredmények jönnek. Mivel ezt ugye globális változóba mentettem, későbbi felhasználás céljából, gondoltam baj nem lehet.Viszont, ha a AVR_Get_Fuse_Bytes() után lefuttatom bármely másik funkciót pl. AVR_Get_Signature_Bytes()-ot és csak utána jeleníteném meg a AVR_Get_Fuse_Bytes() által kapott eredményeket, akkor azok már nem lesznek jók.
Milyen hibakeresési módszert javasoltok? Merre induljak?
(Lehet már nem látom a fától az erdőt... gyakori)GA
-
DrojDtroll
veterán
válasz
EQMontoya #4224 üzenetére
Ugyan ezt, csak 4s körüli értékkel.
Úgy néz ki tényleg beleszámolja a fordítást is.
stavkoverflow:Measuring execution time of a function in C++
Ez alapján mindig ugyan azt mérem.
-
EQMontoya
veterán
válasz
DrojDtroll #4223 üzenetére
Es amikor a 4s-t mered, akkor mit ir ki?
-
EQMontoya
veterán
válasz
DrojDtroll #4220 üzenetére
Unixon merj, time paranccsal.
-
dabadab
titán
válasz
DrojDtroll #4220 üzenetére
Nem tudom, hogy mivel vagy hogyan méred, de így ránézésre a fordítás idejét is beleméred.
Az sem teljesen világos, hogy igazán mit akarsz mérni, de elég biztos vagyok abban, hogy nem ez a megfelelő módszer hozzá. -
DrojDtroll
veterán
Sziasztok!
adott a következő kód
#include <iostream>
#include "bitmap_image.hpp"
using namespace std;
int main()
{
int width = 2000;
int height = 2000;
bitmap_image image(width,height);
image.clear();
rgb_t color = make_colour(124, 143, 143);
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
image.set_pixel(i,j, color);
}
}
//image.save_image("test02.bmp");
//cout << "Hello world!" << endl;
return 0;
}Azt szeretném mérni vele, hogy mennyire performáns a c++, főleg a futási idő érdekelne. Code::Blocks-ot használtam a fejlesztéshez. F9-el futtatom. Első futtatásra 4mp, minden további futtatás 0.2 körül van. Ha változtatok egy nagyon keveset a kódon ugyan ez a helyzet. Mitől van ez?
-
b.kov
senior tag
válasz
dangerzone #4218 üzenetére
Szia,
Tudnám ajánlani ezt az oldalt: ExercismVannak fent egyszerűbb, illetve összetettebb feladatok is. Én csak a Swift-es dolgokat néztem, de nekem nagyon jól jött gyakorolni. Főleg, hogy a megoldásod után lehet nézni a community által megírtakat is, és tanulni belőlük.
-
dangerzone
addikt
Sziasztok!
Szeretném gyakorolni a C++ programozást. Ehhez keresnék egyszerűbb feladatokat eltérő témakörökből, amihez van megoldás. Tudjátok, hol lehetne ilyet találni?
-
Z_A_P
addikt
1
A screenshotban nem
for (Egitest* b : EgitestLista) {
van, hanem
Egitest b - csilag nelkul.2
typeid(Bolygo) == typeid(b)
Ilyet nem hasznalunk, helyette dyamic_cast<>, ami NULL-t ad vissza ha nem sikerult a cast. Termeszetesen pointert/referenciat hasznalunk.3
Az egesz kod buzlik, ha a listadban Egitest van, es azon kell ilyeneket futtatni, akkor inkabb az Egitest classban kellene egy virtualis GetKeringesiTavolsag().+1
Borzaszto stilus a magyar/angol keveres "GetKeringesiTavolsag"
Hasznalj 100%-ban CSAK angol neveket, minding mindenre.
Ezzel csak nyerhetsz, meghozza sokat. -
coco2
őstag
Sziasztok!
Fejlesztő eszközökről szeretnék érdeklődni.
Sztori. Részemről most állok át win7-ről win10-re, és az első sokkhatásoknál tartok. Példának okáért a win7 alatt még tuti dev-c++ 4.9.9.2 win10 alatt már nem akaródzik futni (a make valamiért elakad). Neten azt találtam, hogy álljak át az újabb verziókra. Az újabb csomagok, amik a dev-c++ utódjának címét követelik gyanúsan nagy "üres" exe-t fordítanak (128 kb a "semmire"), és ahol fórumja van a projecteknek, mindenütt vírusokra, meg gyanúsan beépült kódrészletekre panaszkodnak, amire a projectgazda részéről nulla a visszajelzés. Nem tudok azokban megbízni. Viszont valami akkor is kellene helyette, ami minimális környezetként el van látva a win crt libekkel + header fileokkal 64 bites környezethez, supportol ansi c / console app és legacy C dll fordítást, és mindezekhez nem kényszerít rám grafikus ui-t, tud fordítani parancssoros tool-okkal is (gui helyett a saját scriptjeimet szeretem használni fordításra).
Aki birkózott már meg ugyan ezzel a problémával, szíves tanácsát kérném.
-
mgoogyi
senior tag
A screenshotodban nem pointered van, hanem normál objektumod.
Gondolom a listáddal is ugyanaz a helyzet.Ezzel az a baj, ha csinász egy ilyet, hogy:
Bolygo b;
Egitest e;
e = b; // az EgitestHozzaad-nál gyakorlatilag ezt csinálodEzesetben az "e" egy ledarált Egitest méretű változó lesz, amit a "b" égitestből örökölt részei adnak.
Ez az egész castolás téma akkor nyerhet értelmet, ha pointert vagy ref-et castolsz.
Látom c# háttered van.
C++-ban a normál értékadás by value megy összetett típusokra is, amit pl. az EgitestHozzaad függvény bemenő paraméternél történik. (Kb. mint a struct c#-ban)
Ez azt jelenti, hogy mindig egy másolat változóba megy az adat, amibe vagy copy konstruktorral vagy = operatorral kerül be az adat.A a = b; // copy ctor
a = b; // = operatorHa ki akarod használni a polimorfizmust, akkor vagy referenciákkal vagy pointerekkel kell dolgoznod.
A * a / A & aMiért akarsz visszacastolni bolygóra? Nem azért tartod közös kollekcióban az objektumokat, hogy mind ugyanúgy kezelhesd a közös interfaceükön keresztül?
-
Silεncε
őstag
Az úgy szerintem nem lesz jó, hogy egy Bolygó típusú változónak egy Bolygó*-ot akarsz átadni. Ha emlékezetem nem csal, C++-ban működik, hogy (Bolygó*), de nem vagyok benne biztos.
Egyébként a VS az aláhúzás mellé magyarázatot is ad, azt is beírhatnád ide, valszeg hamarabb jönne válasz
-
amdni
aktív tag
Leírnám újra hátha nem vagyok egyértelmű:
van egy egitest típus
továbbá bolygó és csillag típus, ezeknek az őse az egitest.
Egy listában szeretnék őket tárolni.
list<egietst> lista;Szeretném kiolvasáskor megállapítani hogy pl. bolygó-e, és utána kasztolni az eredeti típusra, de nem tudom megoldani, alá van húzva a "b" betű.
bolygo temp;
for (Egitest* b : EgitestLista) {
if (typeid(Bolygo) == typeid(b)) {
temp = dynamic_cast<Bolygo*>(b); //itt a hiba! -
amdni
aktív tag
-
dabadab
titán
Erre van a typeid:
if ( typeid(*b) == typeid(bolygo) ) {
// ....
}C++-ban egyébként szerintem nem jó ötlet C-s pointereket alkalmazni: a legtöbb esetben egyáltalán nem kell pointer (főleg mióta van move semantics), a maradék nagy részében referenciákat lehet használni, ami meg ezek után is megmarad, ott meg a C++-os smart pointereket.
-
amdni
aktív tag
Üdv!
C#-ot tanultam eddig, de most kicsit szeretnék megismerkedni a c++-al.
Hogyan tudom egy listából kiolvasott elemet ellenőrízni hogy milyen típusú?
pl:csillag *a = new osztaly();
bolygo* b = new bolygo();List<egitest*> vilagur;
A csillag és a bolygő őse az égitest.
A listában mindkettőt szeretném tárolni, ezért egitest típusú.
De mikor kiolvasom, hogyan ellenőrzőm hogy csillag vagy bolygó?C#-ban ez az is operátorral valósul meg:
ha ( List[0] is csillag) akkor....Tudna valaki ebben segíteni?
Köszönöm. -
-
kobe24
tag
válasz
Ron Swanson #4202 üzenetére
for(int i = 0; i < varosDb; i++){
for(int j = 0; j < napDb; j++){
if (homerseklet[i][j] == maxHomerseklet[j]){
hanyszorVanHely[j] = i + 1;
hanyszorVan[i]++;
}
}
}Ebben a ciklusban van a hiba, hiszen itt a "hanyszorVanHely" tömmben minden egyes alkalommal felülírod a tömb elemeit az aktuális sorral. Gyakorlatilag erre a változóra nincs is szükség. Tehát ha ezt a ciklust kijavítod
for (int i = 0; i < varosDb; i++) {
for (int j = 0; j < napDb; j++) {
if (homerseklet[i][j] == maxHomerseklet[j]) {
hanyszorVan[i]++;
}
}
}erre, akkor megkapod, hogy az egyes városokban hányszor volt meg a napi maximum. Az utolsó ciklust kell már csak módosítani.
for (int i = 0; i < varosDb; i++) {
if (hanyszorVan[i] == hanyszorVanMax) {
cout << i+1 << " ";
}
}A "hanyszorVan" tömb elemei megegyeznek azzal, hogy az adott indexű városban hányszor fordult elő a napi maximum. Így még egy tömböt meg is spóroltunk
-
Tudna valaki S.O.S. segíteni?
Van egy feladatom amit nagyjából sikerült megcsinálnom, de van benne hiba.
Így néz ki a kódom:
#include <iostream>
using namespace std;
const int maxMatrix = 1000;
int varosDb;
int napDb;
int homerseklet[maxMatrix][maxMatrix];
int main()
{
std::ios::sync_with_stdio(false);
cin >> varosDb >> napDb;
for(int i = 0; i < varosDb; i++){
for(int j = 0; j < napDb; j++){
cin >> homerseklet[i][j];
}
}
int maxHomerseklet[maxMatrix]={};
for(int i = 0; i < varosDb; i++){
for(int j = 0; j < napDb; j++){
if (homerseklet[i][j] > maxHomerseklet[j]){
maxHomerseklet[j] = homerseklet[i][j];
}
}
}
int hanyszorVan[maxMatrix]={};
int hanyszorVanHely[maxMatrix] = {};
for(int i = 0; i < varosDb; i++){
for(int j = 0; j < napDb; j++){
if (homerseklet[i][j] == maxHomerseklet[j]){
hanyszorVanHely[j] = i + 1;
hanyszorVan[i]++;
}
}
}
int hanyszorVanMax = 0;
for (int i = 0; i < varosDb; i++){
if (hanyszorVan[i] > hanyszorVanMax){
hanyszorVanMax = hanyszorVan[i];
}
}
int darab = 0;
for (int i = 0; i < varosDb; i++){
if (hanyszorVanMax == hanyszorVan[i]){
darab++;
}
}
cout << darab << " ";
for (int i = 0; i < darab; i++){
cout << hanyszorVanHely[i] << " ";
}
return 0;
}Probléma:
A példa inputtal jól működik a program, de ha megváltoztatom az inputot pl erre:
3 5
10 15 12 10 10
12 16 16 16 20
12 16 16 16 20
(a 2. és 3. sorban ugyanazok a számok vannak)
akkor az outputra azt adja ki, hogy: 2 3 3
De azt kéne kiadnia, hogy 2 2 3 (2 darab, 2. és 3. sor)Vagy egy másik input:
5 5
5 5 5 5 5
2 2 2 2 2
5 5 5 5 5
4 4 4 4 4
5 5 5 5 5Ennél az output: 3 5 5 5, de a helyes az 3 1 3 5 lenne
Hogyan tudnám ezt javítani?
-
mezis
félisten
válasz
dobragab #4189 üzenetére
Én az "Ultimate++"-t kezdtem használni. Érdemes váltanom az ajánlottak valamelyikére ? (Csal ingyenes verziók jöhetnek szóba.)
Ú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!
- Autós topik
- Mibe tegyem a megtakarításaimat?
- Mobil flották
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Poco X6 Pro - ötös alá
- A OnePlus Nord 5 sem sokkal marad le akkuméretben
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Székesfehérvár és környéke adok-veszek-beszélgetek
- Eldurvul a Nova Lake-kel az Intel-féle hibrid dizájn
- EAFC 25
- További aktív témák...
- Crucial 240GB SSD eladó
- Kingmax 2x2GB DDR3 RAM eladó
- Bomba ár! Dell Inspiron 15 5578 2in1: i7-7GEN I 16GB I 256SSD I 15,6" FHD Touch I Cam I W11 I Gari!
- Csere-Beszámítás! RTX Számítógép játékra! I7 6700K / 32GB DDR4 / RTX 2060 / 500GB SSD
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! I5 14400F / RTX 5070 / 32GB DDR5 / 1TB SSD M.2
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest