játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5440
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2519

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2185
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1625
syam:    1491
Frissebbek | Korábbi postok
[1] > 2 < [3] [4] [5] [6] [7] [8] [9] [10] [14]
gaborlabor - Moderátor | 4449 hsz       Online status #100557   2008.12.13 16:08 GMT+1 óra  
te jó ég, ez a kód nagyon... csúnya
és alapjaiban rossz, szerintem...
ha egy nagyobb progit is ehhez hasonlóan építenél fel (értelmetlen feltételvizsgálatok, értelmetlen többszöri összeadás, "favágó" módszerek, stb), akkor nagyon hamar elakadnál vele.

nem értem, minek az a sok feltétel, ha csak annyit akarsz kiiratni, hogy páros-e az összeg vagy sem.
ja és nem szabványos. a main fgv int-tel tér vissza.

meg döntsd, el, hogy akkor C, vagy C++, mert ha az utóbbi, akkor kihasználhatod pl azt is, hogy bárhol lehet változót definiálni, ahol utasítás állhat. te inkább c-szerű kódot írtál, de nem baj az.

C kód, nem próbáltam ki:
Kód:
#include <stdio.h>

int main(void)
{
    int a, b, osszeg;

    printf("Kerem az elso szamot: \n");
    scanf("%d", &a);
    printf("Kerem a masodik szamot: \n");
    scanf("%d", &b);

    osszeg = a + b;

    printf("Az osszeg: %d\n", osszeg);

    // maradékos osztás a % operátorral...
    if( osszeg % 2 )
    {
        printf("Az osszeg paratlan!\n");
    }
    else
    {
        printf("Az osszeg paros!\n");
    }

    return 0;
}

   
coyote83 - Tag | 5 hsz       Online status #100555   2008.12.13 15:56 GMT+1 óra  
Sziasztok ma kezdtem el c++ ozni , idáig nem programoztam ugyhogy nézzétek el nekem ha hülyeséget kérdezek de irtam egy kódot gyakorlásként és az a lényege hogy összead 2 számot és kiirja hogy páros vagy páratlan e de itt a probléma csak akkor irja ki hogy páros vagy páratlan ha a 2 szám eredménye 50 felett van.... mi lehet a gond??? ja és itt a kód:
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b,c;
printf("Kerem az eslo szamot: \n";
scanf("%d",&a);
printf("Kerem az masodik szamot: \n";
scanf("%d",&b);

printf("Eredmeny: %d",a+b);


//---------------------------------------------------------------------------------------------------------------
if (a+b == 7) // ha a és b egyenlő 7 akkor irja ki hogy egyenlő 7

printf("\n7egyenlo7";
//---------------------------------------------------------------------------------------------------------------
else // külömben ha a és b nagyobb mint 10 akkor irja ki hogy nagyobb mint 10
if (a+b > 10)
printf("\nez a szam nagyobb mint 10\n";
//---------------------------------------------------------------------------------------------------------------
else // ha a és b nem egyenlő 7 akkor irja ki hogy nem egyenlő 7
if (a+b !=7)
printf("\nnem egyenlo 7";
//---------------------------------------------------------------------------------------------------------------

c = a+b;

switch(c)
{
case '2' :
case '4' :
case '6' :
case '8' :
case '10':

printf("\nParos";
break;

case '1' :
case '3' :
case '5' :
case '7' :
case '9' :

printf("\nParatlan";
break;
default:
if (a+b>20)
printf("\nNagyobb mint 20";
break;
}


getch();


}

   
Joga - Törzstag | 1791 hsz       Online status #99349   2008.11.19 05:53 GMT+1 óra  
Köszönöm, Emese

Hát, most konkrétan az OGL-lel felhagytam, SDL-ezgetek

Az argc, argv meg csak most fagy ki, nem tudom, mi lehet vele, hiszen a paramétereket( argv, argc ) nem használom
(ಠ ›ಠ) Stewie!

   
fpeti - Törzstag | 1280 hsz       Online status #99335   2008.11.18 16:29 GMT+1 óra  
joga #1:
vmi lib kellhet, beállíthatod vagy a project properities (vc6-ban nemtom hol is van már), vagy kódban (azelőtt mielőtt ezeket használnád)
esetleg ilyesmik kellhetnek: (me no OGL )
Kód:
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

utána vmi inklúdok, ha nem lenne:
Kód:
#include <gl\gl.h>
#include <gl\glu.h>


joga #2: ezt nem értem, régebben/másmivel írt forrás kifagy? miféle fv-k vannak benne? (esetleg egy kisebb példa..)

üdv: Emese. (akinek megköszönheted )
   
Joga - Törzstag | 1791 hsz       Online status #99320   2008.11.18 12:05 GMT+1 óra  
Most épp írogatok egy aranyos kis programot, de amikor hozzátársítok egy fájlt, akkor "Hibajelentés küldése" típusú hibaüzenettel leáll, akkoris, ha csak az értéküket használom fel, más esetben tökéletesen működött, szóval VisualC++ alatt mi produkál ilyesmit?
(ಠ ›ಠ) Stewie!

   
Joga - Törzstag | 1791 hsz       Online status #96913   2008.10.11 05:36 GMT+1 óra  
Hát, szvsz a kód nem okozhat ilyen hibaüzeneteket:
Kód:
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : error C2144: syntax error : 'void' should be preceded by ';'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : error C2146: syntax error : missing ';' before identifier 'glAccum'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : error C2182: 'APIENTRY' : illegal use of type 'void'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C2144: syntax error : 'void' should be preceded by ';'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C2086: 'int WINGDIAPI' : redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : see declaration of 'WINGDIAPI'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C2146: syntax error : missing ';' before identifier 'glAlphaFunc'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C2182: 'APIENTRY' : illegal use of type 'void'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C2086: 'int APIENTRY' : redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : see declaration of 'APIENTRY'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1153) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1154) : error C2146: syntax error : missing ';' before identifier 'GLboolean'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1154) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1154) : error C2086: 'int WINGDIAPI' : redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1152) : see declaration of 'WINGDIAPI'
c:\program files\microsoft sdks\windows\v6.0a\include\gl\gl.h(1154) : error C2146: syntax error : missing ';' before identifier 'glAreTexturesResident'
(ಠ ›ಠ) Stewie!

   
gaborlabor - Moderátor | 4449 hsz       Online status #96912   2008.10.11 05:03 GMT+1 óra  
Hmm
Akkor valami kódrészletet betehetnél ide.
Meg a hibaüzenetekből az első néhányat.

   
Joga - Törzstag | 1791 hsz       Online status #96911   2008.10.11 04:57 GMT+1 óra  
Kipróbáltam, úgy sem megy
(ಠ ›ಠ) Stewie!

   
gaborlabor - Moderátor | 4449 hsz       Online status #96910   2008.10.11 04:28 GMT+1 óra  
mert nincs előtte #include <windows.h> ?

   
Joga - Törzstag | 1791 hsz       Online status #96909   2008.10.11 03:48 GMT+1 óra  
Nem tudja valaki, hogy amikor az SDL-es, OGL-es programot le akarom fordítani VC-vel, akkor miért jelez a gl.h -ban 143 hibaüzenetet?
(ಠ ›ಠ) Stewie!

   
twilek - Tag | 144 hsz       Online status #89420   2008.06.15 23:35 GMT+1 óra  
pont az a baja. azt irjak, hogy a forditok altal hasznalt dll a kulonbozo, ami a rossz telepites kovetkezmenye. reinstall talan megoldja
-=[ TwILeK ]=-
http://www.twilek.hu
   
Asylum - Törzstag | 5440 hsz       Online status #89411   2008.06.15 15:34 GMT+1 óra  
valami konrkét kód okozza? mert nálam még sosem volt ilyen probléma (még sp1 nélkül se)
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
MaximumViolence - Törzstag | 1020 hsz       Online status #89409   2008.06.15 13:58 GMT+1 óra  
fent van...
Ez egy reszeg post...

   
Asylum - Törzstag | 5440 hsz       Online status #89399   2008.06.15 13:25 GMT+1 óra  
Idézet
MaximumViolence :
Kód:
fatal error C1900: Il mismatch between 'P1' version '20060201' and 'P2' version '20050411'

ezzel találkozott már vki?



http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1512436&SiteID=1

tedd fel az SP1 et a vs hez
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
MaximumViolence - Törzstag | 1020 hsz       Online status #89397   2008.06.15 13:12 GMT+1 óra  
Kód:
fatal error C1900: Il mismatch between 'P1' version '20060201' and 'P2' version '20050411'

ezzel találkozott már vki?
Ez egy reszeg post...

   
twilek - Tag | 144 hsz       Online status #89364   2008.06.15 03:58 GMT+1 óra  
Idézet
Asylum :
ez viszont már gányolás / hackelés szal akárhogy is de nem szép
ha valami csinál az ember akkor ne tegyen ilyen megkötéseket hogy csak pointerre vagy csak erre-arra.
általába én is írni szoktam egy Release() metódust csak teljesen másért (refcount miatt).



A Release es a Destrcut 2 kulon dolog. Release-t valobanm a ref countos cuccokhoz hasznalunk ..
izles dolga hogy ganyolas-e en jo par kodot lattam igy megoldva, es hat mint a mellekelt abra mztatja ertelme is lehet

mivel alapbol nem volt jo az alap program ezert lett ilyen a pelda is. jobban kell megtervezni a kodot es akkor nem kell bele ilyen.

A mas classokban levo masik class static valtozoja sem jo ... csak szepen atlathatoan
-=[ TwILeK ]=-
http://www.twilek.hu
   
fpeti - Törzstag | 1280 hsz       Online status #89360   2008.06.14 16:56 GMT+1 óra  
Idézet
twilek :
nem hozunk letre nem pointer static classokat casak ugy a levegoben ))))


Ebben lehet valami, így nem is szoktam,
de classmemberként mi a véleményetek ugyanerről (ugyanis pár ilyen van a kódomban, szégyellem, de bevallom, van )
Ilyesmik:

Kód:
class A {...};

class B
{
  static A aa;
}

A B::aa;

Akor is helytelennek számít? - asszem ezt megfogadom ezt a pointerer inices dolgot, mert úgy néz ki, ha a ctorokra van bízva, előbb-utóbb suction lesz belőle.
   
Asylum - Törzstag | 5440 hsz       Online status #89359   2008.06.14 15:53 GMT+1 óra  
ez viszont már gányolás / hackelés szal akárhogy is de nem szép
ha valami csinál az ember akkor ne tegyen ilyen megkötéseket hogy csak pointerre vagy csak erre-arra.
általába én is írni szoktam egy Release() metódust csak teljesen másért (refcount miatt).

Ezt a hozzászólást Asylum módosította (2008.06.14 15:58 GMT+1 óra, ---)
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
twilek - Tag | 144 hsz       Online status #89358   2008.06.14 15:33 GMT+1 óra  
Noh varj

nem hozunk letre nem pointer static classokat casak ugy a levegoben ))))
Kód:
#include <iostream>
using namespace std;

class A
{
protected:
   static A* gA;
   A( void ) {};

public:
virtual ~A( void ) {};

  static void Create( void ) {cout << "A Create\n"; A::gA = new A; };
  static A *GetInstance( void ) {cout << "A GetInstance\n"; return A::gA; };
  static void Destroy( void ) {cout << "A destroy\n"; delete A::gA;A::gA=NULL;};
};

A *A::gA = NULL;

class Staticclass
{
public:
  Staticclass()
  {
      cout << "Staticclass ctor GetInstance " << A::GetInstance() << endl;
   }

   ~Staticclass()
   {
       cout << "Staticclass dtor GetInstance " << A::GetInstance() << endl;
   }
};

int main( int argc, char **argv )
{
   A::Create();

   Staticclass SC;


  A::Destroy();
}


es beza ez is fagyni fog, ugyanis az SC osztalyunk nem pointer, ami a kilepeskor fog felszabadulni az A:estroy() utan ...
3 lehetoseged van!
1. pointer lesz az SC es letrehozod, letorlod
2. a destructoraba NEM teszel ilyesmit
3. es ez a bevalt: irsz egy Destruct() osztalyt, ami elvegzi azon feladatokat amik a belso valtozok torlesen kivul kell...

Kód:
class Staticclass
{
public:
  Staticclass()
  {
      cout << "Staticclass ctor GetInstance " << A::GetInstance() << endl;
   }

   void Destruct()
   {
     cout << "Staticclass dtor GetInstance " << A::GetInstance() << endl;
   }

   ~Staticclass()
   {
       // belso valtozok torlese ha van ...
   }
};

int main( int argc, char **argv )
{
   A::Create();

   Staticclass SC;
   SC.Destruct();

  A::Destroy();
}


Az a baj, ha aGetInstance ba barmit teszel a return on kivul, akkor azzal jelentossen lassulhat a kod. Ha pl renderben van minima 1 ilyened, akkor az renderenkent 1 +if ... elsore nem tudnik soknak .. de errol szol az optimalizacio

A programozas lenyeg a valtozok jo elhelyezese es megvalasztasa, mi, hol es mikor jojjon letre es hogyan ... ez nagyon fontos ...
torekedj arra, hogy 0DB globalis valtozod legyen, mert csak a baj van veluk. Ha megis az kell, akkor midnegyik pointer legyen, hogy te kezeld!
-=[ TwILeK ]=-
http://www.twilek.hu
   
fpeti - Törzstag | 1280 hsz       Online status #89356   2008.06.14 14:18 GMT+1 óra  
Asylum:
Idézet
Asylum :
vs 2008 al és igen debugban és releaseben is ugyanazt irta ki (és nem szállt el).
egyébként a singletonban sem uszod meg a staticot (épp azért singleton).

szerk.: hülyeséget azé nem irok

http://people.inf.elte.hu/asylum/singleton.html

csak szorakoztam egy kicsit, érdekes modon ilyen is elöfordul (nem csak singletonnal)



Erre gondolsz? (Én annó nem vettem észre a szerk-beli változást..)
Megnéztem a linken a progit, kb az, amit twilek is írt (majdnem), nagyon jól rámutat a progid arra, miért is lehet rossz a rendszer.
Igazából gőzőm nincs, hogyan lehet elkerülni, hogy mindíg meglegyen az instance, amíg kell, de ált. csak referenciát kellene az instanceoknak visszaadni, mert a pointert még akár törölni is lehet bárhol (mondjuk hülye, aki megteszi), referenciát nem, de ettől még nem lesz sokkal jobb.
Nem tudom elképzelni, hogy ennél az singletonosnál van jobb, ezzel a kódoddal kb egészítettem ki a twilek-éét.
Kód:
static MySingleton* Instance()
    {
        if( !instance ) instance = new MySingleton();
        return instance;
    }

- szvsz ennél nem lehet jobbat, az inicálás legalább biztos jó, már csak a destroyt kéne a legultolsó helyre tenni.. de azt meg csak valami refcount-tal lehetne, de itt elég fura lenne..


Idézet
Asylum :
szerintem ennek igy is kell müködnie


Szerintem is.
   
Asylum - Törzstag | 5440 hsz       Online status #89355   2008.06.14 13:16 GMT+1 óra  
szerintem ennek igy is kell müködnie
nálam a következöt irja (debug és releaseben is)

A GetInstance
Staticclass ctor GetInstance 00000000
A Create
A destroy

elöször lefut az stclass konstruktora hiszen azt látja meg elöször a fordito, abban pedig lefut a getinstance csakhogy még nincs meghivva a create tehát nullpointert ad vissza.

de amit én irtam megdolás az mért nem jo? ott nincs ilyen probléma
ez most vc 2005 amugy
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
fpeti - Törzstag | 1280 hsz       Online status #89354   2008.06.14 12:08 GMT+1 óra  
twilek:
Ha valahol létrehozol egy staic példányt, és annak a konstruktorában akarsz logolni (GetInstance), ezzel a módszerrel lazán kifagy, mert még a winmain első sora előtt ez lefut (hanyadjára írom le, bocs tényleg, de nem tudom ezt eléggé hangsúlyozni, hogy ez a probléma lényege ).
Az a bibi, hogy ha statikos cuccok vannak, csak a fordító tudja, hova is kéne a Create-t tenni - ezért tennem én mindenhova- megfelelő kiegészítéssel persze, hogy csak egyszer fusson le.
Kipróbáltam sima singletonnal, ott úgy tűnik jó a sorrend, de a 100%-os biztonságot csak akkor lehet garantálni, ha minden logolás előtt van egy ellenőrzés, hogy volt-e inic.

Ezzel a progival tudom demostrálni, mire gondolok, kirpóbálhatod milyen lesz a sorrend : (nagyon rossz)
Kód:
#include <iostream>
using namespace std;

class A
{
protected:
   static A* gA;
   A( void ) {};

public:
virtual ~A( void ) {};

   __forceinline static void Create( void ) {cout << "A Create\n"; A::gA = new A; };
   __forceinline static A *GetInstance( void ) {cout << "A GetInstance\n"; return A::gA; };
   __forceinline static void Destroy( void ) {cout << "A destroy\n"; delete A::gA;A::gA=NULL;};
};

A* A::gA=NULL; // static def

class Staticclass
{
public:
Staticclass()
{
cout << "Staticclass ctor GetInstance " << A::GetInstance() << endl;
}
~Staticclass()
{
cout << "Staticclass dtor GetInstance " << A::GetInstance() << endl;
}
};

static Staticclass stclass; // ebben a static példányban használjuk az A-t

int main( int argc, char **argv )
{
A::Create();
A::Destroy();
}


Üdv.
   
twilek - Tag | 144 hsz       Online status #89335   2008.06.14 07:54 GMT+1 óra  
Ez is egy hasznos oldal:

C++ reference
-=[ TwILeK ]=-
http://www.twilek.hu
   
Asylum - Törzstag | 5440 hsz       Online status #89334   2008.06.14 07:29 GMT+1 óra  
vagy csak tul öreg vagy
amugy a mai dátumot nem muszáj megkérdezni mert a gép is tudja

javaslom elolvasni a műveletek változókkal szekciot

http://people.inf.elte.hu/asylum/programming/C++/variable.html
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
dvorgaz - Törzstag | 575 hsz       Online status #89329   2008.06.14 04:50 GMT+1 óra  
ev-jelen == kor; sorral van a hiba, az == operátor az osszehasonlítás.
Próbáld úgy, hogy
kor = jelen - ev;
   
Bukta - Tag | 308 hsz       Online status #89328   2008.06.14 04:44 GMT+1 óra  
hello
------------
#include <iostream>

int main(int argc, char* argv[])
{
int ev, jelen, kor;
std:: cout<< "Mikor születtel?";
std:: cin>> ev;
std:: cout<<"Mennyit irumk most?";
std:: cin>>jelen;
ev-jelen == kor;
std:: cout<< kor<<std::endl;
system("pause";
return 0;
}
-----------
Ez az első C++ programom....az eredmény -858993460 és bármennyrt írok be mindig ez az eredmény. Ez a programm miért nem jó? Ha tudja vki pls help. THX
ArgumenException: A megadott DependencyObject nem ehhez a Freezable elemhez tartozó környezet. Paraméter neve: context
:oO Mi a???
   
twilek - Tag | 144 hsz       Online status #89318   2008.06.13 23:22 GMT+1 óra  
Hi

Nem, a create et 1 szer kell felhivni, akarcsak a destructot.
__forcinline -> azt mondja a forditonak, hogy MINDENKEPPEN legyen inline a kodom, amit a fordito csak extrem esetben biral felul. Vigyazni nem kell vele csak jo helyen kell hasznalni

Kód:
int main( int argc, char **argv )
{
    A::Create();
    // ha csak 1 szer hasznalod, az adott fugvenyedben:
    A::GetInstance()->Enfugvenyem();
   

    // Ha mar tobbszor hasznalod, az adott fuggvenyben:
    A *a = A::GetInstance();
    a->Enfugvenyem();

    A::Destruct();
}


ebol lehet rosszul latszik de nem kell minden fugveny elejen a create es a destruct ..
a WinMain / main elejen create es a vegen, vagy kilepeskor destruct()
-=[ TwILeK ]=-
http://www.twilek.hu
   
TPG - Tag | 3402 hsz       Online status #89313   2008.06.13 15:56 GMT+1 óra  
Megjegyzés: Azért csak finoman az inline-okkal meg a __forceinline-okkal, a fordító nem veszi őket kötelezőérvényűnek hanem inkább csak egyfajta ajánlásnak. Az inline a finomabb ajánlás, a __forceinline már inkább követelés de még ezt sem biztos hogy teljesíti a fordító. Ebből adódhat gubanc szóval ezzel számolni kell.
Reality is almost always wrong. - House

   
fpeti - Törzstag | 1280 hsz       Online status #89312   2008.06.13 15:45 GMT+1 óra  
twilek:
Aha, úgy néz ki, hogy ez az ultimate-jósorrendbetartó-megoldás, köszi szépen a kódot, ennek működnie kell. Amúgy a már említett singletonos megoldással szintén megy a dolog, nekem úgy tűnik, a tiéd még annál is biztosabb - a külön 'Create' függvény miatt. Amúgy most elsőnek egy logoló classt csináltam (jobbat, mint a régi fprintf-es, mondjuk azzal sose volt ilyen baj - csak a cout többet tud picit).
Ezt hogy is lehetne arra használni egy jó logrendszerhez:
legelsőnek meg kéne hívni egy Create-t, hogy lehessen bármit is csinálni, de ezt hiába teszem a WinMain első sorába, a static class példányok konstruktorai hamarabb lefutnak (ettől fagyott annó látszólag még a winmain első sora előtt pár napja).
Ezek szerint minden sor logolás előtt meg kellene hívni? (annyival kiegészítve a Create()-et, hogy ha már létrehozta, többet nem.) - ez egy kicsit sok extra gépelés (de biztonságosabb) szvsz:

A::Create();A::GetInstance()->logolok();
A::Create();A::GetInstance()->logolok(); // minden sorban így

Mondjuk ezen úgy is lehetne segíteni, hogy ha GetInstance()-ban még NULL az *gA, akkor létrehozza: (bocs, hogy belerondítok)

Kód:
class A
{
protected:
   static A *gA;
   A( void );
  __forceinline static void Create( void ) { A::gA = new A; }; // sose kell kívülről hívni így
public:
   virtual ~A( void );
 
   __forceinline static A *GetInstance( void )
   {
      if(!gA) Create( );
      return A::gA;
   };
   __forceinline static void Destroy( void ) { delete A::gA; };
};

Nekem úgy néz ki, így pláne jó ... vagy az van, hogy nem pontosan értem a __forceinline itt mit csinál a static-kal, megnéztem pár oldalt a static-inline témában, kb minden fordító azt csinál vele amit akar, még az sem biztos, hogy inline lesz (__forceinline jó eséllyel, de nem tuti).
(Még mielőtt: tudom, hogy az inline közvetlenül 'behelyettesíti' az fv kódját a hívás helyére, így az exe nagyobb, de gyorsabb lehet.). De itt van valami egyéb fontos mellékhatása ezen kívül?

üdv.
   
twilek - Tag | 144 hsz       Online status #89301   2008.06.13 14:12 GMT+1 óra  
elnezest buta megszokas )))
helyette inline
vagy define os szep megoldas
-=[ TwILeK ]=-
http://www.twilek.hu
   
Asylum - Törzstag | 5440 hsz       Online status #89300   2008.06.13 14:07 GMT+1 óra  
én azt a __forceinline-t nem eröltetném de mivel MSVC a topic cime ezért nem kötök bele.
majd a C++ topicban belekötök
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
twilek - Tag | 144 hsz       Online status #89296   2008.06.13 13:46 GMT+1 óra  
Idézet
fpeti :
Csak nem olyan egyszerű az élet VC-vel,



Nekem kicsit kusza volt amit irtal )) ( lehet csak valami postot meg hozza kene olvassak ))

Nos, mikor debugot forditasz, akkor a fordito nem optimalizal a kododon, igy a futason sem valtoztat, az ertekeket kinullazza, stb. Elmondhato, hogy debugban sokkal stabilabb kodot kapsz mint release ben
Az, hogy mashogy futnak le a sorok azon ne akadj fel, ugyanis mas az inicializalasi sorrend, a fordito optimalizal, ezert lehet az, hoyg az egyik static osztalyod elobb jon letre mint a masik.
Ennek elkerulese vegett, inkabb pointereket hasznalj:

Kód:
class A
{
protected:
   static A *gA;
   A( void );

public:
   virtual ~A( void );

   __forceinline static void Create( void ) { A::gA = new A; };
   __forceinline static A *GetInstance( void ) { return A::gA; };
   __forceinline static void Destroy( void ) { delete A::gA; };
};

// A masik jo tanacs, hogy a konstruktorban mindig nullazd ki az elemeket, meg a struct ban is:
class A
{
   protected:
     int X;
   public:
      __forceinline A( void )
      : X( 0 )
      {};
};


Ezzel a kodod stabilabb lesz (nincs inicializalatlan valtozo release ben) es nem is fogsz fuggni a fordito altal kitalalt inicializalasi sorrendtol...
-=[ TwILeK ]=-
http://www.twilek.hu
   
TPG - Tag | 3402 hsz       Online status #88913   2008.06.09 11:17 GMT+1 óra  
Idézet
fpeti :
Köszi, hát ez érdekes.. nekem se száll el (ez már tesztprogi, az eredeti nagyon nagy), csak releaseben "semmi data 20" másikon meg 0-a... a VS2008 ennyivel jobb lenne a VS2005-nél. eszem megáll.

Az kezdjen staticokkal akinek numof(mother)>1 (-bár singletonban is van egypár)

szerk: vc6-tal nincs különbség debug release között, minden alkalommal a Clog ment először, majd a Semmi (de hülye nevek ezek)

Lehet csak vs2005-ban vagyok ilyen szerencsés ezt tapasztalni... pfff (pedig SP1 is fenn van.)


Vagy 7 év alatt azért változtatnak a debuggeren bőven.

A singleton-os osztályaimban nálam pedig konkrétan kettő darab static kulcsszó fejenként fordul elő:
Kód:
static CValami& GetInstanceReference() {
static CValami Singleton; return Singleton;}

Ezen kívül a konstruktor private elérésű (a destruktor nem).

Szerk: ez a létező legegyszerűbb megvalósítás, semmi extrát nem tud, ha minden igaz nem is thread-safe de tökéletesen alkalmas ha nincsenek az embernek extra igényei.
Reality is almost always wrong. - House

   
TPG - Tag | 3402 hsz       Online status #88912   2008.06.09 11:13 GMT+1 óra  
Idézet
Asylum :
vs 2008 al és igen debugban és releaseben is ugyanazt irta ki (és nem szállt el).
egyébként a singletonban sem uszod meg a staticot (épp azért singleton).


Pontosan, csak kissé kontrolláltabb a singleton, inkább te irányítod a dolgokat mint a nyelvi sajátosságok.
Reality is almost always wrong. - House

   
fpeti - Törzstag | 1280 hsz       Online status #88911   2008.06.09 10:49 GMT+1 óra  
Köszi, hát ez érdekes.. nekem se száll el (ez már tesztprogi, az eredeti nagyon nagy), csak releaseben "semmi data 20" másikon meg 0-a... a VS2008 ennyivel jobb lenne a VS2005-nél. eszem megáll.

Az kezdjen staticokkal akinek numof(mother)>1 (-bár singletonban is van egypár)

szerk: vc6-tal nincs különbség debug release között, minden alkalommal a Clog ment először, majd a Semmi (de hülye nevek ezek)

Lehet csak vs2005-ban vagyok ilyen szerencsés ezt tapasztalni... pfff (pedig SP1 is fenn van.)

Ezt a hozzászólást fpeti módosította (2008.06.09 10:56 GMT+1 óra, ---)
   
Asylum - Törzstag | 5440 hsz       Online status #88910   2008.06.09 10:43 GMT+1 óra  
vs 2008 al és igen debugban és releaseben is ugyanazt irta ki (és nem szállt el).
egyébként a singletonban sem uszod meg a staticot (épp azért singleton).

szerk.: hülyeséget azé nem irok

http://people.inf.elte.hu/asylum/singleton.html

csak szorakoztam egy kicsit, érdekes modon ilyen is elöfordul (nem csak singletonnal)

Ezt a hozzászólást Asylum módosította (2008.06.09 11:12 GMT+1 óra, ---)
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
fpeti - Törzstag | 1280 hsz       Online status #88909   2008.06.09 10:40 GMT+1 óra  
Idézet
Asylum :
nálam hibáatlanul fut


Ez mit jelent? debugban és releaseben is ugyanúgy, a semmi ctor MINDÍG hamarabb fut, mint a log ctor-ja? na ez érdekes.. vc-val próbáltad v mással? (nálam ezt VC8 csinálja)

- amúgy most nézem a TGP által javallt (meyer féle)singletonos módszert, úgy néz ki az lesz a nyertes.. remélem
   
Asylum - Törzstag | 5440 hsz       Online status #88908   2008.06.09 10:38 GMT+1 óra  
Idézet
TheProGamer :
Idézet
Asylum :
ejh...mert tudni kéne miaz
lényegében olyan mint egy globális változo szal semmi különlegessége nincs


Globális szinten nincs is de lokálison annál több.



ugy lrtettem hogy ugy viselkedik mint egy globális változo szal pl. a .data szegmensben foglalodik le és nem a stacken.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Asylum - Törzstag | 5440 hsz       Online status #88906   2008.06.09 10:18 GMT+1 óra  
statikus objektumokat nem (csak) az osztályban kell deklarálni, hanem külön is:

Kód:
class A
{
public:
A() { b.bb = 0; };
static B b;
};

B A::b;

int main()
{
static A a;
return 0;
}


ha kihagyom egyébként nekem hibát is ad
szerk.: ja bocs akkor megném a másikat
nálam hibáatlanul fut

Ezt a hozzászólást Asylum módosította (2008.06.09 10:33 GMT+1 óra, ---)
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
fpeti - Törzstag | 1280 hsz       Online status #88904   2008.06.09 10:10 GMT+1 óra  
Csak nem olyan egyszerű az élet VC-vel, (mással nem próbáltam), kipróbáltam mindenfélét, és elég durva dolgkok jönnek ki static-kal, beírom ide (lassan cikket kéne erről írni, csak a megoldások is lennének meg ):

(progit lásd alább, 3 file van az életszerűség kedvéért)
Debug és release közötti (egyik érdekes) különbség:
release-ben hamarabb lefut a Semmi() ctor-ja mint a Clog-é ('x' Clog ctor-ában már 20),
viszont debuggal fordítva az x még nulla a Clog ctor-ban, breakpointokkal meg is lehet nézni, hogy a Semmi ctor később fut le.
Eddig ez se valami jó, de most jön az igazi viccesség:

ha kiveszem a kommentet a Semmi ctor-jában a cout elől, akkor a debugban nem változik semmi, viszont a releaseben is fordítva fog futni,már pont úgy, mint debugban... szvsz egy 'cout'-tól nem kéne megfordulnia a ctor-ok sorrendjének release-ben.
- szvsz ez vagy vicc, vagy bug, vagy szerintetek mi?

Na itt a full szórsz:
log.h
Kód:
#pragma once
#include <iostream>
using namespace std;

class Semmi
{
public:
Semmi()
{
//cout << "semmi ctor\n"; // uncomment, then release sux the same as debug too ;)
x=20; // second breakpoint in debug
}
int x;
};

class Clog
{
public:
Clog()
{
cout << "Clog ctor: "<<RefCount<<endl; // first breakpoint in debug
cout << "semmi data " << semmi.x << endl;
RefCount++;
}
~Clog()
{
cout << "Clog dtor: "<<RefCount<<endl;
RefCount--;
}

private:
static Semmi semmi;
static int RefCount;
};

log.cpp
Kód:
#include "log.h"
int Clog::RefCount=0;
Semmi Clog::semmi;

main.cpp
Kód:
#include "log.h"

class Foo
{
static Clog l;
};

Clog Foo::l; // ettől fut a Clog::ctor! (és fagy is.)

int main(void)
{
cout << "vege\n";
system("pause");
return 1;
}


Üdv (ejh )
   
fpeti - Törzstag | 1280 hsz       Online status #88860   2008.06.08 14:51 GMT+1 óra  
Idézet
TheProGamer :
Globális szinten nincs is de lokálison annál több.



Pontosan ez volt a baj, de megoldódott, köcce mindent, de leírom nagyjából:
Kód:
class B
{
public:
B(){};
};
class A
{
A(){};  // ha itt használom b-t baj lesz
public:
static B b;
}

static A a;

Ilyenkor először A ctor MAJD B ctor fut le, nem fordítva, mint szokott
(ejh)
   
TPG - Tag | 3402 hsz       Online status #88856   2008.06.08 14:12 GMT+1 óra  
Idézet
Asylum :
ejh...mert tudni kéne miaz
lényegében olyan mint egy globális változo szal semmi különlegessége nincs


Globális szinten nincs is de lokálison annál több.
Reality is almost always wrong. - House

   
Asylum - Törzstag | 5440 hsz       Online status #88855   2008.06.08 14:10 GMT+1 óra  
ejh...mert tudni kéne miaz
lényegében olyan mint egy globális változo szal semmi különlegessége nincs
a staticus függvény megint más most nemtom konkrétan miröl van szo de ha irsz kodot akkor megprobálom megmondani mi a baj
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
TPG - Tag | 3402 hsz       Online status #88854   2008.06.08 14:02 GMT+1 óra  
Idézet
fpeti :
Na csak rájöttem, a static cuccokkal volt a baj, nem olyan sorrendben futnak le, mint rendesen, és a log példány ctora hamarabb lefutott, ha static a példány, mint a benne lévő, szintén static ofstream példány, így hamarabb hivatkozott rá. Ez az az 'ordas hiba', de beírom a végét, hogy a kis mesém teljes legyen
-óvatosan a static-okkal, kezdek leszokni róluk.
Üdv.


Én nem is használok static cuccokat, helyette van singleton, kicsit kiszámíthatóbb.
Reality is almost always wrong. - House

   
fpeti - Törzstag | 1280 hsz       Online status #88852   2008.06.08 13:59 GMT+1 óra  
Na csak rájöttem, a static cuccokkal volt a baj, nem olyan sorrendben futnak le, mint rendesen, és a log példány ctora hamarabb lefutott, ha static a példány, mint a benne lévő, szintén static ofstream példány, így hamarabb hivatkozott rá. Ez az az 'ordas hiba', de beírom a végét, hogy a kis mesém teljes legyen
-óvatosan a static-okkal, kezdek leszokni róluk.
Üdv.
   
TPG - Tag | 3402 hsz       Online status #88830   2008.06.08 13:03 GMT+1 óra  
Idézet
fpeti :
Csak csodálkoztam, hogy üres a winmain, és mégis fagy... kiderült, hogy a hiába nem hozok létre egy class példányt se, a statikus cuccokban lefut a ctor (megint tanultam vmit), abban meg lefagy egy ofstream.open(), máig nemtom miért (most álltam át a progiban a fprintf()-es világról a cout-osra ), na nekiesek ma is. (sigh)


A statikus cuccok mikor jönnének létre ha nem a progi indításakor? Az üres main is program, az üres WinMain meg főleg mivel előtte meg utána még van kód amit nem mi teszünk oda. A std könyvtárak pedig elég stabilak, ha sikerül is felborítani egyet általában ahhoz valami ordas hibát kell elkövetni amit nem nehéz javítani. ofstream-et nekem anno nem is sikerült kinyírnom (vector-t annál többet viszont ), azóta meg leszoktam róla.
Reality is almost always wrong. - House

   
fpeti - Törzstag | 1280 hsz       Online status #88826   2008.06.08 12:48 GMT+1 óra  
Idézet
TheProGamer :
C++ progi mindig main-el kezdődik. Win-es proginál is így van ez csak ezt mi közvetlenül nem látjuk mert a mi WinMain-ünk is valahol az eredeti main-ből hívódik meg.


Csak csodálkoztam, hogy üres a winmain, és mégis fagy... kiderült, hogy a hiába nem hozok létre egy class példányt se, a statikus cuccokban lefut a ctor (megint tanultam vmit), abban meg lefagy egy ofstream.open(), máig nemtom miért (most álltam át a progiban a fprintf()-es világról a cout-osra ), na nekiesek ma is. (sigh)
   
TPG - Tag | 3402 hsz       Online status #88798   2008.06.08 06:34 GMT+1 óra  
Idézet
fpeti :
szerk: "mea klumpa", mert mindent megnyomva találtam egy 'call stack' cuccot (még sose néztem mi az ), ebben vannak sorrendben az fv-k... kiderült, hogy az üres winmain is valamér lefuttat egy rakat konstruktort (szvsz ez elég fura?) és az újféle logolómban kiadkad a cout.rdbuf() függvény. Mindíg tanul az ember.


C++ progi mindig main-el kezdődik. Win-es proginál is így van ez csak ezt mi közvetlenül nem látjuk mert a mi WinMain-ünk is valahol az eredeti main-ből hívódik meg.
Reality is almost always wrong. - House

   
Asylum - Törzstag | 5440 hsz       Online status #88789   2008.06.08 00:59 GMT+1 óra  
ezért van a call stack és a disassembly, ha megnézed az utasitások elött ott vannak a cimeik, a veremben szintén ott vannak az utoljára hivott függvények visszatérési cimei, az alapján ki lehet silabizálni.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
fpeti - Törzstag | 1280 hsz       Online status #88785   2008.06.07 18:17 GMT+1 óra  
Nekem az is elég lenne, ha pl tunná a drága, hogy milyen függvény hívta azt a függvényt, ami fagy. Vmi (függvény) stack-ket el tudnék azért képzelni debug szinten. Sokszor olyan C-s fv-ben fagy meg, ami NULL pointert kapott, de jó lenne tudni, én azt mégis hol adtam neki (főleg, ha mindez a legelső sor előtt megtörténik ) - mondjuk ebben az esetben tök szívás így is.

szerk: "mea klumpa", mert mindent megnyomva találtam egy 'call stack' cuccot (még sose néztem mi az ), ebben vannak sorrendben az fv-k... kiderült, hogy az üres winmain is valamér lefuttat egy rakat konstruktort (szvsz ez elég fura?) és az újféle logolómban kiadkad a cout.rdbuf() függvény. Mindíg tanul az ember.

Ezt a hozzászólást fpeti módosította (2008.06.07 18:35 GMT+1 óra, ---)
   
Frissebbek | Korábbi postok
[1] > 2 < [3] [4] [5] [6] [7] [8] [9] [10] [14]