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.


Pokaż wątki - Wonski

Strony: [1] 2
1
Gry / Nvidia geforce now & steam
« dnia: 2020-02-23, 08:58 »
Hejo, ostatnio postanowiłem potestować aż w końcu zakupić usługę nvidia ge force now. No po prostu byłem zachwycony i w sumie to nadal jestem, ale...
No właśnie ale.
Kupiłem tą usługę tylko dla tego, że można było przyciąć w wszystkie częśći dishonored z dodatkami. Dlatego też założyłem konto na steamie i specjalnie kupiłem grę.
Wczoraj wieczorem złapałem zonka jak chciałem uruchomić grę, bo po prostu była już niedostępna z powodu, że betsheda postanowiła wycofać swoje gry:
https://www.polygon.com/2020/2/21/21147821/nvidia-geforce-now-list-of-games-fallout-skyrim-bethesda-softworks-pulled

W tym przypadku chciałem zwrot pieniędzy na steamie. Grę kupiłem, a nie mogę jej odpalić na wybranym przez siebie urządzeniu, producent gry zrobił mnie bezczelnie w chuja. Nawet zabierałem się do kupna trzeciej części. Minęło już ponad 14 dni od zakupu i wyszło cos koło 16 przegranych godzin.
Pytanie więc czy jest to wgl możliwe, jeżeli tak to czy ktoś miał podobną sytuację z zwrotami.
Pytanie czy

2
Sprzęt, oprogramowanie / Tablet graficzny do 1000zł
« dnia: 2019-07-13, 14:23 »
Cześć,
Chciałem sobie kupić jakiś tablet graficzny, którego przestrzeń robocza była formatu kartki A4.
Zależy mi na tym by był to sprzęt który w cenie do 1000zł (lekki margines w postaci 100zł w górę) najbardziej by odwzorował pismo, szkice, itp..

Do czego tablet ma być używany? Jakie funkcje?
Z racji tego, że digitalizuję wszystkie moje materiały to głownie właśnie do sporządzania notatek.
Fajnie by było gdyby:
- były funkcje np, otwarcia pdf'a i mazania po nim.
- miał usb typu C.
- dało radę to używać jakoś z microsoft one note
etc..

Optymalnym wyborem byłby laptop yoga 920, albo któryś microsoft surface pro, ale cena około 8k za sensowną konfiguracje musi poczekać na lepsze czasy :D
Tak więc ktoś może polecić coś z własnego doświadczenia (a pewnie są graficy na tym forum, którzy maja tego typu sprzęt)
to  bardzo bym prosił, a sam nie wiem na co zwracać uwagę przy wyborze takiego sprzętu.

3
Hejo,
Ma ktoś z Was Raspberry Pi 3 w wersji B+?
Pytam, bo chciałem to kupić i postawić na tym trochę softu (git, gerrit, jenkins, jakieś prototypowanie, pewnie bym nawet mini chmurę z tego zrobił),
a nie wiem jak to się sprawuje, jakie to ma możliwości przerobowe.
Zdaję sobie sprawę, że po 1gb ddr2 i jakimś tam aeremkowym procesorku nie należy się wiele spodziewać, ale mogę sobie zrobić prymitywne distro linuxa co waży 12MB.
Nie planowałbym podłączać do tego żadnych peryferiów, komunikacja przez ssh.
Pytanie tylko jak wiele to urządzonko da radę pociągnąć.
I czy jeśli nie raspberry pi to co by się nadawało.

Sensowne wydaje się jeszcze to (trochę bardziej do wyświetlania grafiki):
https://botland.com.pl/pl/khadas-vim/10781-khadas-vim1-pro-arm-cortex-a53-quad-core-15ghz-wifi-2gb-ram-16gb-emmc.html
Duży plus za usb-c
Ten sam model, tylko mocniejsze parametry:
https://botland.com.pl/pl/khadas-vim/10782-khadas-vim2-basic-arm-cortex-a53-octa-core-15ghz-wifi-2gb-ram-16gb-emmc.html

Inne:
https://botland.com.pl/pl/moduly-odroid/6314-odroid-xu4-samsung-exynos5422-octa-core-20ghz-14ghz-2gb-ram.html
https://botland.com.pl/pl/moduly-odroid/11903-odroid-xu4q-samsung-exynos5422-octa-core-20ghz-14ghz-2gb-ram-z-pasywnym-chlodzeniem.html

4
Forum / Acta2
« dnia: 2018-07-05, 14:01 »
Hej,
jak pewnie wiecie, na dniach wchodzi (ma wejść) dosyć kontrowersyjna ustawa odnośnie prawa autorskiego. Nie będę się rozpisywał na ten temat, bo pewnie wszyscy wiecie o co chodzi.

Jedak ciekawi mnie jakie stanowisko w tej sprawie mają nasi administratorzy i moderatorzy.
Jaki potencjalny wpływ będzie to miało na kontent serwowany na forum oraz regulamin.

Pozdrawiam i zapraszam do dyskusji :)

5
Programowanie / Projekt CPU
« dnia: 2018-04-23, 21:20 »
Cześć,
Od dłuższego czasu rozpracowuję i zbieram wiedzę na temat inżynierii układów przetwarzania danych takich jak np znane wszystkim procesory intela.
Postanowiłem przekuć tą wiedzę w coś konkretniejszego i zrobić mały jednoosobowy dział R&D, gdzie będę prototypował i rozwijał układ cpu, przy użyciu języka VHDL.
Podłapałem trochę know-how z mojej obecnej pracy, więc wiem jak to powinno mniej więcej wyglądać.
Skromnie mówiąc, nie będzie to nie wiadomo co, mam bazowy koncept choć nie wiem w jakim kierunku się to potoczy.

Celem oczywiście nie jest wynajdywanie koła na nowo, czy próba nadrobienia dziesiątek lat pracy specjalistów z Intela, IBM czy AMD. Celem jest przede wszystkim rozwój oraz projekt, którym będę mógł się pochwalić w CV gdy będę zmieniał branżę :D

Projekt oczywiście będzie rozwijany w wolnym czasie, w tym wątku chciałbym publikować efekty swojej pracy.
Myślę (a przynajmniej mam nadzieję), że w tym wątku będzie mnóstwo ciekawych rzeczy o konstrukcji i działaniu CPU.

6
https://docs.microsoft.com/en-us/quantum/quantum-qr-intro?view=qsharp-preview

Cytuj
A natural model for quantum computation is to treat the quantum computer as a coprocessor, similar to that used for GPUs, FPGAs, and other adjunct processors. The primary control logic runs classical code on a classical "host" computer. When appropriate and necessary, the host program can invoke a sub-program that runs on the adjunct processor. When the sub-program completes, the host program gets access to the sub-program's results.
In this model, there are three levels of computation:
Classical computation that reads input data, sets up the quantum computation, triggers the quantum computation, processes the results of the computation, and presents the results to the user.
Quantum computation that happens directly in the quantum device and implements a quantum algorithm.
Classical computation that is required by the quantum algorithm during its execution.
There is no intrinsic requirement that these three levels all be written in the same language. Indeed, quantum computation has somewhat different control structures and resource management needs than classical computation, so using a custom programming language allows common patterns in quantum algorithms to be expressed more naturally.
Keeping classical computations separate means that the quantum programming language may be very constrained. These constraints may allow better optimization or faster execution of the quantum algorithm.
Q# (Q-sharp) is a domain-specific programming language used for expressing quantum algorithms. It is to be used for writing sub-programs that execute on an adjunct quantum processor, under the control of a classical host program and computer.
Q# provides a small set of primitive types, along with two ways (arrays and tuples) for creating new, structured types. It supports a basic procedural model for writing programs, with loops and if/then statements. The top-level constructs in Q# are user defined types, operations, and functions.

Mega ciekawy projekt :)
Na weekendzie zrobię podstawowe overview i dam znać co to jest i czym się to je.

7
Sprzęt, oprogramowanie / Chmura tymczasowa z API
« dnia: 2017-12-05, 20:11 »
Cześć,
potrzebuję chmury która spełnia podane wymagania:
- przechowuje pliki max 48 godzin (najlepiej jeszcze krócej, mogą to być nawet godziny)
- jest bezpłatna
- udostępnia API (najlepiej w pythonie)

Mam na myśli rozwiązanie takie jak to:
https://expirebox.com/
ale tu twórcy nie wyprowadzają żadnego api, a nie chce mi się reversować strony tylko po to by samemu to zrobić..
 
Przestrzeń może być limitowana nawet do 10MB, nie zależy mi na tym.

Jeżeli ktoś zna podobne rozwiązania to bardzo bym prosił o link.

8
C, C++ / Ciekawostka c++
« dnia: 2017-11-29, 21:35 »
Jak kompilator alokuje pamięć pod obiekt wyjątku std::bad_alloc?
Jak kompilator radzi sobie w przypadku kiedy zabraknie pamięci pod alokację obiektu wyjątku?
Np. prostą do wyobrażenia jest sytuacja, gdzy program rzuca wyjątek bad_alloc.
Na pierwszy rzut oka, nic nas to nie obchodzi. Ale biorąc to pod lupę, możemy stwierdzić, że jest to sprzeczna sytuacja i niezdefiniowane zachowanie.
I w rzeczywistości tak jest. Jak zaalokować pamięć pod wyjątek, gdy program chce nam zakomunikować, że zasoby zostały wyczerpane?
Na logikę powinno to wyglądać tak, że rzucenie bad_alloc powoduje, że znowu obrywamy bad_allockiem i tak dalej... skoro nie ma miejsca na alokację bad_alloca to powinno znowu rzucić bad_alloca. Proste.

Ale mimo wszystko obserwujemy co innego. Gdy wyjątek zostaje rzucony, programista może go przechwycić w bloku catch. Nie obserwujemy żadnej magii, a kompilator alokuje pamięć pod wyjątek, mimo, że dostając bad_alloca, dostaliśmy również komunikat, że coś z pamięcią jest nie do końca halo.

To nie zawsze musi być problem braku pamięci. Pamięć może być z jakiegoś powodu niedostępna. Po prostu alokacja pamięci pod wyjątek na strecie może się nie udać z różnych przyczyn.
Tak więc uogólnijmy problem. Niech to nie będzie brak pamięci, ale po prostu błąd alokacji.

Przeszukałem sieć w poszukiwaniu ciekawych materiałów na ten temat i znalazłem pewne wytłumaczenie.
Gdy alokacja pamięci pod wyjątek nie jest możliwa to standard takie zachowanie opisuje jako niezdefiniowane i w tej sytuacji daje wolną rękę kompilatorom, co z tym fantem zrobić.
Jednak jest to poważny brak w standardzie języka, ponieważ jeżeli piszemy kod z użyciem wyjątków, który jest w 100% zgodny z standardem, to w ekstreamlnych przypadkach nie mamy gwarancji, że wykona się on w 100% bezpiecznie. W sumie ciężko oczekiwać, by program napisany w jakimkolwiek języku wykonał sie poprawnie w takich warunkach. Bariery w postaci fizycznych zasobów nie da się przeskoczyć. Bezpieczeństwo w takich sytuacjach powinno zostać zapewnione przez system operacyjny, albo jakikolwiek resource manager (i tak pewnie jest w reczywistości).

Wracając do tematu.
Kompilatory różnie sobie radzą z tym problemem.
Znalazłem informację, że GCC i Clang korzystają z ABI C++ Itanium (ABI - application binary interface)
Znalazłem informację, że Intel również rozwija to ABI, więc można sądzić, że ICC również korzysta z tego rozwiązania, ale to tylko moje domysły, nie chciało mi się grzebać w dokumantacji intelowskiej :D
Kompilator Microsoftu definiuje własne ABI, więc raczej nie jest kompatybilne na poziomie binarnym z kompilatorami ICC, GCC i Clang... choc tego nie wiem, może jest jakiś RCP czy inne protokoły serializacyjne, udostępniające choć podstawową kompatybilność binarną.. również nie chciało mi się grzebać w dokumentacji od microsoftu :D
Tak więc MSVC radzi sobie trochę inaczej w tej sytuacji, ale to opiszę później..

Dobra, ale przejdźmy do samego problemu rzucania wyjątku.
Opiszę to trochę szerzej.
Słowo kluczowe throw w c++ odpala całą maszynerię związaną z obsługą wyjątków. Podczas wykonywania instrucji throw następuje alokacja pamięci pod obiekt wyjątku. I tu jest kłopot. Jeżeli podczas tego procesu wystąpi błąd to wyjątek nie powędruje do klazuli catch, nawet nie zacznie się proces odwijania stosu. Nie mamy żadnej możliwości by na to w jakikolwiek sposób zareagować. Nie opakujemy instrukcji throw blokiem try, bezsens xd. Teraz widać jakie to niebezpieczne.

Myślę, że warto wspomnieć o tym, że model rzucania wyjątków w c++ jest zupełnie inny niż w innych językach.
Metody obługi wyjątków możemy podzielić na Resumptive i Non-Resumptive. W C++ mamy model non-resumptive. W modelu Resumptive, po tym jak wyjątek zostaje obsłużony, program kontynuuje swoją pracę tam gdzie wyjątek został rzucony, czyli następna instrukcja po throw. W c++ jak wiemy, tak nie jest... program kontunuuje swoją pracę na następnej instrukcji po pasującej klauzuli catch.

Dobra. Wróćmy do instrukcji throw. Jak została ona rozwiązana w Itanium.
Mamy kod:
throw Exception();Podczas napotkania instrucji throw, jest wołana funkcja __cxa_allocate_exception by utowrzyć obiekt wyjątku. Funkcja ta przyjmuje sizeof wyjątku. Następnie jest wkonywane wyrażenie Exception() a jego wynik jest zapisywane w buforze zwracanym przez __cxa_allocate_exception.
Następnie jest odpalana __cxa_throw, która przyjmuje bufor zrrócony przez __cxa_allocate_exception i jest odpalana cała maszyneria związana z odwijaniem stosu...
Warto zaznaczyć, że Itanium nie definiuje kolejności dwóch pierwszych kroków tego procesu. Tzn. Najpierw może zostać wykonane wyrażenie Exception(), następnie zostać zaalokowany bufor, a wartość wyrażenia Exception() skopiowana do tego buforu. To jest zależne od twórców kompilatorów implementujących ABI Itanium.

Kluczowa w tym procesie jest funkcja __cxa_allocate_exception, która alokuje pamięć dla obiektu wyjątku.
Normalnie obiekty wyjątków są alokowane na stercie.
Jednak gdy normalna alokacja na stercie zawodzi (czyli __cxa_allocate_exception failuje), to kompilator implementujący Itanium może próbować zaalokować "emergency buffers", którego minimalny rozmiar to 4KB, a maksymalny to 64KB. Bufory te są używane wyłącznie gdy dynamiczna alokacja zawodzi i tylko pod tymi warunkami:
- obiekt wyjątku nie może przekraczać 1KB, ponieważ w takich kawałkach jest alokowany bufor ratunkowy
- obecny wątek, chcący otrzymać kolejny bufor, nie może trzymać więcej niż 4 bufory

Jeżeli oba warunki nie zostaną spełnione, wołana jest funkcja terminate(), czyli kończymy program bez żadnej użytecznej informacji o błędzie. To najczarniejszy scenariusz :(
Jeżeli jest więcej niż 16 wątków trzymających bufory, to następny wątek chcący otrzymać bufor jest blokowany do momentu, gdy jakiś wątek nie zwolni buforu bezpieczeństwa.
Bufory bezpieczeństwa są implementowane przez kompilator, i używane tylko w sytuacjach związanych z wyjątkami.

Tak z tą systuacją radzą sobie kompilatory implementujące ABI Itanium.
MSVC w takim przypadku alokuje wyjątek na stosie co też jest cholernie niebezpieczne, jeżeli obiekt wyjątku jest duży (może prowadzić do przepełnienia stosu, a działanie w przypadku przepełnienia stosu również nie jest zdefiniowane przez standard)

Moim zdaniem takie rozwiązanie to delikatnie rzecz biorąc: protetyka.
Jak już wspomniałem świadczy to o tym, że NIGDY nie mamy gwarancji, że pisany kod nawet w 100% poprawny wykona się poprawnie.

Dziękuję, mam nadzieję, że miło się czytało.
Jeżeli ktoś chce poczytać więcej o tym jak są implemenotwane wyjątki i w ogóle mnóstwo innych mechanizmów (jak chocby polmorfizm i vtables) w c++ to polecam zapoznać się z Itanium C++ ABI:
http://refspecs.linuxbase.org/cxxabi-1.83.html

9
Cześć,
w komputerze HP EliteBook 840 G3 mam gniazdo na kartę SIM.
Chciałem się dopytać czy ktoś z Was nie bawił się w podobne rozwiązania.
Tzn ja wkładam kartę sim i nie dzieje się absolutnie nic, nie wyskakuje żadne okienko (Windows 7)
Chciałem mieć możliwość wykonywania/odbierania połączeń, wysyłanie/obieranie SMS i co najważniejsze pakiet internetowy.

Ktoś/coś?


10
Twórczość / Scamper - Neuroshima w nowej odsłonie
« dnia: 2017-09-20, 07:52 »
Witam Was drodzy forumowicze. Jako C++ Developer's Team Leader (:D) zespołu (studia?) StarSock, pragnę Wam przedstawić nasz rozbudowany projekt gry RPG o nazwie Scamper.
Akcja gry została osadzona w dalekiej przyszłości. Miejsce, w którym się znajdziemy to kolonia na odległej planecie. Jest ona bardzo nowoczesna, jednak niewiele z osiągnięć cywilizacji dociera do Slumsów, a to właśnie tu będziemy musieli walczyć o przetrwanie. W rezultacie łatwiej będzie o mikroprocesor niż o kawałek pożywienia. Wcielamy się w postać, której jedynym zadaniem jest ucieczka z tej oto planety, gdzie wydano na nią wyrok śmierci. Świat ten jest opanowany przez mafię i gangi, które kontrolują niemal wszystkie dziedziny życia mieszkańców.


Rozgrywkę oparto na systemie Neuroshimy, polskiej grze fabularnej wydanej w 2003 roku. Nie ma tu żadnych punktów życia, tylko rany i ich następstwa, np. mocno uszkodzona postać nie będzie w stanie walczyć na tym samym poziomie, co zdrowy żołnierz.
System rozwoju postaci w założeniu nie jest liniowym. Gracz za otrzymane punkty doświadczenia może wykupić dowolne umiejętności. Te z kolei pomogą mu w osiąganiu celu w jego ulubionym stylu.

Udostępniliśmy szereg futurystycznych broni, od zwykłych pistoletów, przez broń pneumatyczną, strzelby śrutowe i nie tylko. Dodatkowo postacie można wyposażyć w implanty, dodające różne funkcje, np. przez kilka minut otrzymuje się więcej punktów odporności na ból. Nie można ich jednak stosować cały czas, gdyż każdy jest ograniczony do maksymalnie kilku użyć dziennie.


Na koniec parę concept-artów i grafik:










Serdecznie zapraszam na tegoroczne PGA w Poznaniu, które odbędzie się w dniach: 6,7,8 października.


11
Programowanie / Certyfikacja dla programisty C/C++ Python
« dnia: 2017-09-11, 21:59 »
Cześć,
Mam pytanie odnośnie certyfikacji dla programistów znających języki wymienione w tytule posta.
Jakieś opinie czy to wgl jest potrzebne, czy samo to , że mam doświadczenie zawodowe w pełni powinno zadowolić potencjalnego pracodawcę?
Ogólnie rady na to jak podnieść swoją wartość na rynku pracy i czy certyfikacja jak np.:
https://cppinstitute.org/
jest warta pieniędzy?

Chciałem bardziej sformalizować swoją wiedzę. Mam pracę w zawodzie, idę na studia (zaoczne), ale czuję, że to za mało.

Mam pytanie też do bardziej zaawansowanych (@Adanos, avallach), na ile mogę liczyć za dwa lata pracy w Nokii? Tzn teraz mam 19 lat, przypuśćmy, że za dwa lata ciężkiej pracy i nauki, będę chciał iść gdzieś dalej, ale nie mając jeszcze ukończonych studiów. Ile mogę wołać?

12
Offtopic / Wadliwy telefon na umowę
« dnia: 2017-07-28, 20:47 »
Cześć,
podpisałem dzisiaj w t-mobile umowę na telefon sony xperia xa1.
Od podpisania umowy minęło ledwo 6 godzin. Parę godzin temu zauważyłem, że na matrycy przedniego aparatu są badpixele i aparat nie nadaje się do użytku.
Jutro idę i chcę wymiany na nowy z automatu, nie chcę go dać na gwarancję bo tam różne rzeczy się dzieją i w różnym stanie może do mnie wrócić, a poza tym mam przeprowadzkę i nie mam czasu na pierdoły.
Co mam mówić i na co się powoływać.
Sprawa jest dla mnie bardzo ważna.

13
C, C++ / Delete this a struktury drzewiaste
« dnia: 2017-07-16, 12:30 »
Cześć,
Ostatnio zaimplementowałem banalnie prostą strukturę drzewiastą. jednak podczas implementowania operacji czyszczenia drzewa, byłem zmuszony użyć dosyć niebezpiecznego i triku, a mianowicie wywołałem operator delete na wskaźniku this.
Jest to oczywiście jak najbardziej dozwolona operacja, jednak jest w niej bardzo dużo "ale".
Jedni mówią, ze konstrukcja jest jak najbardziej ok, a inni , ze użycie delete this, wprowadza sporo obostrzeń, struktura jest niebezpieczna w użyciu i ogólnie to dobry wyznacznik tego, że kod zmierza w złą stronę:
https://stackoverflow.com/questions/7039597/what-will-happen-if-you-do-delete-this-in-a-member-function

Oczywiście podczas implementacji starałem się by to było absolutnie bezpieczne i raczej działanie tego kodu nie jest niezdefiniowane:
Struktura drzewa: (interesująca metoda to clearTree)
class Node{
public:
Node(int dataParam) : _mParent{ nullptr }, _mLeftChild{ nullptr }, _mRightChild{ nullptr }, _mData{ dataParam } {
}

Node* searchNode(int dataParam) {
if (this == nullptr) {
return this;
} if (_mData == dataParam) {
return this;
} if (_mData < dataParam) {
return _mLeftChild->searchNode(dataParam);
}
return _mRightChild->searchNode(dataParam);
}

Node* insertNode(int dataParam) {
static Node* lParrent;

if (this == nullptr) {
auto* retNode = new Node(dataParam); // każdy obiekt jest tworzony przy użyciu zwykłego new
retNode->_mParent = lParrent;
return retNode;
} if (dataParam <= _mData) {
lParrent = this;
_mLeftChild = _mLeftChild->insertNode(dataParam);
} else {
lParrent = this;
_mRightChild = _mRightChild->insertNode(dataParam);
}
return this;
}

int treeSize() const {
if (this == nullptr) {
return 0;
}
return _mLeftChild->treeSize() + 1 + _mRightChild->treeSize();
}

void printTree() const {
if (this == nullptr) {
return;
}
_mLeftChild->printTree();
std::cout << _mData << ' ';
_mRightChild->printTree();
}
void clearTree() { // zastępuje niejako destruktor
if(this != nullptr) {
_mLeftChild->clearTree();
_mRightChild->clearTree();

// niebezpieczne w chuj, ale w tej sytuacji raczej poprawne
delete this;
// dalej już nikt nie ma dostępu do składowych
}
}

private:
Node* _mParent;
Node* _mLeftChild;
Node* _mRightChild;
int _mData;
};
Kod kliencki:
int main( int argc, char* argv[] ) {

Node* rootNode = new Node(29); // spełniony wymóg co do delete this;
rootNode->insertNode(34);
rootNode->insertNode(32);
rootNode->insertNode(87);
rootNode->insertNode(21);
rootNode->insertNode(34);
rootNode->insertNode(2);
rootNode->insertNode(1);
rootNode->printTree();
std::cout << '\n' << rootNode->treeSize() << '\n';
rootNode->clearTree(); //niebezpieczne
rootNode = nullptr; // po wywołaniu metody, clear, już nikt nie ma dostępu do obiektu

system("PAUSE");
return 0;
}

Oczywiście jedną z możliwych opcji jest jeszcze jawne wywołanie destruktora, co również jest uważane za błąd projektowy.
Jest też opcja by zaimplementować wskaźniki liści jako wskaźniki słabe, tj std::weak_ptr, ale to i tak pozostaje problem z kontrolą czasu życia tych obiektów.

Ogólnie jest to strasznie niewygodne, bo wprowadza na klienta sporo ograniczeń. Nie ma opcji zarządzania tym przez smart pointery, więc klient musi pamiętać o ręcznym zarządzaniu pamięci. Musi również zapewnić by nikt po wywołaniu metody clear nie miał dostępu do obiektu.

Nie mam pojęcia jak inaczej można rozwiązać sytuację w której życie obiektu jest uzależnione od nie tyle od scope w którym się znajduje co od klienta, który decyduje w którym momencie obiekt ma przestać istnieć.

14
Witam Panowie
Ostatnio zrobiłem reinstalację windowsa 7 64bit na laptopie Toshiba Satelite c660.
Okazało się, że nie działał internet, więc zainstalowałem sterowniki ze strony producenta. Obecnie internet "działa" tylko po kablu. Wifi nie działa.
Problem jest jeszcze taki, że prędkość pobierania plików jest żałośnie mała 4,5kb/s lub 9kb/s, spada do 0mb/s i na koniec wywala błąd sieci przerywając pobieranie. Szybkość z jaką przeglądarka (chrome) ładuje strony też nie powala i pojawają się błędy (mam łącze 10mb/s). Dodatkowo wszystkie strony są oznaczone jako niebezpieczne. Instalowałem wszystkie sterowniki ze strony producenta.

W menadżerze urządzeń mm żółte wykrzykniki w następujących miejscach:
- Kontroler PCI Simple Comunications
- kontroler sieci
- nieznane urządzenie

Karta sieciowa to Realtek PCIe FE Family Controller

W menadżerze zadań, zakładce sieć, wykorzystanie sieci jest na poziomie 0.01%.

Komputer pokazuje, że karta sieciowa jest sprawna. Nie mam pojęcia co to może być.
Drugi komputer, również połączony przez kabel do tego samego routera działa bez zarzutu.

#edit
Właśnie pobieram unreal engine (poprzez instalator, nie przeglądarkę) i prędkość jest na poziomie ponad 500kB/s, podczas gdy poprzez przeglądarkę nadal utrzymuje się 5kB/s..

15
Cześć, chciałem się zapytać jak to jest z stosowaniem tego słowa kluczowego dla funkcji/metod.

Na polskich forach albo na stackoverflow jedni piszą, ze to stosowanie tego słowa dla metod nie rzucających wyjątku należy do tzw "dobrych praktyk" bo to użyteczna informacja dla programisty.
Z kolei inni piszą, żeby tego nie stosować bo podobno są potem problemy jak się używa jakiegoś dzikiego trybu kompilacji, i w ogóle to nieudany feature dodany do modern cpp...

Jednak w implementacji stl'a wg Micorsoftu można spotkać wiele metod z tym przyrostkowym słowem kluczowym.
Juz pomijam kwestie, ze w implementacji microsoftu istnieje macro __nothrow.
Jak to jest naprawdę i która ze stron ma racje?

16
C, C++ / AbstractFactory - zbyt mało abstrakcji
« dnia: 2016-07-12, 17:51 »
Cześć,
mam problem w zrozumieniu wzorca projektowego: Fabryka Abstrakcyjna.
Może zanim przejdę do problemu, przedstawię diagram UML i implementacje tego diagramu za pomocą kodu:

Diagram (troche spory rozmiar)
Spoiler


Implementacja:
Spoiler

Pierwsza rodzina produktów wraz z interfejsem
Spoiler
// Product Family A
class AbstractProductA
{
public:
virtual void process() = 0;
};

class Product_A1 : public AbstractProductA
{
public:
virtual void process()
{
cout << "Product_A1 from Family_A" << endl;
}
};

class Product_A2 : public AbstractProductA
{
public:
virtual void process()
{
cout << "Product_A2 from Family_A" << endl;
}
};

druga rodzina produktów wraz z interfejsem
Spoiler
// Product Family B
class AbstractProductB
{
public:
virtual void process() = 0;
};

class Product_B1 : public AbstractProductB
{
public:
virtual void process()
{
cout << "Product_B1 from Family_B" << endl;
}
};

class Product_B2 : public AbstractProductB
{
public:
virtual void process()
{
cout << "Product_B2 from Family_B" << endl;
}
};

fabryki konkretne wraz z interfejsem
Spoiler
class AbstractFactory
{
public:
virtual AbstractProductA * CreateProductA() = 0;
virtual AbstractProductB * CreateProductB() = 0;
};

class ConcreteFactory1 : public AbstractFactory
{
public:
AbstractProductA * CreateProductA()
{
return new Product_A1;
};

AbstractProductB * CreateProductB()
{
return new Product_B1;
};
};

class ConcreteFactory2 : public AbstractFactory
{
public:
AbstractProductA * CreateProductA()
{
return new Product_A2;
}

AbstractProductB * CreateProductB()
{
return new Product_B2;
}
};

klient
Spoiler
//client
class FinalProduct
{
AbstractProductA * _product_A;
AbstractProductB * _product_B;

public:

void process()
{
this->_product_A->process();
this->_product_B->process();
}

void build(AbstractFactory & _helper)
{
this->_product_A = _helper.CreateProductA();
this->_product_B = _helper.CreateProductB();
}

};

A oto kod za pomoca ktorego testowalem ta implementacje:
Spoiler
int main()
{
FinalProduct c1;

ConcreteFactory1 _obj;

c1.build(_obj);
c1.process();

ConcreteFactory2 _obj2;

c1.build(_obj2);
c1.process();

system("PAUSE");
return 0;
}

Jak widzimy nic szczególnego. Ot prosta implementacja fabryki abstrakcyjnej.
Jednak mnie zastanawia to czy dobrze ukryłem implementacje fabryk konkretnych. Z diagramu wynika (ten sam co z książki od GOF), ze klient nie powinien widzieć implementacji fabryk konkretnych.

Jeżeli zasłaniam implementacje przed użytkownikiem końcowym, tzn umieszczam w klasie reprezentującej klienta specjalnego switcha opartego na typie wyliczeniowym (albo jakichkolwiek stałych), to mam niezgodność z diagramem bo klasa klient zna implementacje fabryk konkretnych, ale plus jest taki, ze nie zna ich użytkownik końcowy.

Jeżeli zasłaniam implementacje przed klasa reprezentującą klienta, tzn korzystam z interfejsu fabryki abstrakcyjnej, to niby jest zgodność z diagramem, ale odpowiedzialność za znajomość implementacji fabryk konkretnych spada na użytkownika końcowego, który musi przecież jakoś zainicjować interfejs klasy reprezentującej klienta ( co widać w kodzie testującym).

W tych dwóch przypadkach jedyne co jest niewidoczne to produkty konkretne.Czy nie powinno być jednak tak, ze niewidoczne zostają również implementacje fabryk konkretnych?
Przecież ten kod lamie zasadę mówiącą by uzależniać kod od abstrakcji a nie od klas konkretnych.

17
Programowanie / Nazewnictwo
« dnia: 2016-07-09, 14:51 »
Cześć,
mam kilka niepewności co do nazewnictwa klas.

1. Czy dobrym zwyczajem jest oznaczać interfejs poprzez dodanie przedrostka "_I"? I czy wtedy również pierwsza litera w nazwie klasy powinna być duza?
Np.:
class _IInterface
lub
 class _ITest

2. Czy klasy abstrakcyjne które nie są interfejsami tez powinno się oznaczać w jakiś szczególny sposób? np przedrostkiem "_A"? No bo interfejs jest klasa abstrakcyjna, a z kolei klasa abstrakcyjna nie musi być interfejsem. Jak to rozróżnić i czy w ogóle musi istnieć taka potrzeba by to rozróżniać?
W konwencji camelcase ani underscore nigdzie o tym nie wspomniano (no chyba, ze to ja coś przeoczyłem).

3. Czy klasy które implementują wzorce projektowe (tzn te "kanoniczne" :D gangu czterech) powinny być oznaczane w jakiś szczególny sposób? Tzn przez dodanie nazwy wzorca do nazwy klasy czy może informować o tym w komentarzu albo bezpośrednio w dokumentacji?
Czy może raczej powinno to wynikać już bezpośrednio z implementacji?

18
Cześć,
Ostatnio wsiąknąłem do końca w poznawanie praktyk programistycznych. Z wieloma z nimi nie do końca się zgadzam i nie uważam ich za wygodne. Jedną z takich praktyk jest "prawo Demeter"

Krótki opis:

Nie uważam by było to wygodne w stosowaniu. Stosowanie tej praktyki powoduje, że hierarchia klas w postaci agregacji nie ma sensu, ponieważ wg tej praktyki kaskadowe odwoływanie się jest zabronione. Można to obejść, ale kosztem nadmiarowości metod, przez co interfejs staje się nieczytelny.

Możemy "rozmawiać tylko z najbliższymi przyjaciółmi", więc odwoływanie się w tym stylu:

this->_ini_file_shared_ptr->get_section(temp_name_section_shared_ptr_helper)->get_key(temp_name_key_shared_ptr_helper)-> set_key_value(temp_change_value_key_shared_ptr_helper);
odpada z wiadomych przyczyn. Zasada Demeter jest znana też jako zasada jednej kropki (w moim przypadku, wskaźnik polimorficzny), no bo występuje tylko jedno odwołanie.
Z jednej strony ma to swoje plusy, ale czy stosowanie się do tej zasady ma wymierne korzyści? Przecież to redundancja sprzeczna z metodyką LEAN.


Chciałem się Was zapytać czy warto to stosować?
Myślę, że ta zasada nie stoi na równi z takimi zasadami jak SOLID czy DRY, (nigdy, de facto, nie słyszałem o tym prawie Demeter, więc nwm czy to popularna zasada).

19
Cześć wszystkim
Podesłano do mnie laptopa DELL PJ8GD, którego już miałem okazję naprawiać i dzisiaj znowu do mnie przywędrował z wydaje mi się tym samym/podobnym problemem.

Było to już jakiś czas temu, nie pamiętam dokładnych szczegółów, ale komputer uruchamiał się tylko do momentu zakończenia inicjalizacji biosu, następnie pojawiał się niebieski ekran z którego wywnioskowałem, że musi być uszkodzony dysk lub był po prostu wypięty. (Był to jakiś kod błędu, który wygooglowałem)
Diagnostyka sprzętu za pomocą narzędzia z biosu potwierdziła te przypuszczenia.

No więc rozkręciłem sprzęt i za pomocą taśmy samoprzylepnej załatwiłem sprawę.
Najgorszy był etap rozkręcania tego gówna, ale o tym później..

No więc dzisiaj właściciel znowu przytaszczył te zgliszcza i poprosił o usługę.

Tym razem sytuacja wydaje się inna, ponieważ komputer po ekranie startu systemu windows nie wywala niebieskiego ekranu z kodem błędu, tylko po prostu następuje błysk i restart.
Uruchomiłem znowu diagnostykę i oto efekty:
http://ifotos.pl/z/ssxerar
http://ifotos.pl/z/ssxeraw
http://ifotos.pl/z/ssxerqp
http://ifotos.pl/z/ssxerqh
Przepraszam za duży rozmiar zdjęć :D

Jak już wspomniałem, rozkręcanie tego sprzętu to katorga i jeżeli nie jest to konieczne, tzn jeżeli w waszej opinii nie jest to ta sama sytuacja co wcześniej, to chciałbym uniknąć rozkręcania.
Warto dodać, że tym razem komputer odczytuje dane z dysku (o czym świadczy ekran inicjalizacyjny systemu), więc poprzednią usterkę można z dużym prawdopodobieństwem wykluczyć.

Jeżeli ktoś ma jakiś pomysł to proszę pisać :)



20
Cześć, witam wszystkich
Ostatnio postanowiłem poszerzyć swoją wiedzę o smart pointery z biblioteki stl-a.
Napisałem prostą hierarchię dwóch klas (w dużym uproszczeniu można by nazwać ją drzewem)
Dla przykładu:
class Key
{

shared_ptr< string > _key_name;
shared_ptr< string > _key_value;

public:
shared_ptr<string> get_key_name()
{
return this->_key_name;
};

void set_key_name(shared_ptr<string> _helper)
{
this->_key_name = _helper;
};

shared_ptr<string> get_key_value()
{
return this->_key_value;
};

void set_key_value(shared_ptr<string> _helper)
{
this->_key_value = _helper;
};
};

oraz zawierająca klasę Key, klasa Section:
class Section
{
vector< shared_ptr< Key > > _key_vector;

public:

shared_ptr< Key > get_key(shared_ptr<string> _helper)
{
size_t i;
for (i = 0; i < _key_vector.size();)
{
if (this->_key_vector.at(i)->get_key_name()->c_str() == _helper->c_str())
return this->_key_vector.at(i);

else
i++;
}
return nullptr;
}

void add_key(shared_ptr<string> _name_help, shared_ptr<string> _value_help)
{
auto _key_help = make_shared<Key>();
_key_help->set_key_name(_name_help);
_key_help->set_key_value(_value_help);

this->_key_vector.push_back(_key_help);
}
};

Problem jest następujący...
Gdy próbuję wywołać ten kod:
shared_ptr<Section> _section = make_shared<Section>();
shared_ptr<Key> _key = make_shared<Key>();
{
auto _key_name = make_shared<string>("key_name");
auto _key_value = make_shared<string>("key_value");
auto _section_name = make_shared<string>("section_name");

_key->set_key_name(_key_name);
_key->set_key_value(_key_value);

_section->add_key(_key_name, _key_value);
}

auto _k_name = make_shared<string>("key_name");

if (_section->get_key(_k_name) == nullptr)
cout << "sdasdasd" << endl;

już w samej głównej funkcji main, oczywiście, to warunek if zwraca prawdę, a nie powinien.
Operacje na obiektach specjalnie dałem w bloku bo chciałem sprawdzić czy kontrola rzeczywiście zmniejsza licznik referencji po opuszczeniu scope'a no i wgl chciałem "zasymulować" funkcję. (wszystko na potrzeby uproszczenia przedstawienia problemu)

Wszystkie operacje na obiektach implementuję poprawie. (choć mam wątpliwości czy w setterach nie powinienem wartości wskaźnika przypisywać za pomocą funkcji move()).
Debbuger wywala błąd access volation.. i tu jestem w ślepej uliczce, ponieważ nawet gdy wykonuję program krok po kroku to nie mogę wychwycić źródła tego problemu.

Dodam, że ta struktura jest bardzo uproszczona na potrzeby jak najprostszego przedstawienia problemu. Jeżeli ktoś ma ochotę zapoznać się z całym projektem (zaledwie kilka klas) to zapraszam na mojego gita:
https://github.com/SztywnyPawlo/INI_Parser
Kod znajdujący się w tym wątku to uproszczony kod właśnie tego projektu.
Tam mimo że struktura jest bardziej zagnieżdżona występuje ten sam problem.

Oczywiście zdaję sobie sprawę, że tą strukturę moznaby napisać znacznie łatwiej bez użycia smart pointerów, ale tu chodzi właśnie o edukacje :D
Pozdrawiam i czekam na odpowiedź.

Strony: [1] 2
Do góry