<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem kontrola-błędów</title>
<link>https://forum.pasja-informatyki.pl/tag/kontrola-b%C5%82%C4%99d%C3%B3w</link>
<description>Powered by Question2Answer</description>
<item>
<title>Python kontrola błędów except BaseException as e, e jest puste?</title>
<link>https://forum.pasja-informatyki.pl/503455/python-kontrola-bledow-except-baseexception-as-e-e-jest-puste</link>
<description>

&lt;p&gt;Cześć, ewidentnie coś mi umyka w tym temacie ponieważ próbuje złapać każdy błąd, Wszystkie z klasy Exception i dodatkowo KeyboardInterrupt do tego jeśli dobrze to zrozumiałem muszę użyć BaseException więc napisałem taki kod&lt;/p&gt;



&lt;pre class=&quot;brush:python;&quot;&gt;
#! /usr/bin/python3                                                                                                     
import sys                                                                                                              
from time import sleep
from reading_temp import temp_read
from mariadb_connection import connection, add_measurment, create_database, add_sensor
from tables import measurments, sensors
from pumps import  initPins, clean, pumpOn, pumpOff


def main():
    list_of_devices = '/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves'
    universal_path = '/sys/bus/w1/devices/'
    try:
        initPins()
        conn = None

        while(conn == None):
            conn = connection()
        create_database(conn)

        while(True):
            current_tempratures = temp_read(list_of_devices, universal_path)
            print(current_tempratures)

            for temp, sensor in current_tempratures:
                conn.execute(f'''insert into `{sensor}`(sensor_id, temprature)
                values((select id from sensors where sensor_name = '{sensor}'), {temp})''')

                if sensor == '28-5a1993d983ff':
                    tempCWU = temp
                    maxTemp = 50.0
                    hysteresis = 2.0
                    minTemp = maxTemp - hysteresis

                    if tempCWU &amp;lt;= minTemp:
                        pumpOn('CWU')


                    if tempCWU &amp;gt;= maxTemp:
                        pumpOff('CWU')
                        print('pump off')




            sleep(30)
        clean()
    except BaseException as e:
        print(e)
        clean()

if __name__ == '__main__':
    main()&lt;/pre&gt;



&lt;p&gt;Chciałbym żeby błędy zapisywały się do pliku ale nie mogę zapisywać jeśli nie mam żadnej wiadomości z błędem, i tutaj moje pytanie co źle zrozumiałem i co muszę zrobić aby dostać moją upragnioną wiadomość. Używam BaseExcaeption żeby zapisywać ręczne wyłączenie programu.&lt;/p&gt;



&lt;p&gt;EDIT: Tak mnie jeszcze naszło, czasami read_temp zwróci głupotę (niestety taki urok podpiętej elektroniki) czyli wartość np 12667 która nie mieści się w widełkach temperatury w bazie max 4 cyfry, czy jest możliwość złapania takiego błędu, zapisać do jakiegoś log'a i kontynuować z kodem?&amp;nbsp;&lt;/p&gt;</description>
<category>Python</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/503455/python-kontrola-bledow-except-baseexception-as-e-e-jest-puste</guid>
<pubDate>Tue, 11 Aug 2020 09:03:10 +0000</pubDate>
</item>
<item>
<title>Zadanie c++ wczytywanie z pliku, kontrola błędów</title>
<link>https://forum.pasja-informatyki.pl/366303/zadanie-c-wczytywanie-z-pliku-kontrola-bledow</link>
<description>

&lt;p&gt;Witam robię zadanie z kursu programowanie na stronie cpp0x które brzmi następująco:&lt;/p&gt;



&lt;p&gt;2. [&lt;strong&gt;trudne zadanie&lt;/strong&gt;] Napisz program, który dla każdego wiersza w pliku:&lt;/p&gt;



&lt;ul&gt;
	

&lt;li&gt;wczyta liczby i wypisze ich sumę w przypadku, gdy wszystkie liczby uda się wczytać;&lt;/li&gt;
	

&lt;li&gt;wypisze komunikat o błędnych danych, jeżeli wystąpi błąd podczas wczytywania liczb (komunikat ma wyświetlać numer wiersza, w którym wystąpił błąd).&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Przykładowe dane:&lt;/p&gt;



&lt;p&gt;1 2 3
&lt;br&gt;
3 4 a 5
&lt;br&gt;
3 2
&lt;br&gt;
5 2 2 1 3
&lt;br&gt;
# 3 4&lt;/p&gt;



&lt;p&gt;Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych:&lt;/p&gt;



&lt;p&gt;6
&lt;br&gt;
Bledne dane w wierszu nr 2!
&lt;br&gt;
5
&lt;br&gt;
13
&lt;br&gt;
Bledne dane w wierszu nr 5!&lt;/p&gt;



&lt;p&gt;Wykorzystaj poniższą funkcję do wykrywania znaku przejścia do nowej linii:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
bool czyNapotkanoZnakNowegoWiersza( std::ifstream &amp;amp; plik )
{
    char cZnak;
    for(;; ) //nieskończona pętla
    {
        plik.clear();
        cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych
        
        if( !isspace( cZnak ) )
             return false; //pobrany znak nie jest białym znakiem
        
        plik.get( cZnak ); //odczytujemy biały znak z pliku
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych
        
        if( cZnak == '\n' )
             return true;
        
    } //for
}&lt;/pre&gt;



&lt;p&gt;Powyższej funkcji&amp;nbsp;&lt;span style=&quot;text-decoration: underline;&quot;&gt;nie wolno&lt;/span&gt;&amp;nbsp;modyfikować.&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Napisałem następujący kod:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;

bool czyNapotkanoZnakNowegoWiersza(ifstream &amp;amp; plik )
{
    char cZnak;
    for(;; ) //nieskończona pętla
    {
        plik.clear();
        cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych

        if( !isspace( cZnak ) )
             return false; //pobrany znak nie jest białym znakiem

        plik.get( cZnak ); //odczytujemy biały znak z pliku
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych

        if( cZnak == '\n' )
             return true;

    } //for
}

bool wczytajplik(string nazwapliku)
{
 ifstream file;
 file.open(nazwapliku.c_str() );
 if(!file.good() )
 {
     cout&amp;lt;&amp;lt;&quot;Nie udalo sie odczytac pliku&quot;;
     return false;
 }
 int wiersz=1;
 int number;
 int suma=0;
 string linia;
    while(!file.eof() )
    {
    file&amp;gt;&amp;gt;number;
    if(file.fail() )
    {
      suma=0;
      cout&amp;lt;&amp;lt;&quot;Bledne dane w wierszu: &quot;&amp;lt;&amp;lt;wiersz&amp;lt;&amp;lt;endl;
      file.clear();
      std::getline( file, linia );
      wiersz++;

    }
    else
    {
        suma+=number;
        if(czyNapotkanoZnakNowegoWiersza(file));
        {
        wiersz++;
        cout&amp;lt;&amp;lt;suma&amp;lt;&amp;lt;&quot; &quot;;
        suma=0;
        }
    }

    }
    file.close();
    return true;

}

int main()
{
    if(wczytajplik(&quot;dane.txt&quot;) )
        cout&amp;lt;&amp;lt;&quot;Plik odczytano&quot;;
    return 0;
}&lt;/pre&gt;



&lt;p&gt;Jednak w oknie konsoli wyświetla mi się:&lt;/p&gt;



&lt;p&gt;1 2 3 3 4 Bledne dane w wierszu: 6
&lt;br&gt;
3 2 5 2 2 1 3 Bledne dane w wierszu: 14
&lt;br&gt;
Bledne dane w wierszu: 15
&lt;br&gt;
Plik odczytano
&lt;br&gt;
Process returned 0 (0x0) &amp;nbsp; execution time : 0.016 s
&lt;br&gt;
Press any key to continue.&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Co może być nie tak w kodzie?&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/366303/zadanie-c-wczytywanie-z-pliku-kontrola-bledow</guid>
<pubDate>Mon, 16 Jul 2018 17:32:39 +0000</pubDate>
</item>
<item>
<title>C++ kontrola błędów wejścia, pętla ?</title>
<link>https://forum.pasja-informatyki.pl/281146/c-kontrola-bledow-wejscia-petla</link>
<description>

&lt;p&gt;Witam wszystkich!&lt;/p&gt;



&lt;p&gt;Zacząłem jakiś czas temu robić kurs C++ Pana Mirosława, obecnie zrobiłem 6 odcinek.&lt;/p&gt;



&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ib7LXBNfZ7g&quot; rel=&quot;nofollow&quot;&gt;https://www.youtube.com/watch?v=ib7LXBNfZ7g&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Chodzi mi dokładnie o moment w którym mowa o pętli która będzie pozwalała podać jeszcze raz poprawne wartości(jeśli użytkownik poda złe). W filmiku 17;08. W kodzie z odcinka program kończy się po wpisaniu błędnych danych.&lt;/p&gt;



&lt;p&gt;Postanowiłem zmierzyć się z tym problemem, lecz opornie mi to szło, jednak przeszukując internet natrafiłem na takie rozwiązanie...&lt;/p&gt;



&lt;p&gt;Przerobiłem kod odcinka w taki sposób:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
   cout &amp;lt;&amp;lt; &quot;Podaj numer miesiaca: &quot;;
   while(!(cin &amp;gt;&amp;gt; nr_miesiaca))
    {
        cout &amp;lt;&amp;lt; &quot;Blad! Podaj poprawny numer miesiaca: &quot;;
        cin.clear();
        cin.ignore(9999, '\n' );
    }&lt;/pre&gt;



&lt;p&gt;Teraz działa to tak, że po wpisaniu np liczby, program prosi jeszcze raz o podanie właściwych danych, aż do skutku( tak właśnie chciałem).&lt;/p&gt;



&lt;p&gt;TO jest kod z odcinka:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
 
using namespace std;
int nr_miesiaca;
 
int main()
{
    //cout &amp;lt;&amp;lt; &quot;Podaj numer miesiaca: &quot;;
 
    //if (!(cin &amp;gt;&amp;gt; nr_miesiaca))
    //{
    //    cerr&amp;lt;&amp;lt;&quot;To nie jest liczba!&quot;;
    //    exit(0);
    //}
 
    switch(nr_miesiaca)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            cout&amp;lt;&amp;lt;&quot;Ten miesiac ma 31 dni!&quot;;
        break;
 
        case 4:
        case 6:
        case 9:
        case 11:
            cout&amp;lt;&amp;lt;&quot;Ten miesiac ma 30 dni!&quot;;
        break;
 
        case 2:
            {
                int rok;
                cout&amp;lt;&amp;lt;&quot;Podaj rok: &quot;;
                cin &amp;gt;&amp;gt; rok;
 
if (((rok%4 == 0) &amp;amp;&amp;amp; (rok%100 != 0)) || (rok%400 == 0))
    cout&amp;lt;&amp;lt;&quot;Ten miesiac ma 29 dni!&quot;;
else cout&amp;lt;&amp;lt;&quot;Ten miesiac ma 28 dni!&quot;;
 
            }
        break;
 
        default: cout&amp;lt;&amp;lt;&quot;Niepoprawny numer miesiaca!&quot;;
 
    }
 
    return 0;
}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;Zamienilem te wykomentowane linie, na ten kod który wkleiłem wyżej. Dla pewności zamieszcze całośc, poniżej POPRAWNY KOD(dzialajacy jak chcialem):&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;

using namespace std;

int nr_miesiaca;

int main()
{
    cout &amp;lt;&amp;lt; &quot;Podaj numer miesiaca: &quot;;
   while(!(cin &amp;gt;&amp;gt; nr_miesiaca))
    {
        cout &amp;lt;&amp;lt; &quot;Blad! Podaj poprawny numer miesiaca: &quot;;
        cin.clear();
        cin.ignore(9999, '\n' );
    }

    switch(nr_miesiaca)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        cout &amp;lt;&amp;lt; &quot;Ten miesiac ma 31 dni!&quot;;
    break;

    case 4:
    case 6:
    case 9:
    case 11:
        cout &amp;lt;&amp;lt; &quot;Ten miesiac ma 30 dni!&quot;;
    break;

    case 2:
        {
            int rok;
            cout &amp;lt;&amp;lt; &quot;Podaj rok: &quot;;
             if(!(cin &amp;gt;&amp;gt; rok))
            {
                cerr &amp;lt;&amp;lt; &quot;To nie jest liczba!&quot;;
                exit(0);
            }

            if(((rok % 4 == 0) &amp;amp;&amp;amp; (rok % 100 != 0)) || (rok % 400 == 0))
                cout &amp;lt;&amp;lt; &quot;Ten miesiac na 29 dni!&quot;;
            else
                cout &amp;lt;&amp;lt; &quot;Ten miesiac ma 28 dni!&quot;;
        }

    break;

    default: cout &amp;lt;&amp;lt; &quot;Niepoprawny numer miesiaca&quot; &amp;lt;&amp;lt; endl;
    }


    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;Czy jest to poprawny sposób? Dodam, że jestem początkujący i z c++ narazie wiem tyle ile z odcinków Pana Mirosława, a tam nie było narazie pojęcia cin.ignore. Czytałem w internecie lecz nie mogę tego zrozumieć. Może mi to ktoś łopatologicznie wyjaśnić? Czy jest to dobry sposób? Na jakiej zasadzie działa to całe cin.clear i cin.ignore ?? Proszę o pomoc, mam nadzieje, że napisałem w miarę jasno.&amp;nbsp;Pozdrawiam&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/281146/c-kontrola-bledow-wejscia-petla</guid>
<pubDate>Tue, 29 Aug 2017 09:12:16 +0000</pubDate>
</item>
<item>
<title>[SWIFT]Obsługa błędów w prostym kalkulatorze</title>
<link>https://forum.pasja-informatyki.pl/233371/swift-obsluga-bledow-w-prostym-kalkulatorze</link>
<description>

&lt;p&gt;Witam :) Pisałem wcześniej, ale nikt nie odpowiedział:&amp;nbsp;&lt;a href=&quot;https://forum.pasja-informatyki.pl/232719/swift-obsluga-bledow-mnozenie-i-dzielenie-przed-dodawaniem-i-odejmowaniem?show=232719#q232719&amp;nbsp;&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://forum.pasja-informatyki.pl/232719/swift-obsluga-bledow-mnozenie-i-dzielenie-przed-dodawaniem-i-odejmowaniem?show=232719#q232719&amp;nbsp;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Zmieniłem kod na tyle, że myślę, że&amp;nbsp;lepiej będzie jak nowe pytanie zadam. Gdyby nie jeden błąd to pewnie bym nie napisał, ale nie rozumiem skąd on wynika:&lt;/p&gt;



&lt;p&gt;Błąd: Expected declaration. Jak rozwinę to mi pisze:&amp;nbsp;In declaration of 'Parser'. Znajduje się on przy wywoływaniu funkcji na samym dole.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Uczę się z książki i mam dodać odejmowanie (zrobiłem bardzo szybko), mnożenie i dzielenie (połowicznie bo nie uwzględnia pierwszeństwa co próbuję zrobić) i dodanie index-u do komunikatu błędu(tak średnio wiem co mam zrobić).&lt;/p&gt;



&lt;p&gt;Ktoś pomoże mi zrozumieć co źle robię?&amp;nbsp;Najlepiej też z tym indexem jakby mi ktoś pomógł &lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:applescript;&quot; title=&quot;Error handling&quot;&gt;

enum Token {
    //rodzaje tokenów
    case Number(Int)
    case Plus
    case Minus
    case Division
    case Multiplication
    case OpeningBracket
    case ClosingBracket
}

//analizator leksykalny - budowa
class Lexer {
    //String.CharacterView ma właściwości startIndex i endIndex
    let input: String.CharacterView
    var position: String.CharacterView.Index
    
    enum theError: Error {                        //zgłasza błąd
        case IncorrectCharacter(Character)
    }
    
    init(input: String) {
        self.input = input.characters             //inicjalizujemy właściwośc wraz z danymi wejściowymi,ma wartość wskazującą początek tych danych wejściowych
        self.position = self.input.startIndex
    }
    
    //może być wywołana zawsze
    func peek() -&amp;gt; Character? {                  //spradzenie kolejnego znaku w danych wejściowych. Wskazuje analizatorowi, że zostały przetworzone wszystkie dane wejściowe
        guard position &amp;lt; input.endIndex else {
            return nil
        }
        return input[position]
    }
    
    //IMPLEMENTACJA ALGORYTMU ANALIZATORA
    
    //można wywołać tylko wtedy, gdy aktualne położenie nie jest końcem danych wejściowych
    func advance() {                                                //przejście do kolejnego znaku
        assert(position &amp;lt; input.endIndex, &quot;You can not go beyond the data input&quot;) //gdy false - wpadnięcie w pułapkę i wyświetlenie komunikatu
        position = input.index(after: position)
    }
    func getNumber () -&amp;gt; Int {              //wyodrębnia liczby całkowite z danych wejściowych
        var value = 0
        
        while let nextCharacter = peek() {
            switch nextCharacter {
            case &quot;0&quot;...&quot;9&quot;:
                let digitValue = Int(String(nextCharacter))!
                value = 10*value + digitValue
                advance()
            default:
                return value
            }
        }
        return value
    }
    func lex() throws -&amp;gt; [Token] { //throws, czyli funkcja/metoda może wygenerować błąd
        var tokens = [Token]()      //tablica z tokenami
        
        while let nextCharacter = peek() {   //przetworzenie wszystkich danych wejściowych
            switch nextCharacter {
             case &quot;(&quot;:
                tokens.append(.OpeningBracket)
                advance()
                
            case &quot;)&quot;:
                tokens.append(.ClosingBracket)
            case &quot;0&quot;...&quot;9&quot;:
                let value = getNumber()
                tokens.append(.Number(value))
                
            case &quot;*&quot;:
                tokens.append(.Multiplication)
                advance()
                
            case &quot;/&quot;:
                tokens.append(.Multiplication)
                advance()
                
            case &quot;+&quot;:
                tokens.append(.Plus)
                advance()
                
            case &quot;-&quot;:
                tokens.append(.Minus)
                advance()
                
            case &quot; &quot;:
                advance()
                
            default:
                throw theError.IncorrectCharacter(nextCharacter)   //throws  zatrzymuje funkcje i przekazuje błąd do komponentu wywołąjącego dany błąd zgodnego z protokołem Error
            }
        }
        return tokens
    }
}

class Parser {
    let tokens: [Token]
    var position = 0
    
    enum theError: Error {
        case unexpectedEndOfOutput
        case incorrectToken(Token)
    }
    
    init(tokens: [Token]) {
        self.tokens = tokens
    }
    
    func getNextToken() -&amp;gt; Token? {                     //peek() i advance() w jedną
        guard position &amp;lt; tokens.count else {
            return nil
        }
        let token = tokens[position]
        position += 1
        return token
    }
    
    func getNumber() throws -&amp;gt; Int {
        guard let token = getNextToken() else {
            throw theError.unexpectedEndOfOutput
        }
        switch token {
        case .Number(let value):
            return value
        case .Division:
            throw theError.incorrectToken(token)
        case .Multiplication:
            throw theError.incorrectToken(token)
        case .Plus:
            throw theError.incorrectToken(token)
        case .Minus:
            throw theError.incorrectToken(token)
        case .OpeningBracket:
            throw theError.incorrectToken(token)
        case .ClosingBracket:
            throw theError.incorrectToken(token)
        }
    }
    
    func parse() throws -&amp;gt; Int {
        var value = try getNumber()
        
        while let token = getNextToken() {
            switch token {
            case .OpeningBracket:
                try getBrackets()
            
            case .ClosingBracket:
                try getNumber()
                
            case .Multiplication:
                let nextNumber = try getNumber()
                value *= nextNumber
                
            case .Division:
                let nextNumber = try getNumber()
                value / nextNumber
                
            case .Plus:
                let nextNumber = try getNumber()
                value += nextNumber
                
            case .Minus:
                let nextNumber = try getNumber()
                value -= nextNumber
                
            case .Number:
                throw theError.incorrectToken(token)
            }
        }
        return value
    }
    
    func getBrackets() throws {
        var value = try getNumber()
        
        while let token = getNextToken() {
            switch token {
            case .Plus:
                let nextNumber = try getNumber()
                value += nextNumber
            case .Minus:
                let nextNumber = try getNumber()
                value -= nextNumber
            }
        }
    
}

func evaluate(input: String) {
    print(&quot;Calculation: \(input)&quot;)
    
    let lexer = Lexer(input: input)
    do {
        //wprowadza nowy zasięg, jeżeli jakieś wywołanie try spowoduje zgłoszenie błędu nastąpi wykonanie odpowiedniego bloku catch
        let tokens = try lexer.lex()
        print(&quot;Data output lexical analyzer: \(tokens)&quot;)
        
        let parser = Parser(tokens: tokens)
        let result = try parser.parse()
        print(&quot;Output parser: \(result)&quot;)
    }
    catch Lexer.theError.IncorrectCharacter(let character) {                        //zgłoszona wartość błędu jest przypisywana stłej error
        print(&quot;Data output contains invalid character: \(character)&quot;)
    }
    catch Parser.theError.unexpectedEndOfOutput {
        print(&quot;Unexpected end of data output during processing.&quot;)
    }
    catch Parser.theError.incorrectToken(let token) {
        print(&quot;Incorrect token during processing: \(token)&quot;)
    }
    catch {
        print(&quot;Following an unexpected error: \(error).&quot;)
    }
}

evaluate(input: &quot;10 + 5 + 3&quot;)
evaluate(input: &quot;10 + + 3&quot;)
evaluate(input: &quot;10 - 5 + 3&quot;)
evaluate(input: &quot;(10 * 3) - (3 * 5)&quot;)&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Android, Swift, Symbian</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/233371/swift-obsluga-bledow-w-prostym-kalkulatorze</guid>
<pubDate>Tue, 07 Mar 2017 19:01:58 +0000</pubDate>
</item>
<item>
<title>[Swift] Obsługa błędów - mnożenie i dzielenie przed dodawaniem i odejmowaniem</title>
<link>https://forum.pasja-informatyki.pl/232719/swift-obsluga-bledow-mnozenie-i-dzielenie-przed-dodawaniem-i-odejmowaniem</link>
<description>

&lt;p&gt;Witam,&amp;nbsp;&lt;/p&gt;



&lt;p&gt;niestety znowu proszę o pomoc. Uczę się z książki i mam dwa zadania, których do końca nie potrafię zrobić. Zgodnie z tematem, skończyłem czytać zadania o obsłudze błędów. Pierwsze zadanie poszło bardzo szybko (trzeba było dodać odejmowanie). Drugie zadanie jest o dodaniu informacji o tym w jakim indexie wystąpił błąd. W trzecim zadaniu mam dodać mnożenie i dzielenie. To mi się udało ale jest nieprawidłowy wynik. Kiedy próbuję, aby mnożenie i dzielenie miało wyższy priorytet od dodawania i odejmowania to wyskakuje mi, że * jest nieprawidłowym tokenem podczas przetwarzania. Próbowałem zastosować nawiasy, ale nie pykło. W tym momencie chciałem użyć wskazówki w zadaniu o rekurencyjnych &amp;nbsp;analizatorach składni, ale nie mogę jakoś znaleźć nic co by mi pomogło.&lt;/p&gt;



&lt;p&gt;Pewnie kod jest zbyt rozbudowany, ale teraz priorytetem&amp;nbsp;jest, aby najpierw zrozumieć co i jak należy zrobić,&amp;nbsp;aby wszystko działało tak jak należy :)&lt;/p&gt;



&lt;pre class=&quot;brush:applescript;&quot;&gt;
enum Token {
    case Number(Int)
    case Plus
    case Minus
    case Division
    case Multiplication
}

class Lexer {
    let input: String.CharacterView
    var position: String.CharacterView.Index
    
    enum theError: Error {
        case IncorrectCharacter(Character)
    }
    
    init(input: String) {
        self.input = input.characters
        self.position = self.input.startIndex
    }
    func peek() -&amp;gt; Character? {
        guard position &amp;lt; input.endIndex else {
            return nil
        }
        return input[position]
    }
    func advance() {
        assert(position &amp;lt; input.endIndex, &quot;You can not go beyond the data input&quot;)
        position = input.index(after: position)
    }
    func getNumber () -&amp;gt; Int {
        var value = 0
        
        while let nextCharacter = peek() {
            switch nextCharacter {
            case &quot;0&quot;...&quot;9&quot;:
                let digitValue = Int(String(nextCharacter))!
                value = 10*value + digitValue
                advance()
            default:
                return value
            }
        }
        return value
    }
    func lex() throws -&amp;gt; [Token] {
        var tokens = [Token]()
        
        while let nextCharacter = peek() {
            switch nextCharacter {
            case &quot;0&quot;...&quot;9&quot;:
                let value = getNumber()
                tokens.append(.Number(value))
            case &quot;*&quot;:
                tokens.append(.Multiplication)
                switch nextCharacter {
                case &quot;+&quot;:
                    tokens.append(.Plus)
                    advance()
                case &quot;-&quot;:
                    tokens.append(.Minus)
                    advance()
                default:
                    advance()
                }
                advance()
            case &quot;/&quot;:
                switch nextCharacter {
                case &quot;+&quot;:
                    tokens.append(.Plus)
                    advance()
                case &quot;-&quot;:
                    tokens.append(.Minus)
                    advance()
                default:
                    advance()
                }
                advance()
            case &quot;+&quot;:
                tokens.append(.Plus)
                advance()
            case &quot;-&quot;:
                tokens.append(.Minus)
                advance()
            case &quot; &quot;:
                advance()
            default:
                throw theError.IncorrectCharacter(nextCharacter)
            }
        }
        return tokens
    }
}

class Parser {
    let tokens: [Token]
    var position = 0
    
    enum theError: Error {
        case unexpectedEndOfOutput
        case incorrectToken(Token)
    }
    
    init(tokens: [Token]) {
        self.tokens = tokens
    }
    
    func getNextToken() -&amp;gt; Token? {
        guard position &amp;lt; tokens.count else {
            return nil
        }
        let token = tokens[position]
        position += 1
        return token
    }
    
    func getNumber() throws -&amp;gt; Int {
        guard let token = getNextToken() else {
            throw theError.unexpectedEndOfOutput
        }
        switch token {
        case .Number(let value):
            return value
        case .Division:
            throw theError.incorrectToken(token)
        case .Multiplication:
            throw theError.incorrectToken(token)
        case .Plus:
            throw theError.incorrectToken(token)
        case .Minus:
            throw theError.incorrectToken(token)
        }
    }
    func parse() throws -&amp;gt; Int {
        var value = try getNumber()
        
        while let token = getNextToken() {
            switch token {
            case .Multiplication:
                let nextNumber = try getNumber()
                value *= nextNumber
                switch token {
                case .Plus:
                    let nextNumber = try getNumber()
                    value += nextNumber
                case .Minus:
                    let nextNumber = try getNumber()
                    value -= nextNumber
                default:
                    throw theError.incorrectToken(token)
                }
            case .Division:
                let nextNumber = try getNumber()
                value / nextNumber
                switch token {
                case .Plus:
                    let nextNumber = try getNumber()
                    value += nextNumber
                case .Minus:
                    let nextNumber = try getNumber()
                    value -= nextNumber
                default:
                    throw theError.incorrectToken(token)
                }
            case .Plus:
                let nextNumber = try getNumber()
                value += nextNumber
            case .Minus:
                let nextNumber = try getNumber()
                value -= nextNumber
            case .Number:
                throw theError.incorrectToken(token)
            }
        }
        return value
    }
}
func evaluate(input: String) {
    print(&quot;Calculation: \(input)&quot;)
    
    let lexer = Lexer(input: input)
    do {
        let tokens = try lexer.lex()
        print(&quot;Data output lexical analyzer: \(tokens)&quot;)
        
        let parser = Parser(tokens: tokens)
        let result = try parser.parse()
        print(&quot;Output parser: \(result)&quot;)
    }
    catch Lexer.theError.IncorrectCharacter(let character) {
        print(&quot;Data output contains invalid character: \(character)&quot;)
    }
    catch Parser.theError.unexpectedEndOfOutput {
        print(&quot;Unexpected end of data output during processing.&quot;)
    }
    catch Parser.theError.incorrectToken(let token) {
        print(&quot;Incorrect token during processing: \(token)&quot;)
    }
    catch {
        print(&quot;Following an unexpected error: \(error).&quot;)
    }
}


evaluate(input: &quot;10 + 5 + 3&quot;)
evaluate(input: &quot;10 + + 3&quot;)
evaluate(input: &quot;10 - 5 + 3&quot;)
evaluate(input: &quot;10 * 3 - 3 * 5&quot;)&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Android, Swift, Symbian</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/232719/swift-obsluga-bledow-mnozenie-i-dzielenie-przed-dodawaniem-i-odejmowaniem</guid>
<pubDate>Sun, 05 Mar 2017 16:41:20 +0000</pubDate>
</item>
<item>
<title>Kontrola błędów (switch)</title>
<link>https://forum.pasja-informatyki.pl/219888/kontrola-bledow-switch</link>
<description>Witam, jeżeli zajmiemy się instrukcją switch, zrobimy do niej jakieś opcje, np. case 1: case 2: to wprowadzając jakiś ciąg znaków program się wysypie. Opcja default nie jest wystarczająca w tym wypadku. Jak można zabezpieczyć program przed takimi błędami?</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/219888/kontrola-bledow-switch</guid>
<pubDate>Wed, 25 Jan 2017 11:38:02 +0000</pubDate>
</item>
<item>
<title>Całkowita kontrola błędów wejścia.</title>
<link>https://forum.pasja-informatyki.pl/151160/calkowita-kontrola-bledow-wejscia</link>
<description>Witam, ostatnio natrafiłem na potrzebe obsłużenia kompletnej kontroli błędów wejścia, konkretnie chodzi o to, żeby do zmiennej móc zapisać tylko to co do niej należy, a każdy inny przypadek wyrzucać.&lt;br /&gt;
&lt;br /&gt;
Czyli od podstawowych faktów takich jak to, że do inta nie można zapisać literki, do takich, żeby wywalało nawet jak po części wpiszemy dobrze, czyli np :123abca, albo 1.55.&lt;br /&gt;
&lt;br /&gt;
Funkcje takie jak cin.fail(), albo cin.good() działają tylko w tych podstawowych problemach, znajdę coś, co poradzi sobie z tym w całości?&lt;br /&gt;
&lt;br /&gt;
Oczywiście wpadłem na pomysł, żeby zapisać wszystko do stringa i tam już na tym operować, a potem za pomocą atoi np. zapisać to do zmiennej, ale mimo to wydaje mi się, że to nie jest najprostsze i najoptymalniejsze rozwiązanie.&lt;br /&gt;
&lt;br /&gt;
Znajdę gdzieś funkcje, która będzie dokonywała takiej selekcji z najwyższą surowością?</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/151160/calkowita-kontrola-bledow-wejscia</guid>
<pubDate>Sat, 18 Jun 2016 13:47:37 +0000</pubDate>
</item>
</channel>
</rss>