eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR po latachRe: AVR po latach
  • Data: 2021-11-19 09:43:16
    Temat: Re: AVR po latach
    Od: "J.F" <j...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On Fri, 19 Nov 2021 08:57:19 +0100, Mateusz Viste wrote:
    > 2021-11-18 o 20:56 +0100, J.F napisał:
    >> Jak mam obsluge bledow w funkcji, to sie zaczynaja wyjscia mnozyc.
    >> Bo bledow moze byc mnostwo - np brak portu, brak prawa dostepu do
    >> portu, brak odpowiedzi w zalozonym czasie, niezrozumiala odpowiedz,
    >> zgloszony bład przez urzadzenie na porcie, błędna wartosc.
    >
    > W tym wypadku też mnogość wyjść może być problemem, bo szybko wychodzą
    > tego typu rzeczy:
    [...]
    > i prędzej czy później o czymś zapomnisz. Tzn. może nie ty, ale ja
    > na pewno. Zamiast tego można w ten sposób:
    >
    > void *buf = NULL;
    > int port = 0;
    >
    > buf = alokuj_bufor();
    > if (!buf) goto poleglem;
    >
    > if (!napisz_na_port() goto poleglem;
    >
    > if (!odbierz_z_portu() goto poleglem;
    >
    > return(sukces);
    >
    > poleglem:
    >
    > if (buf) zwolnij_bufor();
    > if (port) zamknij_port();
    > return(fail);

    w przypadku sukcesu tez mozemy chciec zwolnic zasoby, wiec raczej

    int err_code=0;

    if (!buf) {err_code=BUF_ALL; goto poleglem;}
    if (!napisz_na_port() {err_code=PORT_Write; goto poleglem;}
    if (!odbierz_z_portu() {err_code=PORT_READ; goto poleglem;}

    err_code=SUCCESS

    poleglem:

    if (buf) zwolnij_bufor();
    if (port) zamknij_port();
    return(err_code);

    > albo, jeśli kto naprawdę uczulony na goto, to całość ubrać w jakąś
    > niby-pętlę która wykonuje się raz, a wychodzić z niej breakiem...
    > Ale
    > to już kombinowanie na siłę, aby tylko nie zhańbić się goto przed
    > pryszczatą młodzieżą.

    Jak krokow wiecej to moze byc nieglupie - przygotowac taki
    mini program do wykonania.

    Mozna tez
    int err_code=0;

    if (!buf) err_code=BUF_ALL;
    if (!err_code && !napisz_na_port()) err_code=PORT_Write;
    if (!err_code && !odbierz_z_portu()) err_code=PORT_READ;

    err_code=SUCCESS

    if (buf) zwolnij_bufor();
    if (port) zamknij_port();
    return(err_code);

    no i niby poprawniej, tylko program niepotrzebnie sprawdza pare razy
    blad ... a co tam, szybkie procki mamy


    ewentualnie

    int err_code=0;
    if (!buf) err_code=BUF_ALL;
    else if (!napisz_na_port()) err_code=PORT_Write;
    else if (!odbierz_z_portu()) err_code=PORT_READ;

    err_code=SUCCESS

    if (buf) zwolnij_bufor();
    if (port) zamknij_port();
    return(err_code);

    Superczytelne :-P

    Gorzej, jak sie drzewko decyzyjne komplikuje ...

    J.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: