-
21. Data: 2018-11-19 09:22:44
Temat: Re: Niezmienniki pętli
Od: Roman Tyczka <n...@b...no>
On Sun, 18 Nov 2018 23:14:44 -0800 (PST), Maciej Sobczak wrote:
> Wystarczy rozszerzyć składnię asserta. W tej chwili assert musi dostać jedno
wyrażenie, ale można by go rozszerzyć tak, żeby akceptował dowolne fragmenty kodu. W
niektórych językach to się robi o tyle łatwiejsze, że wszystko jest albo może być
wyrażeniem, również pętla While czy cokolwiek innego - wtedy do takiego asserta można
wsadzić dowolny fragment kodu, nawet z własnymi definicjami zmiennych wykorzystanych
w środku. Ale w C++ chyba niewiele trzeba, żeby to osiągnąć, np. z taką składnią:
>
> assert(dowolnyfragmentkodu, wynik_bool);
>
> I użyć tego tak:
>
> assert(
> int i; // albo inne definicje
> int j = x; // x jest na zewnątrz, ale widać go tutaj
>
> while (orzemy_jak_możemy)
> {
> // obliczenia, wywołania funkcji, itd.
> ...
> },
>
> x > 0 && i < 10 // jakiś ostateczny warunek
> );
>
> I wtedy assert, tylko w trybie debug, wykonuje ten kod a na końcu sprawdza warunek
logiczny z drugiego swojego argumentu. W trybie release nic nie robi.
>
> Kto zaproponuje definicję makra assert o takich zdolnościach?
Makra nie zaproponuję, ale wrzucę ciekawostkę.
W języku Solidity, używanym do smart kontraktów w sieci Ethereum
(kryptowaluty) stosuje się coś co się nazywa modifier, przykładowo dopisuje
się w klasie modifier isOwner, który sprawdza czy kontrakt wywołał jego
właściciel i tenże modifier dopisuje się do pozostałych metod, które mają
go sprawdzać przed wywołaniem, w przykładzie robi to metoda getData():
[...]
modifier isOwner {
require(msg.sender == owner);
}
function getData() public isOwner {
return data
}
[...]
ps. require to odpowiednik asserta
--
pozdrawiam
Roman Tyczka
-
22. Data: 2018-11-19 10:37:49
Temat: Re: Niezmienniki pętli
Od: q...@t...no1 (Queequeg)
Maciej Sobczak <s...@g...com> wrote:
> Ale jak rozumiem z sondażu, nikt tego nie stosuje. Pewnie ma to związek
> z faktem, że algorytm sortowania przez wybieranie już został wymyślony.
> :-)
Jedyne co stosuję bliskiego takim niezmiennikom to asercje :)
>> 5.2. Nie wierzę w i nie cierpię Assert (to tak jak by bez ostrzeżenia uderzyć
kogoś w twarz bez dalszego komentarza).
>
> To też jest ciekawe. Zwłaszcza, że assert statyczny i dynamiczny to nie to samo.
Dowodzi jedynie tego, że szyk ma błędne pojęcie o tym, czym jest assert
dynamiczny (a statycznego nigdy nie stosował).
--
https://www.youtube.com/watch?v=9lSzL1DqQn0
-
23. Data: 2018-11-19 10:45:20
Temat: Re: Niezmienniki pętli
Od: q...@t...no1 (Queequeg)
Sebastian Biały <h...@p...onet.pl> wrote:
> To następna obserwacja: jeśl wpływa to na runtime release należy to
> odrzucić. Wszelakie checkery asercyjne, za wyjątkiem programowania
> defensywanego, nie mogą istnieć w kodzie produkcyjnym.
Nigdy nie rozumiałem sensu tego rozumowania (poza kodem, w którym prędkość
wykonania jest tak krytyczna, że nawet asercje go opóźniają). Byłoby
idealnie, gdyby na produkcję szedł kod bez błędów, ale nigdy tak nie
jest...
> Dlatego używam np metaprogramowania do kontrolownia różych obliczeń.
> Jednak dalej brakuje mi czegoś takiego jak int a<4-200> i kontroli
> komilatora w debug kiedy a zmieni się poza zakres.
Jakimś obejściem problemu jest opakowanie `a` w klasę...
--
https://www.youtube.com/watch?v=9lSzL1DqQn0
-
24. Data: 2018-11-19 17:15:54
Temat: Re: Niezmienniki pętli
Od: g...@g...com
W gcc masz feature o nazwie 'statement expressions' (dla C), totez nastepujaca
definicja powinna dzialac:
#include <assert.h>
#define Assert(p) assert(({p}))
-
25. Data: 2018-11-19 19:45:37
Temat: Re: Niezmienniki pętli
Od: g...@g...com
W dniu poniedziałek, 19 listopada 2018 17:15:55 UTC+1 użytkownik g...@g...com
napisał:
> W gcc masz feature o nazwie 'statement expressions' (dla C), totez nastepujaca
definicja powinna dzialac:
>
> #include <assert.h>
>
> #define Assert(p) assert(({p}))
Aha, oczywiście nie ma drugiego argumentu postaci "wynik_bool",
bo i nie ma takiej potrzeby.
Tutaj mamy przykładowe użycie. Pilk sa.c:
#include <assert.h>
#define Assert(p) assert((p))
int main(void) {
int n = 5;
Assert({
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += i;
}
sum == (n*(n-1))/2;
});
return 0;
}
$ gcc -std=gnu99 sa.c
$ ./a.out
Jak zmienimy ostatnie wyrażenie w bloku np. na
sum == (n*(n-1))/3;
to dostajemy:
a.out: sa.c:17: main: Assertion `({ int sum = 0; for (int i = 0; i < n; ++i) { sum +=
i; } sum == (n*(n-1))/3; })' failed.
-
26. Data: 2018-11-19 19:49:22
Temat: Re: Niezmienniki pętli
Od: g...@g...com
W dniu poniedziałek, 19 listopada 2018 08:14:45 UTC+1 użytkownik Maciej Sobczak
napisał:
> > > Tak, to ważna obserwacja. Może da się te rzeczy rozdzielić?
> >
> > To następna obserwacja: jeśl wpływa to na runtime release należy to
> > odrzucić.
>
> więc odrzućmy. Niech sobie będą statyczne asercje oraz dynamiczne, ale sterowane
opcjami kompilatora.
>
> > Jest, ale w przypadku nadmiaru checkerów nie da się pisać czytelnie.
> [...]
> > Jednak dalej brakuje mi czegoś takiego jak int a<4-200>
>
> Czyli ogólnie: type invariants (niezmienniki typów). Wtedy warunek poprawności dla
danego typu opisuje sie w jego definicji i nie trzeba już zaciemniać kodu pisząc co
chwilę asercje, czy obiekt ma dobry stan. Tzn. zminimalizujmy zaciemnienie zbierając
je do jednego miejsca, z dala od algorytmu.
> Ciekawe, że wtedy można odróżnić niezmienniki typów (takie jak zakres zmiennej) od
niezmienników obliczeń (np. pętli) i wraz z tym rozróżnieniem dać im osobne miejsce w
kodzie. Przecież nie wszytko musi być klasycznym assertem.
Warto przyjrzeć się językowi Idris i typom zależnym. Twórca Idris, Edwin Brady,
opowiada tutaj o nim z humorem:
https://www.youtube.com/watch?v=zSsCLnLS1hg
-
27. Data: 2018-11-19 21:18:14
Temat: Re: Niezmienniki pętli
Od: s...@g...com
> Warto przyjrzeć się językowi Idris i typom zależnym. Twórca Idris, Edwin Brady,
> opowiada tutaj o nim z humorem:
> https://www.youtube.com/watch?v=zSsCLnLS1hg
Po po pierwsze, primo:
1. C++ jest zupełnie wystarczający do wszystkiego. A to co nie produkcyjne może być w
Bash lub Pythonie. Robiąc w Www musimy jeszcze znać Html i JavaScript. A jak chcemy
zrobić bazkę to dodatkowo Sql. Jest tego dość by mieć czego się uczyć przez 5 lat!
Po drugie, primo:
2. W języku programowania jest najważniejsze by był kompilowany do kodu maszynowego
(niżej nie zejdziemy - chyba że jeżyki opisu sprzętu Vhdl/Verilog są nam
niestraszne).
Po trzecie, primo:
3. Nie język programowania z Ciebie robi programistę, ale algorytmy jakich używasz.
Więc może sobie oszczędź tych wyjazdów z "odlotowymi" językami programowania, bo to
wrabianie w stratę czasu na bzdury! Lepiej już zaprojektować jakiś program (poćwiczyć
projektowanie) z jakimiś ciekawymi algorytmami (poćwiczyć projektowanie algorytmów i
ew. złożoność obliczeniową), a potem zastanowić się co w naszym dotychczasowym stylu
kodowania było nie tak i to zakodować to wg najnowszych pomysłów i spostrzeżeń
(poćwiczyć kodowanie). To jest racjonalne a nie strata czasu na kolejny (zbędny)
język programowania. Jak nie rozumiesz tego: to jest tak jak byś pożyczał od kogoś
innego instrukcję obsługi samochodu i się jarał jakie wymienione są tam ficzery - to
paranoja masz swój wózek i masz gdzieś ficzery wymienione w instrukcji kumpla - co
najwyżej można na temat tych ficzerów pogadać 5 min a nie czytać o tym tydzień!!!
Do trzeciego primo mam takie spostrzeżenie: zastanawiasz się czasem co programujesz
na co dzień?!? Czy nie jest tak, że przez prawie czas po prostu kopiujesz zmienne z
jednego miejsca w drugie?!? walcząc przy tym z jakimś obcym Api?!?
Ja np w ciągu pół roku zakodowałem tylko jeden algorytm z prawdziwego zdarzenia
(problem producenta i konsumenta), co mi zajęło parę dni (walka z Api gniazdek i
funkcją select Linux-a). Natomiast przez pozostały czas tylko kopiuję z jednego w
drugie (wyświetlanie danych, zapisy do bazy i edycja parametrów urządzeń). Ale i tak
jestem zadowolony, że mam tą robotę. Dobre jest to, że ten spadkowy projekt
opanowałem i prowadzę ku końcowi. A teraz przygotowujemy się do stworzenia nowego
ciekawego systemu z kilkoma algorytmami (ale i tak kopiowania danych będzie pewnie
95% kodu systemu).
-
28. Data: 2018-11-19 21:44:37
Temat: Re: Niezmienniki pętli
Od: q...@t...no1 (Queequeg)
s...@g...com wrote:
> Ja np w ciągu pół roku zakodowałem tylko jeden algorytm z prawdziwego
> zdarzenia (problem producenta i konsumenta), co mi zajęło parę dni
> (walka z Api gniazdek i funkcją select Linux-a). Natomiast przez
> pozostały czas tylko kopiuję z jednego w drugie (wyświetlanie danych,
> zapisy do bazy i edycja parametrów urządzeń). Ale i tak jestem
> zadowolony, że mam tą robotę. Dobre jest to, że ten spadkowy projekt
> opanowałem i prowadzę ku końcowi. A teraz przygotowujemy się do
> stworzenia nowego ciekawego systemu z kilkoma algorytmami (ale i tak
> kopiowania danych będzie pewnie 95% kodu systemu).
Pomijając wszystko inne, to zastanawiam się (serio), jak wyglądają Twoje
relacje z współpracownikami...
--
https://www.youtube.com/watch?v=9lSzL1DqQn0
-
29. Data: 2018-11-19 22:10:54
Temat: Re: Niezmienniki pętli
Od: fir <p...@g...com>
W dniu poniedziałek, 19 listopada 2018 21:44:40 UTC+1 użytkownik Queequeg napisał:
> s...@g...com wrote:
>
> > Ja np w ciągu pół roku zakodowałem tylko jeden algorytm z prawdziwego
> > zdarzenia (problem producenta i konsumenta), co mi zajęło parę dni
> > (walka z Api gniazdek i funkcją select Linux-a). Natomiast przez
> > pozostały czas tylko kopiuję z jednego w drugie (wyświetlanie danych,
> > zapisy do bazy i edycja parametrów urządzeń). Ale i tak jestem
> > zadowolony, że mam tą robotę. Dobre jest to, że ten spadkowy projekt
> > opanowałem i prowadzę ku końcowi. A teraz przygotowujemy się do
> > stworzenia nowego ciekawego systemu z kilkoma algorytmami (ale i tak
> > kopiowania danych będzie pewnie 95% kodu systemu).
>
> Pomijając wszystko inne, to zastanawiam się (serio), jak wyglądają Twoje
> relacje z współpracownikami...
>
pomijajac wszystko inne raczej typowe mysli dla ekstremalnego chama i skonczonego
buraka ...
-
30. Data: 2018-11-19 22:16:59
Temat: Re: Niezmienniki pętli
Od: fir <p...@g...com>
W dniu poniedziałek, 19 listopada 2018 22:10:56 UTC+1 użytkownik fir napisał:
> W dniu poniedziałek, 19 listopada 2018 21:44:40 UTC+1 użytkownik Queequeg napisał:
> > s...@g...com wrote:
> >
> > > Ja np w ciągu pół roku zakodowałem tylko jeden algorytm z prawdziwego
> > > zdarzenia (problem producenta i konsumenta), co mi zajęło parę dni
> > > (walka z Api gniazdek i funkcją select Linux-a). Natomiast przez
> > > pozostały czas tylko kopiuję z jednego w drugie (wyświetlanie danych,
> > > zapisy do bazy i edycja parametrów urządzeń). Ale i tak jestem
> > > zadowolony, że mam tą robotę. Dobre jest to, że ten spadkowy projekt
> > > opanowałem i prowadzę ku końcowi. A teraz przygotowujemy się do
> > > stworzenia nowego ciekawego systemu z kilkoma algorytmami (ale i tak
> > > kopiowania danych będzie pewnie 95% kodu systemu).
> >
> > Pomijając wszystko inne, to zastanawiam się (serio), jak wyglądają Twoje
> > relacje z współpracownikami...
> >
> pomijajac wszystko inne raczej typowe mysli dla ekstremalnego chama i skonczonego
buraka ...
nie wiem ilu jeszcze userow grupy to zauwazylo ale zdeje sie ze na pewno godek to
zauwazyl ze proby 1) wmiawianie komus
ze jest chory na chorobe psychiczna (niezaleznie czy jest czy nie) poloczone z
probami naigrywania sie z tego kogos
polaczone z (obsesyjnymi zreszta gownienymi probami zdeyskredytowanie tago kogos itd
MUSZA byc charakterystyczne dla
jedynie ekstremalnego ludzkiego jelopa,
nie mozna byc normalnym robica takie rzeczy - teraz pytanie skad takie ludzkie
gowno sie znalazlo na czacie zamiast siedziec z innymi downami w celi gdzie
charakterystycznie bardziej by pasowalo?
sam nie mam wyrozumialosci dla tego typu
skonchonego buractwa, slowo skonczone ludzki gowno wydaje mi sie mw w sam raz
adekwatne na taki poziom zdalnonego cwoctwa