1

(3 відповідей, залишених у C++)

0xDADA11C7 написав:

Якби я ставив питання подібним чином, то я написав би "використовую файловий менеджер для редагування файлів, і скопіював..." що смішно. Ви не знаєте яким ви компілятором послуговуєтеся, не розумієте як працювати з CMake, а хочете щоб на себе взяв ту роботу Clion, яким ви теж не знаєте як користуватися. Особисто мене влаштовують пакетні файли з параметрами компіляції, а вам все одно доведеться пройти шлях від виклику з командного рядка компілятора до сучасного середовища розробки.

Дуже дякую за допомогу, навіть не знаю щоб без Вас робив.
Ви випадково не працюєте вчителем чи може консультантом, Ваші відповіді і поради дуже цінні, містять 0 корисної інформації.

0xDADA11C7 написав:

Ви не знаєте яким ви компілятором послуговуєтеся, не розумієте як працювати з CMake, а хочете щоб на себе взяв ту роботу Clion, яким ви теж не знаєте як користуватися.

Чи може ви провидець?

2

(3 відповідей, залишених у C++)

Добрий день

Використовую Clion, і скопіював в свій проект папку Box2D і не знаю як додати її до CMakeLists.txt.

Пробував підключтити в мейні:

#include "Box2D/Box2D.h"

Підключається, але отримую помилку: fatal error: Box2D/Common/b2Settings.h: No such file or directory" в файлі Box2D/Box2D.h коли:

#include "Box2D/Common/b2Settings.h

Можна поміняти шлях на

#include "Common/b2Settings.h

Но таким чином мені прийдеться міняти шляхи у всін хейдерах, а їх там не мало :(

Хто знає як додати папку в CMakeLists.txt?
Знаю що можна додати таким чином:

set(SOURCE_FILES main.cpp тут-хейдери-і-спп)

але прийдеться додавати з повними шляхами до них, а файлів там штук 100.


Добавляю зображення дерева.

3

(1 відповідей, залишених у C++)

Привіт. Небуло чим зайнятися сьогодні і вирішив подивитися що цікавого є в новому станарті С++17.
Зустрів такий код:

#include <type_traits>
#include <variant>
#include <algorithm>
#include <string>
#include <array>
#include <iostream>
#include <assert.h>

template<typename ... B>
struct Visitor : B...
{
    template<typename ... T>
    Visitor(T && ... t) : B(std::forward<T>(t))...
    {
    }
    using B::operator()...;
};

template<typename ... T>
Visitor(T...) -> Visitor<std::decay_t<T>...>;

int main(){ 
  
  std::array<std::variant<double,int>, 2> a{3.2, 2};
  int intTotal = 0;
  double doubleTotal = 0.0;
  Visitor visitor{ [&intTotal](const int i){ intTotal += i;},
                  [&doubleTotal](const double d) { doubleTotal += d;}
                 };
      
  std::for_each(begin(a), end(a), 
                [&visitor](const auto& v){std::visit(visitor, v);});
  
  return intTotal;
}

1) Що значить наступний кусок коду:

struct Visitor : B...

який тиg буде мати B?
2) Що це таке?

using B::operator()...;

3) Що за цікавий конструктор.

template<typename ... T>
Visitor(T...) -> Visitor<std::decay_t<T>...>;

4

(5 відповідей, залишених у C++)

Ладно я поняв. Не замітив що при визова функції програма крашеться.
Дякую за коментарі.

5

(5 відповідей, залишених у C++)

Зрозуміло, ну тоді якщо ми зробимо так

ProductCreator prodCreator; 
prodCreator();

чому код компілюється якщо ця функція немає тіла?

Да можна і

ProductCreator()();

тільки я щось не зрузумів навіщо 2 рази ()()?

6

(5 відповідей, залишених у C++)

Добрий день.
Нещодавно розпочав читати книгу Александерску. І там зустрів незрозумілу частину коду в шаблоні:

template
<
class AbstractProduct,
class IndetifierType,
class ProductCreator = AbstractProduct* (*)(),
template<typename, class>
class FactoryErrorPolicy = DefaultFactoryError
>
class Factory;

Якого типу буде ProductCreator?, і шо взагалі це значить (class ProductCreator = AbstractProduct* (*)())?
Настільки я зрозумів

AbstractProduct* (*)()

- це вказівник на функцію без імені, але тоді як його використовувати?

7

(8 відповідей, залишених у Java)

Замінив але навіть після виклику interrupt() isInterrupted() повертає false.
Не можу зрозуміти чому isInterrupted() повертає false а Thread.currentThread.isInterrupted() - true?

В результаті зупинився на цьому:

public void run(){

        while(!Thread.currentThread().isInterrupted()) {
            try {
                printStream.println(exchanger.exchange("ok"));
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();    //  <-- замість break, хоча з break-ом прграма буде працювати бистріше
            }
        }

    }

8

(8 відповідей, залишених у Java)

Да

Знайшов як вирішити проблему але не знаю виглядає це дивно як на мене.

В потоках в методі run() я використовую метод класу Exhanger.exhanger(...), котрий обробляю в try-catch. Цей метод може викликати помилку InterruptedException. І в catch я роблю break;

while(!Thread.currentThread().isInterrupted()) {
            try {
                printStream.println(exchanger.exchange("ok"));
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;                        // <--
            }
        }

Але без цього блоку якщо не обробляти помилку то все працює нормально.

Хотя ні один потік закривається нормально навть без break; а один висить. Пробував два рази викликати shutdownNow() і тоді раз через раз закриваються два.

9

(8 відповідей, залишених у Java)

Щось не працює.

if (Thread.currentThread().isInterrupted())
                break;

Повертає фолс!

10

(8 відповідей, залишених у Java)

Добрий день зіткнувся з проблемою при написанні сервера і клієнта на UDP.

Програма доходить до кінця функції мейн але не завершується.
Використовую 2 потоки ну і головний.

Код:

Мейн

public class Main {
    public static void main(String[] args) {

        final int PORT = 7771;
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Thread thread = null, thread1 = null;
        Exchanger<String> exchanger = new Exchanger<>();
        try {
            executorService.submit(new UDPServer(PORT, exchanger));
            executorService.submit(new MessageHandler(System.out, exchanger));
        } catch (SocketException e) {
            e.printStackTrace();
        }

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

        try {
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress ipAddress = InetAddress.getByName("localhost");

            while(true){
                byte[] sendData = new byte[1024];
                System.out.println("Enter text: ");
                String sentence = inFromUser.readLine();
                if(sentence.equals("quit")) {
                    executorService.shutdown();
                    break;
                }

                sendData = sentence.getBytes();
                DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length, ipAddress, PORT);

                clientSocket.send(datagramPacket);
            }
            clientSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Class UDPServer

public class UDPServer extends Thread {
    private DatagramSocket datagramSocket = null;
    private DatagramPacket datagramPacket = null;
    private byte[] recieveData;
    private Exchanger<String> exchanger;

    UDPServer(int port, Exchanger ex) throws SocketException {
        super();

        datagramSocket = new DatagramSocket(port);
        recieveData = new byte[1024];
        datagramPacket = new DatagramPacket(recieveData, recieveData.length);

        exchanger = ex;
    }

    public void run(){

            try {
                while(true) {
                    datagramSocket.receive(datagramPacket);
                    String sentence = new String(datagramPacket.getData());
                    InetAddress ipAddress = datagramPacket.getAddress();
                    int port = datagramPacket.getPort();

                    exchanger.exchange("{" + ipAddress.toString()
                            + ":" + Integer.toString(port) + "} : " + sentence);
                }
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
            finally {
                close();
            }

    }
    public void close(){
        datagramSocket.close();
    }
}

Class MeessageHandler

public class MessageHandler extends Thread {
    private Exchanger<String> exchanger;
    private PrintStream printStream = null;

    MessageHandler(PrintStream printStream, Exchanger ex){
        exchanger = ex;
        this.printStream = printStream;
    }
    public void run(){

            try {
                while(true) {

                    printStream.println(exchanger.exchange("ok"));
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

    }
}

11

(10 відповідей, залишених у Java)

Дякую.  А я думав це щось повязано з тестами :)

12

(10 відповідей, залишених у Java)

Main

public class Main {

    public static void main(String[] args) {

        SalePoint salePoint = new SalePoint();

        Stack<String> inputArguments = new Stack<String>();
        inputArguments.push("0000000001");
        inputArguments.push("0000000002");
        inputArguments.push("0000000003");
        inputArguments.push("");
        inputArguments.push("exit");

        while(!inputArguments.isEmpty()){
            salePoint.getCodesScanner().write(inputArguments.pop());
        }

        salePoint.run();

    }
}

SalePoint,java

public class SalePoint {
    private InputDevice codesScanner = new CodesScanner();
    private OutputDevice lcdDisplay = new LCDDisplay();
    private OutputDevice printer = new Printer();

    private List<Product> products = new ArrayList<Product>();

    public SalePoint(){
        Inventory.buildInventory();
    }

    public InputDevice getCodesScanner() {
        return codesScanner;
    }

    public List<Product> getProducts() {
        return products;
    }

        public void run() {
        Product product;
        String barCode;
        while((barCode = codesScanner.read()) != null) {
            switch (barCode) {
                case "":
                    lcdDisplay.printError("Invalid bar-code");
                    break;
                case "exit":
                    printProductsAndTotalPrice();
                    return;
                default:
                    product = Inventory.getProduct(barCode);
                     if (product == null) {
                         lcdDisplay.printError("Product not found");
                     }else {
                         lcdDisplay.print(product);
                         products.add(product);
                     }
            }
        }

    }

    private void printProductsAndTotalPrice() {
        double summ = 0.0;

        for (Product product :
                products)
            summ += product.getPrice();

        lcdDisplay.println("Total:\t\t\t" + summ);
        printer.println("List of products:");
        printer.println("Name\t\t\tPrice");
        printer.print(products);
        printer.println("Total:\t\t\t" + summ);

        products.clear();
    }
}

Весь код я думаю немає смисла кидати.

13

(10 відповідей, залишених у Java)

Добрий день

Не підскажите що таке – mock/stub the database and IO devices.
І як його реалізувати?


Завдання: Implement a simple point of sale.
Assume you have:
– one input device: bar codes scanner
– two output devices: LCD display and printer
Implement:
– single product sale: products bar code is scanned and:
– if the product is found in products database than it's name and price is printed on LCD
– if the product is not found than error message 'Product not found' is printed on LCD
– if the code scanned is empty than error message 'Invalid bar-code' is printed on LCD
– when 'exit' is input than receipt is printed on printer containing a list of all previously scanned items names and prices as well as total sum to be paid for all items; the total sum is also printed on LCD display
Rules:
– use only SDK classes and your favorite test libraries
– mock/stub the database and IO devices
– concentrate on proper design and clean code, rather than supplying fully functioning application

14

(2 відповідей, залишених у Java)

Добрий день

Отримав невеликве завдання по Джаві, раніше програмував тільки на С++.
Потрібен погляд зі сторони. Мені здається що виглядає програма не дуже ну зі сторони ОПП.
Можете прокоментувати.

Завдання: Implement a simple point of sale.

Assume you have:
– one input device: bar codes scanner
– two output devices: LCD display and printer

Implement:
– single product sale: products bar code is scanned and:
– if the product is found in products database than it's name and price is printed on LCD
– if the product is not found than error message 'Product not found' is printed on LCD
– if the code scanned is empty than error message 'Invalid bar-code' is printed on LCD
– when 'exit' is input than receipt is printed on printer containing a list of all previously scanned items names and prices as well as total sum to be paid for all items; the total sum is also printed on LCD display

Rules:
– use only SDK classes and your favorite test libraries
– mock/stub the database and IO devices
– concentrate on proper design and clean code, rather than supplying fully functioning application

Реалізація:
Клас SalePoint

public class SalePoint {
    private InputDevice codesScanner = new CodesScanner();
    private DBWorker dbWorker = null;
    private OutputDevice lcdDisplay = new LCDDisplay();
    private OutputDevice printer = new Printer();

    private List<Product> list = new ArrayList<Product>();

    public SalePoint(){
        try {
            dbWorker = new DBWorker();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void setDefaultBarCodes(){
        codesScanner.write("exit");
        codesScanner.write("");
        codesScanner.write("0000000001");
        codesScanner.write("0000000002");
    }


    public void run() {
        try {
            Product product = null;
            while(codesScanner.hasNext()) {
                String barCode = codesScanner.readLine();

                switch (barCode) {
                    case "":
                        lcdDisplay.printError("Product not found");
                        break;
                    case "exit":
                        printer.println("Printer: ");
                        printProducts();
                        return;
                    default:
                        product = dbWorker.findProduct(barCode);

                        if (product == null) {
                            lcdDisplay.printError("Invalid bar-code");
                        }

                        lcdDisplay.print(product);
                        list.add(product);
                }
            }

        } catch (EmptyStackException e) {
            e.printStackTrace();
        }
    }

    private void printProducts() {
        double summ = 0.0;

        for (Product product :
                list) {
            summ += product.getPrice();
        }

        ((Printer)printer).printProductsAndTotalPrice(list, summ);

    }
}

Class InputDevice

public class InputDevice {
    private Stack<String> buffer = new Stack<>();

    public void write(String message){
        buffer.push(message);
    }

    public String readLine(){
        if(buffer.isEmpty())
            return null;
        return buffer.pop();
    }

    public void clear(){
        buffer.clear();
    }

    public boolean hasNext(){
        return !buffer.isEmpty();
    }
}

Class CodesScaner

public class CodesScanner extends InputDevice{

    public CodesScanner() {
        super();
    }
// Не знаю який метод додати. 

}

Class OutputDevice

public class OutputDevice {
    void println(String message){
        System.out.println(message);
    }
    void print(String message){
        System.out.print(message);
    }
    void printError(String message){
        System.out.println("Error: " + message);
    }
    void print(Product product){
        System.out.println(product);
    }
}

Class Printer

public class Printer extends OutputDevice {
    public Printer() {
        super();
    }

    public void printProducts(List<Product> productList){
        System.out.println("List of products:");
        for (Product product:
             productList) {
            System.out.println(product.getName() + "\t\t\t" + product.getPrice());
        }
    }

    public void printProductsAndTotalPrice(List<Product> productList, double totalPrice){
        System.out.println("List of products:\nName\t\t\tPrice");
        for (Product product:
                productList) {
            System.out.println(product.getName() + "\t\t\t" + product.getPrice());
        }
        System.out.println("Total:\t\t\t" + totalPrice);
    }

}

Class LCDDisplay

public class LCDDisplay extends OutputDevice {
    public LCDDisplay() {
    }

    public void print(Product product){
        System.out.println(product.getName() + "\t\t" + product.getPrice());
    }

}

Class DBWorker

public class DBWorker {
    private static String URL = "jdbc:mysql://localhost:3306/mydbtest";
    private static String USERNAME = "root";
    private static String PASSWORD = "root";
    private static String SELECT = "SELECT product_name, price, bar_code FROM products WHERE bar_code = ?;";

    private Connection connection;

    public DBWorker() throws SQLException {
        Driver driver = new FabricMySQLDriver();
        DriverManager.registerDriver(driver);

        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    public Product findProduct(String barCode) {
        Product product = null;

        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(SELECT);

            preparedStatement.setString(1, barCode);

            ResultSet resultSet = preparedStatement.executeQuery();

            if(resultSet.next())
                product = new Product(resultSet.getString("product_name"), resultSet.getInt("price"), resultSet.getString("bar_code"));

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return product;
    }
}

main

public class Main {
    public static void main(String[] args) {
        SalePoint salePoint = new SalePoint();

        salePoint.setDefaultBarCodes();
        salePoint.run();

    }
}

Як на ваш погляд моя реалізація?

І не підскажите як зробити тести? Juint i Mockito

Тільки один зробив але не розумію навіщо він - бесполезний.

public class DBTest {
    private static final Product PRODUCT = new Product("beer", 2.3, "0000000001");
    private static final String BAR_CODE = "0000000001";

    @Mock
    SalePoint salePoint;

    @Test
    public void testFindProduct(){
        DBWorker dbWorker = mock(DBWorker.class);

        when(dbWorker.findProduct(BAR_CODE)).thenReturn(new Product("beer", 2.3, "0000000001"));

        Product product = dbWorker.findProduct(BAR_CODE);

        Assert.assertEquals(product, PRODUCT);
    }
}

Курсова така попалася.

Не могли б розповісти про малювання графіки, що можна використати?

Добрий день

Не підскажите як можна створити крос-платформовий інструментарій розробки програмного забезпечення спрощену версію звичайно. Щось подібне до QT і тд.

Але не цілу IDE а тільки бібліотеку.

Мене в основному цікавить як відображати кнопки і інші обєкти на екрані? Як їх малювати?

Буду радий почути поради може хтось пробував написати щось подібне.

17

(15 відповідей, залишених у C++)

Останнє питаннячко можна?

Ви з допомогою чого пишите віконні програми?

18

(15 відповідей, залишених у C++)

Я протупив там все працює

19

(15 відповідей, залишених у C++)

Та ні всe норм.

Тільки з масивчиком невеличка проблемка:
initializer-string for array of chars is too long [-fpermissive]
const char symbols[countEl+1] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJ"

Я думав що рядок може бути доввільної довжини?

20

(15 відповідей, залишених у C++)

Створю масив напевно в окремій функції.