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 - ison

Strony: [1] 2 3 4 5 6
1
Szkółka / Odp: Jak rozwiazac to zadanie ? proste pytanie
« dnia: Marzec 15, 2015, 14:38:50 »
Jako, że nie wiadomo o jaki język chodzi, to zakładam, że dowolny. Podaję rozwiązanie w brainfucku:
>+[->,>+<----------[++++++++++<]>>]<<<<[<<]>>[.>>]

2
Design / Odp: Pomysł na grę - "I can see the code"
« dnia: Styczeń 17, 2015, 20:05:05 »
Coś w ten deseń: http://screeps.com/

3
Programowanie grafiki / Odp: SFML - dziedziczenie i metoda draw
« dnia: Styczeń 08, 2015, 10:25:09 »
Cytuj
i dodam do tego kodu powyżej:
const po draw() - SIGSEGV, Segmentation fault

Bo zapewne wtedy używasz wirtualnej metody draw z sf::Text (a bez const deklarujesz zupełnie inną metodę)

target.draw(obj, states); pewnie nie robi nic innego jak obj.draw(*this, states); więc się zapętlasz.

Spróbuj
void Text::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
  if(isVisible())
     sf::Text::draw(target, states);
  else
    target.draw(point, states);
  std::cerr << "draw()" << std::endl;
}

Wtedy raczej będziesz mógł to wyświetlić za pomocą window.draw().

4
Modding / Odp: Może skusić się na moda?
« dnia: Grudzień 19, 2014, 21:48:09 »
@lethern Gry to nie tylko gry AAA. Jest mnóstwo gier indie stworzonych przez kilkuosobową grupę (lub nawet przez pojedynczą osobę), które odniosły ogromny sukces.

5
C++ / Odp: C++ 0x11, lista inicjalizacyjna + domyślne wartości dla pól
« dnia: Listopad 17, 2014, 23:36:08 »
Dodam, że w C++14 tak się już da.

6
Szkółka / Odp: Wskaźniki
« dnia: Październik 22, 2014, 00:26:08 »
E tam. Wyjątków sam też używam, ale tylko tam, gdzie rzeczywiście je planuję złapać i obsłużyć.
Czyli generalnie wszędzie.

Cytuj
Np. w parserze/kompilatorze rzucić const char * albo std::string z komunikatem o błędzie kompilacji.
Wyjątki łapie się tylko takie, jakie jest się w stanie w danym miejscu obsłużyć, std::string nie mówi nic o tym co się stało, jak, dlaczego, ani tym bardziej co zrobić jeśli taki typ się złapie.

Cytuj
Jednak żeby pisać kod jakiegoś modułu, który rzuca wyjątki nie mając świadomości gdzie będą one łapane
Idea wyjątków jest taka, że tego kto rzuca wyjątek, nie powinno obchodzić gdzie i jak zostanie złapany. Powinien lecieć sobie tak daleko, aż znajdzie się jakiś kontekst, który będzie wiedział co robić dalej i, o ile będzie chciał się z tego pozbierać, to zagwarantuje powrót stanu do prawidłowej formy.

Cytuj
Złapiesz wyjątek w mainie i co zrobisz?
Zależy od kontekstu. Najprawdopodobniej nic poza wrzuceniem treści wyjątku do loga i zakończeniem programu. Skoro nikt wyżej w hierarchii nie był w stanie stwierdzić co poszło nie tak, ani nie był w stanie obsłużyć tego wyjątku, czyli się go nie spodziewał, to tym bardziej jest to błąd krytyczny, gdzie nie da się nic zrobić. Używanie wyjątków nie oznacza, że zamiast wszystkich textboxów z błędami typu "Couldn't open file" rzuca się wyjątek i nigdzie w programie go nie łapie.

Cytuj
Już lepiej w takiej sytuacji pozwolić się aplikacji zcrashować
Lepiej zcrashować program bez jakiegokolwiek śladu po błędzie? Jedyna sytuacja, w której to stwierdzenie nie jest jakieś mega złe, to chyba tylko ta, w której wypuszcza się jakąś aplikację i nigdy nie chce się więcej o niej słyszeć.

Cytuj
a jeżeli akurat taka sytuacja wystąpi u developera, to masz natychmiastowy wgląd w przyczynę (stack trace, zmienne, itp)
Czyli zamiast złapać wyjątek w funkcji foo(), wrzucić treści do loga, wyświetlić komunikat i go jakoś obsłużyć (np. zamykając aplikację), lepiej jest pozwolić aplikacji się scrashować i analizować stack trace? A co z assertami?

PS. Access violation to nie jest wyjątek C++. Tego nigdy nie da się złapać.

Cytuj
i potencjalnie leakować pamięć, uchwyty, zasoby
RAII
void foo()
{
    int *a = new int[1000];
}
Memory leaki mogą wystąpić tak samo ze zwykłego nie zwolnienia pamięci, jak z nie użycia RAII.
Poza tym, skoro w jakimś miejscu poleci wyjątek, który spowoduje leakowanie uchwytów, to chyba nie będziesz w stanie nigdzie tego sensownie obsłużyć i kontynuować działania aplikacji?

Cytuj
w porównaniu z zyskiem w postaci możliwości rzucenia sobie czymś od czasu do czasu.
Największy zysk jest taki, że wyjątku nie da się zignorować. Jeśli piszę doSomething(); doSomethingElse(); to mam gwarancję, że te funkcję zrobią to co mają zrobić.

7
Kupię / Odp: Kupię S. Meyers, H. Sutter, C++/C#/Java
« dnia: Październik 05, 2014, 23:13:38 »
Wciąż aktualne.

8
Kupię / Kupię S. Meyers, H. Sutter, C++/C#/Java
« dnia: Wrzesień 15, 2014, 23:22:03 »
Witam,

kupię książki z poniższej listy (w języku angielskim):

Effective C++ (third edition) - Scott Meyers
More Effective C++ - Scott Meyers
Effective STL - Scott Meyers
Exceptional C++ - Herb Sutter
More Exceptional C++ - Herb Sutter
Exceptional C++ Style - Herb Sutter
Modern C++ Design - Andrei Alexandrescu
C++ Concurrency In Action - Anthony Williams

Effective Java (second edition) - Joshua Bloch
Thinking in Java (fourth edition) - Bruce Eckel

Effective C# (second edition) - Bill Wagner

9
Skrypty / Odp: C++ i skrypty
« dnia: Kwiecień 20, 2014, 18:08:31 »
AngelScript (np.)

10
Projekty zaawansowane / Odp: Faster Than Bullets [Android]
« dnia: Kwiecień 04, 2014, 23:07:52 »

tyle zajęło mi zorientowanie się, że upgrade'y nic nie dają :/

11
Projekty zaawansowane / Odp: Faster Than Bullets [Android]
« dnia: Marzec 28, 2014, 01:36:48 »
Zarąbiste. Nie zmieniaj poziomu trudności bo gra straci smaczek. Do 5 poziomu doszedłem, 2 razy udało mi się dodatkowe życie kupić. Po ponownym uruchomieniu gry niestety poziom się nie zapisał.

12
SDL / Odp: C++, SDL i shared_ptr - jak używać?
« dnia: Marzec 16, 2014, 21:46:25 »
Cytuj
To jest ogólnie rzecz biorąc nieprawda. Pośredni wskaźnik na obiekt to dodatkowy cache miss.
Ale tutaj porównujemy raw ptr -> smart ptr, a nie obiekt statyczny -> smart ptr.
Odwołanie do obiektu poprzez zwykły wskaźnik to też cache miss, tak samo jak w przypadku smart pointera, który przy wyłuskiwaniu obiektu robi dokładnie to samo co zwykły wskaźnik (get jak i -> są inline).
Zerowy narzut tyczył się wyłuskiwania, a nie smart pointerów ogólnie.
Jeśli jest jakiś jeszcze kruczek, to proszę mnie poprawić.

btw
#include <cstdio>

template <class T> class Pointer
{
    public:
        T *get() {return m_ptr;}
        void set(T *ptr) {m_ptr = ptr;}

    private:
        T *m_ptr;
};

int main()
{
    int a;
    scanf("%d", &a);

    Pointer <int> ptr;
    ptr.set(new int(a));

    printf("%d\n", *ptr.get());
}
kompiluje się do dokładnie tego samego co
#include <cstdio>

int main()
{
    int a;
    scanf("%d", &a);
    int *ptr = new int(a);
    printf("%d\n", *ptr);
}



@kwonitf
Cytuj
Teraz rozumiem to tak, że zostały one stworzone tylko po to żeby zabezpieczyć przed tym, że ktoś zapomni napisać delete'a. Czy ja wiem, czy to tak łatwo zapomnieć?
Prosty przykład:
float getSqrt(float val)
{
    SqrtCalculator *sqrtCalculator = new SqrtCalculator();
   
    if(val < 0.f) return std::numeric_limits <float>::quiet_NaN()

    float retValue = sqrtCalculator->getSquareRoot(val);
    delete sqrtCalculator;
    return retValue;
}
oczywiście bardzo abstrakcyjny, ale jest.

Cytuj
to mój pomysł podmiany wszystkich wskaźników na shared_ptr ma sens?
shared_ptr tylko wtedy, gdy wiesz, że będziesz w pewnym momencie musiał dzielić ownership obiektu. W innym wypadku unique_ptr - nie zawsze potrzebny jest reference counting.
Ogólnie przy inteligentnych wskaźnikach narzut wydajnościowy jest, ale niewielki i mało istotny w aplikacjach indie.

13
SDL / Odp: C++, SDL i shared_ptr - jak używać?
« dnia: Marzec 16, 2014, 19:07:01 »
I tak, jest to narzut.
Narzut zerowy.

Odwołania do smart pointerów nie nakładają żadnego dodatkowego narzutu wydajnościowego. Jedynym problemem jest ich tworzenie - np. wyciąganie shared_ptr z weak_ptr lub przekazywanie smart pointerów przez wartość.

14
C++ / Odp: Includowanie plików nagłówkowych
« dnia: Grudzień 28, 2013, 15:44:08 »
Dla każdej jednostki translacji "makra się resetują". W pierwszym przykładzie jedyną jednostką translacji był main.cpp. Tak więc:
Cytuj
Makra te są resetowane jeśli kompilator zaczyna kompilować następny plik "(...).cpp"?
tak

Jeśli jesteś pewien, że ten sam kod raz się kompiluje raz nie to faktycznie jest to jakaś magia. A jeśli kompiluje się i na dodatek działa to jeszcze większa. Bez minimalnego kompletnego przykładu można jedynie tylko się domyślać. Może VC uruchomił poprzednio skompilowany plik?

15
C++ / Odp: Includowanie plików nagłówkowych
« dnia: Grudzień 28, 2013, 15:16:24 »
A więc co stoi na przeszkodzie, żeby napisać taki kod:

Najprościej mówiąc: guardy działają na całej "linii" include'ów.
main.cpp dołącza declarations.h, w tym momencie deklarujesz makro #define declarations_h,
declarations.h dołącza header1.h, w tym momencie deklarujesz makro #define header1_h,
header1.h dołącza declarations.h, makro declarations_h jest już zdefiniowane, więc nie dzieje się nic.

2 headery nigdy nie będą mogły widzieć siebie nawzajem cokolwiek byś robił. Jeśli taka rzecz jest potrzebna to oznacza to, że kod jest źle zaprojektowany.

Kluczem jest tu forward declaration. Przypadek gdzie klasa A zawiera w sobie obiekt klasy B, a klasa B zawiera w sobie obiekt klasy A nie ma sensu (sizeof(A) = inf). Ale jeśli klasa A zawiera wskaźnik na obiekt klasy B, który może być NULLem lub nie, to już ma to sens. Do deklaracji wskaźników i referencji nie jest potrzebna znajomość definicji drugiej klasy. Wystarczy sama deklaracja.
W plikach nagłówkowych deklaruje się same typy. A dopiero w pliku .cpp gdzie tych typów używasz include'uje się potrzebne nagłówki z pełną definicją.

Strony: [1] 2 3 4 5 6