Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - tmj

Strony: 1 ... 93 94 [95] 96
2821
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 08 Stycznia 2017, 18:57:08 »
To musi być Borland, bo w jego przypadku double x = 3/2 => 1, a 3.0/2 => 1.5. Więc wczoraj wieczorem przeglądałem cały mover, żeby wychwycić te wszystkie miejsca gdzie liczy na całkowitych.
A nie, 3/2 = 1 to akurat "normalne" -- konwersja z liczb calkowitych na zmiennoprzecinkowe ma miejsce, jesli przynajmniej jeden ze skladnikow operacji matematycznej jest typu float albo double. Jesli oba sa typu int, to kompilator tak je zostawi. Przypisanie wyniku do zmiennej nastepuje juz po fakcie, jako odrebna operacja, wiec nie wplywa na to jak przeprowadzana jest sama matematyka; o tym decyduja tylko typy skladnikow.

2822
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 07 Stycznia 2017, 17:50:15 »
Uwielbiam C++. Do tej pory nie mogę zrozumieć co przyświecało twórcom kompilatorów, że jeśli wynik jest typu double, a pierwsza liczba wymnażana po prawej jest typu int to policzy całość mnożenia w liczbach całkowitych i wynik zrzutuje na double.
A to akurat dziwne. Standardowo jest w druga strone (https://msdn.microsoft.com/en-us/library/aetzh118.aspx) tzn jesli jest np float = int * float to kompilator promuje int do float i wszystko dziala: 1 * 1.5 = 1.5  Chociaz i tak dla pewnosci warto stosowac static_cast itp, ale to chyba cos z Borlandem, a nie c++ jako takim.

2823
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 07 Stycznia 2017, 01:46:11 »
Nie wiem czemu tak to działa ale po zmianie na poprawną wersję hamulce działają jak potrzeba.
Bo taka jest typowa kolejnosc operacji w c++ ( http://en.cppreference.com/w/cpp/language/operator_precedence )

kombinacje bitowe i logiczne (#10-14) sa z reguly wykonywane po porownaniach (#8-9) czyli ta pierwsza wersja to w praktyce
if( BrakeStatus & 1 )
bo b_on == b_on bedzie zawsze prawdziwe.

porownanie to operator jak kazdy inny, a c++ te rzeczy sa w zasadzie defniowane luzno, jesli w ogole, dlatego prawie zawsze warto dla pewnosci wymuszac kolejnosc nawiasami itp, inaczej ugryzie cie to nie wiadomo kiedy.

2824
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 04 Stycznia 2017, 01:43:03 »
Z pierwszych odkryć to nie działa mi typeid(T) i chciałbym się dowiedzieć dlaczego.
Sprawdz, czy wlaczona jest generacja danych RTTI w ustawieniach kompilatora. Ale takie rzeczy to powinno sie raczej robic przez wirtualna funkcje w klasie bazowej, ktora konkretne warianty juz sobie implementuja tak, jak im to pasuje. Reczne sprawdzanie typow i wywolywanie odzielnych funkcji na tej podstawie to troche dokladanie sobie roboty i proszenie sie o klopot ;/

edit:
patrzac w kod, to najprawdopodobniej nie dziala bo porownujesz wskaznik do klasy z klasa, wiec tam rownosci nigdy nie bedzie. Czyli nie powinno byc
typeid( foopointer ) == typeid( bar )
ale
typeid( *foopointer ) == typeid( bar )

2825
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 30 Grudnia 2016, 18:31:46 »
Jeśli chodzi o IDE to lepiej jednak byłoby używać coś, co jest wieloplatformowe, czyli np. CodeBlocks, albo notatnik, a nie microsoftowy VS, który pewnie ma tam jakieś swoje dodatki działające wyłącznie pod windowsem.
IDE to tylko IDE; nie ma raczej wplywu na kod, a pisanie czegokolwiek przy uzyciu notatnika to bezsensowny masochizm, ktory tylko stwarza pole dla trywialnych bledow. Of tego jest glupi komputer, zeby pamietal definicje klas i funkcji, i pilnowal czy skladnia sie zgadza.

2826
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 30 Grudnia 2016, 10:45:50 »
Nosz wkurzyłem się. Błąd był spowodowany nieprawidłowym użyciem przez kompilator funkcji abs(). Zamiast używać tej z cmath używał z stdlib (pomimo includowania nagłówka). A w stdlib jest wersja tylko dla int, a funkcja używa wersji dla double.
Z tego co widze w zrodlach to kompilator dzialal tutaj poprawnie -- abs() z <cmath> jest ulokowany w namespace std, czyli zeby go uzyc trzeba wywolac std::abs() a w kodzie jest tylko abs(). No i jakies ostrzezenie przy kompilacji powinno tam byc, chocby dlatego ze parameter typu double jest konwertowany do int na wejsciu. Nawiasem mowiac ten sam blad ma miejsce przy innych funkcjach -- jest tam np. sqrt() zamiast std::sqrt()

Jak juz przy tym jestesmy, to w std:: sa tez min() and max(), mozna nimi zastapic te z mctools. Sa o tyle wygodniejsze, ze dzialaja na wszystkich typach zmiennych wiec nie trzeba pamietac ktory wariant jest do int, a ktory do double, itp.

2827
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 22 Grudnia 2016, 13:37:17 »
Ale żeby nie było, żem beton (ciekawe czy Kuba się będzie rzucał), to szukam jakiegoś dobrego narzędzia i może w święta zrobię analizę.
Dla swietego spokoju mozesz kod przepuscic przez http://cppcheck.sourceforge.net/ zdaje sie ze jest calkiem przyzwoity i nie wymaga jakiegos specjalnego zaangazowania. Pisanie na wlasna reke jakis dedykowanych narzedzi raczej mija sie z celem, imo.

  Dodano: 22 Grudnia 2016, 15:57:28
Przepuscilem to co jest na githubie przez cppcheck, i troche kwiatkow znalazl, w tym kilka grubszych. Te z kategorii (error) trzeba by raczej poprawic, reszta to juz roznie. Czesc jest bardziej powazna, czesc mniej.

2828
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 15 Grudnia 2016, 01:55:39 »
Ogólnie już w pierwszym kroku obliczeń są różnice w ciśnieniach więc na pewno coś jest nie halo.
Warto tez pewnie zweryfikowac czy kod dostaje te same dane wejsciowe, jeszcze przed obliczeniami -- wspominales nieinicjalizowane zmienne, wiec moze sie jeszcze jakies takie kwiatki ostaly.

2829
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 07 Grudnia 2016, 22:11:13 »
Tak szczerze to ja nie chce dranstwa tykac, bo nie mam zaufania ani do siebie ze czegos przy okazji nie spieprze, ani do niego ze mi w system jakos nie napaskudzi :)

2830
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 07 Grudnia 2016, 21:16:58 »
Po całym dniu szukania znalazłem, tą fajną różnicę, że Pascal inicjuje zmienne do wartości 0, a c++ jak chce.
No, to akurat standard :)  Tzn nie, ze c/c++ inicjalizuje jak chce, tylko samo z siebie nie inicjalizuje w ogole, wiec dostajesz to co sie akurat trafi w pamieci, a trafic moze sie wszystko (przynajmniej w trybie release, debug moze sobie rozne rzeczy tam ustawiac)

Jak zrobisz wszystko inne, to jesli nie znajdzie sie nikt inny to ja moge sie poswiecic i tego parsera wyciac, ale to na samym koncu bo tak jak wspomnialem, inaczej nie bede w stanie tego skompilowac, wiec musialbym edycje na sucho robic.

2831
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 06 Grudnia 2016, 15:22:54 »
Nie mogę dojść do ładu i składu z hamulcami. Po przestawieniu kranu hamulec w ogóle nie reaguje. Sprawdziłem czy może uruchamia funkcje z klasy bazowej zamiast potomnej ale wygląda ok. Zaczynam głupieć.
Jesli mozna cos zasugerowac, wytnij najpierw Borlanda do konca, a jak juz zrodla da sie skompilowac gdzie indziej, to i odpluskwianie i cala reszte bedzie duzo latwiej przeprowadzic.

2832
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 01 Grudnia 2016, 12:40:17 »
" nie większym niż 100" czyli maksymalnie 100 kroków w sekundę.
Ale tam bylo "z krokiem nie wiekszym niz", i zaczalem kombinowac, ze to wskazuje ze krok musi byc jak najmniejszy, a to akurat zwieksza ilosc kalkulacji na sekunde, a nie zmniejsza :)

2833
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 01 Grudnia 2016, 00:43:52 »
U nas fizyka musi być liczona z krokiem nie większym niż 100 razy na sekundę ze względu na stabilność sprzęgów i przepływów.
Nie jestem pewien czy dobrze to czytam, ale czy masz na mysli ze fizyka musi byc liczona co najmniej 100 razy/sek? Czy przeciwnie, nie wiecej niz 100 razy? Jesli to pierwsze, to chyba raczej w tej chwili nie ma to miejsca jesli fizyka jest liczona raz na ramke graficzna, bo 100 fps raczej rzadko sie zdarza, nawet przy wylaczonym vsync (no chyba ze kalkulacje sa robione z malym krokiem tyle razy ile trzeba, co ramke graficzna, ale wtedy nie wariowaloby przy niskim framerate?)

2834
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 29 Listopada 2016, 23:11:05 »
No i dlatego fizykę wypadało by z tego oczekiwania wybić i ograniczyć częstotliwość przeliczania do arbitralnej liczby max 120 powtórzeń na sekundę.
120 to bylby tzw overkill -- w zasadzie wszystkie gry publikowane dzisiaj maja fizyke liczona 15-20 razy na sek., okazjonalnie moze 30/sek. Silnik trzyma sobie zapisana aktualna i poprzednia kalkulacje, i interpoluje miedzy nimi na potrzeby wizualizacji.

tutaj jest bardzo ladna seria artykulow na ten temat: http://gafferongames.com/game-physics/ z kodem c++ i mnostwem innych przydatnych rzeczy (jak np. fizyka typu klient-serwer, bardzo przydatna do multiplayera itp)

2835
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 25 Listopada 2016, 13:18:02 »
I teraz mi powiedz, że nie zrobienie tego w konstruktorze (kiedy mamy te dane) jest normalne i logiczne. Za to zgadzam się, że ładowanie pliku przez konstruktor to nie jest najlepszy pomysł.
Ale chyba nikt nie sugeruje, zeby w konstruktorze w ogole nic nie robic? Tylko zeby rozdzielic takie rzeczy jak np proste ustawienie wartosci dla stringa z nazwa (konstruktor) z jednej strony, a ladowanie i obrobka siatki 3d powiazanej z modelem (init/load/whathaveyou)

Ale tak przy okazji, to jesli chodzi o te przyklady, to 1) z kabina, to wlasnie jest raczej przyklad tego, ze nie ma co na slepo odwolywac sie do obiektu bez sprawdzenia czy nie jest on czasem ustawiony na null -- tutaj taki test albo kontrolowany wysyp duzo latwiej byloby wysledzic 2) to oczywiscie powinno byc zrobione w konstruktorze; ale nawet jesli nie bylo, to wysyp mial raczej miejsce dlatego, ze domyslnie  w ogole nie bylo tam nic przypisane, a na zdrowy rozum powinno to byc cos jak "unspecified class" albo nawet pusty string, ale /jakis/ string a nie dziura do pamieci, ktorej glupi komputer od stringa nie odroznia :)

2836
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 23 Listopada 2016, 14:06:54 »
Z mojego doświadczenia brak inicjacji w konstruktorze zmiennych, do których odwołanie odbywa się przez wskaźnik prowadzi wprost do wysypów w dziwnych i nieoczekiwanych okolicznościach.
No, tak sie konczy proba odwolania do czegos co nie jest gotowe :)  Ale to nie znaczy ze trzeba caly process przygotowania modelu robic w konstruktorze. Konstruktor moze np oznaczyc obiekt jako 'niegotowy' (I albo odpalic proces ladowania/obrobki albo zostawic to dla managera) a reszta kodu jest wtedy tresowana zeby tego nie tykac dopoki flaga gotowosci nie jest przestawiona.

2837
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 22 Listopada 2016, 21:45:17 »
IMHO jest sens, ale nie teraz. Na początek potrzebna byłaby wersja exe identyczna z bieżącą oficjalną, tyle, że już bez Borlanda. To byłby dobry punkt wyjścia.
Tez wydaje mi sie, ze najrozsadniej chyba byloby skupic sie najpierw na wykopaniu Borlanda do konca, a jak juz sie da skompilowac rezultat gdzie indziej, to mozna go puscic przez profiler i na podstawie tego robic optymalizacje tego, co faktycznie obciaza proces.

2838
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 22 Listopada 2016, 18:55:28 »
Jak najbardziej, z tym ze przy programowaniu wielowatkowym znacznie latwiej cos schrzanic niz zwykle, wiec troche trzeba przy tym uwazac. Dobrze byloby pewnie najpierw naprawic i uporzadkowac to, co jest, rozdzielic na jakies sensowne moduly i takie tam.

2839
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 22 Listopada 2016, 14:51:53 »
Włos mi się zjeżył na głowie jak przeczytałem o przydzielaniu pamięci dla pojedynczych znaków. Zgroza. (No chyba, że czegoś tu nie wiem).
Raczej niezrozumienie jak dziala std::string. Zadna normalna/rozsadna implementacja nie przydziela pamieci dla pojedynczych znakow z osobna, nie ma co panikowac.

Dla zaspokojenia ciekawosci zrobilem sobie nastepujacy test:
// start
cParser parser( scenefile, cParser::buffer_FILE, subpath );
std::string token;
do {
token = "";
parser.getTokens();
parser >> token;

} while(token != "" );
// stop
i przepuscilem przez niego scenery/quarkmce.scn (w sumie na oko jakies 10mb tekstu) Calosc zajela ok. 1.7 sek, przy odczycie z normalnego, starego HDD. Wiec akurat nad wydajnoscia parsera bym sie nie spinal -- raczej nie jest on odpowiedzialny za ladowanie scen w 5-10 minut, i naweg gdyby Borland byl jakims sposobem kilka razy szybszy (nie moge skompilowac/sprawdzic) to i tak mowimy tu o roznicy wielkosci ulamka sekundy, w procesie ktory wykonuje sie raz na uruchomienie.

(zeby bylo smieszniej, przeniesienie zmiennej do naglowka itp nie ma realnego wplywu na predkosci testu; podejrzewam ze najwolniejszym elementem jest, tak jak mozna bylo sie spodziewac, samo ladowanie zawartosci plikow z dysku)

2840
Symulator / Odp: MaSzyna w Unity3D
« dnia: 22 Listopada 2016, 01:31:32 »
Masa teoretycznie prostych torów muli znacznie bardziej od lokomotywy na 120k poly.
Muli, bo silnik o ile dobrze pamietam nie ma zadnego sortowania materialow, wiec przy kazdym malym kawalku torow maja miejsce zmiany tekstur, a to jest niestety zabojcze. I tak dobrze, ze to openGL, bo pod directX to by zwyczajnie lezal i kwiczal.

(a ze 120k poly na lokomotywe to przegiecie, to inna para kaloszy ;x

2841
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 18 Listopada 2016, 00:59:31 »
Tak, chodziło mi właśnie o token += c. To jest kod jaki został podany za przykład na realokację za każdym wywołaniem.
Ah, ok. Akurat z tym to roznie bywa (dlatego nie rzucilo mi sie w oczy od razu), bo co prawda w standardzie tego nie ma, ale nowsze implementacje czesto stosuja cos, co nazywaja "Small String Optimisation", taki prywatny maly bufor wbudowany w string, na ktorym operuja najpierw, zeby uniknac alokacji. A przy wiekszych stringach re-alokacja tez jest wiekszymi kawalkami, zamiast co znak. Tak czy owak, z dodanym reserve() nie powinno byc tutaj problemow, nawet przy starszym kompilatorze.

edit: tutaj jest fajny artykul pokazujacy jak wyglada SSO w roznych kompilatorach: http://info.prelert.com/blog/cpp-stdstring-implementations

2842
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 17 Listopada 2016, 16:59:36 »
Da się to zoptymalizować, gdyż w tej chwili robi alokację stringa z każdym pobraniem znaku. Jeśliby robić tą alokację na każdym słowie myślę, że byłoby zdecydowanie szybciej.
Hmm? Moze ja zle patrze, ale w zrodlach tego nie widze... alokacja jest robiona raz na slowo:

std::string cParser::readToken(bool ToLower, const char *Break)
{
    std::string token = "";

(...)

    char c;
    do
    {
        while (mStream->peek() != EOF && strchr(Break, c = mStream->get()) == NULL)
        {
            if (ToLower)
                c = tolower(c);
            token += c;
            if (trimComments(token)) // don't glue together words separated with comment
                break;
        }
    } while (token == "" && mStream->peek() != EOF); // double check to deal with trailing spaces
edit: jesli masz na mysli, ze bedzie miala miejsce re-alokacja przy token += c, to wiekszosci mozna uniknac przez dodanie
    std::string token = "";
    token.reserve(16); // should be enough in most cases
a jeszcze lepiej wrzucic token do naglowka jako member, i tylko kasowac zawartosc w readToken().

Ogolnie rzecz biorac akurat tutaj wydajnoscia bym sie specjalnie nie przejmowal -- parser jest uzywany glownie do wczytywania konfiguracji podczas ladowania itp, wiec waskim gardlem i tak bedzie przede wszystkim odczyt z dysku.

Co do zajecia sie, nie mam niestety Borlanda wiec raczej nie jestem w stanie -- poprawki musialbym robic "na sucho" bez mozliwosci sprawdzenia czegokolwiek. Ale z tego co widze, to prowizorycznie wystaczyloby dopisac do cParsera:
std::string GetNextSymbol() {

std::string token;
getToken( token );
return token;
}
I tak z 90% istniejacego kodu lyknie zwykla zamiane "TQueryParserComp" na "cParser" (nie bedzie to najbardziej optymalne, ale bedzie dzialac)
edit 2: a nie, czekaj, nie bedzie, bo chyba nie masz zamiennikow ToDouble() itp dla zwyklego std::string? czyli i tak trzeba bedzie pozmieniac odwolania do konwersji, bleh.

Pozostale 10% to zmiana wywolan typu
    TQueryParserComp *Parser;
    Parser = new TQueryParserComp(NULL);
    Parser->TextToParse = str;
    Parser->First();
na
    cParser *Parser;
    Parser = new cParser( str );
i juz. Jak sie skompiluje i pojdzie, to wtedy mozna sie bawic w zastapienie istniejacych odwolan do GetNextSymbol() na bardziej eleganckie itp.

2843
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 16 Listopada 2016, 22:08:11 »
A nie da sie zastapic Query na cParser, zamiast przepisywac Query? W sumie oba robia to samo, tyle ze jeden sie kompiluje poza Borlandem a drugi nie ;) Z tego co widze w kodzie to Query jest uzywany tylko do wyciagania tokenow jeden po drugim ze stringa, wiec nawet nic dopisywac nie trzeba, co najwyzej pozmieniac odwolania.

troche czytelniej by sie tez zrobilo. np. zamiast
(w geom.cpp)
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Point.x = tf;
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Point.y = tf;
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Point.z = tf;
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Normal.x = tf;
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Normal.y = tf;
        tf = Parser->GetNextSymbol().ToDouble();
        TempVerts[i].Normal.z = tf;

moglo by wejsc
Parser->getTokens( 6, false );
*Parser
>> TempVerts[i].Point.x
>> TempVerts[i].Point.y
>> TempVerts[i].Point.z
>> TempVerts[i].Normal.x
>> TempVerts[i].Normal.y
>> TempVerts[i].Normal.z;

itp. Latwiej wtedy wylapac literowki i inne pluskwy.

2844
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 16 Listopada 2016, 16:38:43 »
A to ja przepraszam :)  Myslalem, ze wszystkie zaleglosci z Borlanda juz sa wyprute.

2845
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 15 Listopada 2016, 07:25:39 »
Do d... Zafiksowałem się na jednym rozwiązaniu co mi utrudniło robotę. Sprawdziłem alternatywę i wyszło, że trafienie w std::map przy 12 pozycjach wynosi O(1,07) zamiast O(1) przy zwykłej tablicy. Natomiast przy 8 pozycjach (dla kranu FV4aM) wynosi O(0,9) ;) A użycie std::map rozwiązuje większość problemów i jest "kompatybilne" z ujemnymi indeksacjami tablic w Pascalu.
std::map jest implementowana z uzyciem red-black tree, stad jest wolniejsza. Jesli potrzebujesz O(1) uzyj std::unordered_map (http://en.cppreference.com/w/cpp/container/unordered_map)  Interface jest o ile dobrze pamietam taki sam, wiec to tylko zmiana kontenera, a unordered_map jest oparta o hash, wiec z reguly da ci linearny czas dostepu.

(poza tym najpierw robi sie implementacje, a optymalizacje to ewentualnie i po testach ktore wykaza ze jest tu w ogole problem do usuniecia ;)

2846
Symulator / Odp: MaSzyna w Unity3D
« dnia: 14 Listopada 2016, 04:43:01 »

2847
Symulator / Odp: MaSzyna w Unity3D
« dnia: 13 Listopada 2016, 21:46:27 »
4. Osób jest wystarczająco! SAM to (mechanikę gry) zrobię pod warunkiem, że ktoś mi podpowie, jak zmienia się sterowanie do momentu obrotowego kół do napięcia i wytłumaczy mi te wszystkie tego typu zależności.
Nie bardzo rozumiem problem. Zrodla symulatora sa dostepne na githubie, otworz sobie i obejrzyj kod, ktory to kontroluje. Po przenosinach na c++ powinno to byc latwiejsze do ogarniecia. To samo jesli chodzi o konwersje formatow etc. Wszystkie szczegoly sa w zrodlach, plus opis na wiki (http://wiki.eu07.es/index.php/)

(o ile dobrze pamietam to bardzo, bardzo dawno temu McZapkie mial ladnie spisana dokumentacje dla calej teorii ktora wpisal w symulacje, ale nie wiem czy to jest gdzies teraz dostepne)

2848
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 02 Listopada 2016, 20:21:28 »
Inicjalizacja zmiennych w sumie powinna byc w kodzie od poczatku, wlasnie dlatego ze w standardzie nie ma gwarantowanych wartosci domyslnych. Pewnie warto by przy przenosinach sprawdzic wszystko pod tym katem, bo wiecej takich kwiatkow moze wyskoczyc...

2849
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 31 Października 2016, 12:39:16 »
Może ktoś mi wytłumaczy czemu zmienna globalna inicjowana w nagłówku wg kompilatora jest generowana w każdym pliku cpp który includuje ten nagłówek pomimo ifndef? Być może wyrzuca właśnie tutaj.
ifndef zabezpiecza tylko przed uzyciem tego samego naglowka po kilka razy przy kompilowaniu jednego .cpp, ale nie powstrzymuje kompilatora przed wlaczeniem tego naglowka i wygenerowaniem kopii zmiennej dla kazdego .cpp z osobna. A potem linker wariuje bo nagle ma cala kope kandydatow na zmienna globalna, zamiast jednej sztuki.

Od takich rzeczy jest extern tzn. w plikach .h robisz np.

extern std::string foo;

a potem w jednym tylko .cpp ma miejsce wygenerowanie zmiennej czyli

std::string foo = "bar";

i linker to wszystko sobie wtedy posklada.

2850
Bieżące Symulatorowe / Odp: Błąd w kolorystyce pulpitu Traxx
« dnia: 04 Lipca 2016, 05:43:06 »
Podacie jakąś sugestię, gdzie może leżeć przyczyna, to spróbuję coś zaradzić.
Wsparcie dla BGRA to extension do openGL, od wersji 1.2 bodajze. Czyli nie kazdy driver bedzie to obslugiwal.

Strony: 1 ... 93 94 [95] 96