Inlägg

Inlägg som heretic16 har skrivit i forumet
Av heretic16
Skrivet av Elgot:

Testa att aktivera Address Sanitizer.

Denna fungerar riktigt bra!
Den känner verkligen av om man överindexerar en pekararray eller glömmer frigöra minnet.

Superenkelt om man kör MSBuild i C. Tackar.

P.S skrev 1000 rader C kod för arrayer. Inte ett enda fel på första försöket!

Av heretic16

Kolla om man överindexerar arrayer i C - Vilken mjukvara?

Jag behöver ett program som kör en .c fil och programmet ska avgöra om jag överindexerar arrayerna i .c filen.
Arrayerna är dynamiskt allokerade från minnet.

Har ni något förslag på program? Jag har tillgång till Visual Studio Community 2022.

Av heretic16
Skrivet av Elgot:

Har du testat alla knepiga fall? Om man läser en liten mängd data från en port som skickar data går det kanske så fort att det inte är ett praktiskt problem, men vad händer om du försöker läsa mycket (1 MB till exempel)?

Meddelandet hamnar på samma ställe som i det synkrona fallet, men inte innan operationen faktiskt är klar. Snyggast är att hantera det med funktionen som skickas med anropet, men man kan också vänta tills inget finns kvar att göra (och run() returnerar).

Fungerar koden i mitt förra inlägg?

Jag ska testa din kod snart. Återkommer.

Av heretic16

@Elgot

Men jag har testat använda boost::asio::async_read och denna resulterarde väldigt dåligt. Jag vet inte varför min boost::asio::read fungerar riktigt bra och verkar inte alls blockera. Jag känner att något är skumt här.

Problemet är att jag får inte boost::asio::async_read att fungera som det är tänkt. Det kanske är så att async_read bevarar inte meddelandet?

Av heretic16
Skrivet av Elgot:

Ja, async-funktionerna kräver att någon kör run på det aktuella io_context-objektet. Detta kan, som ovan, ske i en annan tråd men om du inte vill blockera vill du typiskt ha en fristående global tråd som bara kör run(). Du kan skapa den innan du anropar dina funktioner, men man kan behöva hantera att run returnerar om det inte finns någon uppgift kvar att utföra. För att undvika det kan man skapa en work guard:

auto work_guard = boost::asio::make_work_guard(io);

Din lösning läser, men den är blockerande och tidsgränsen fungerar väl inte (reset är för asynkrona anrop)?

Jo. Det är just som den gör. Jag tycker Boost Asio är bra. Den har löst problemet för mig, utan att jag ens förstår lösningen. Vilket jag tycker är tragiskt.

Hade Boost Asio tagit bort lite onödiga saker så som io_context och io.run() osv. Då hade det blivit mycket enklare. Men det kanske finns ett behov utav sådant. Boost Asio är som sagt plattformsobereonde, vilket är bra.

Av heretic16

Här är min senaste kod. Tyvärr så läser den inget. Kan det ha med att man måste starta något?

int32_t read(const char port[], uint8_t data[], const uint16_t size, const int32_t timeout_ms) { int32_t bytesRead = 0; if (CDCDeviceExist(port)) { // Get the USB auto deviceUSB = devicesCDC.at(port); int_least64_t tick = Tools_Software_Algorithms_getMilliSeconds(); const int_least64_t endTick = tick + timeout_ms; while (tick <= endTick) { boost::asio::async_read(*deviceUSB, boost::asio::buffer(data, size), [&](const boost::system::error_code& error, std::size_t bytes_transferred) { auto status = error; if (!error.failed()) { bytesRead += bytes_transferred; } }); tick = Tools_Software_Algorithms_getMilliSeconds(); } } return bytesRead; }

Edit:

Denna kod fungerar!

int32_t read(const char port[], uint8_t data[], const uint16_t size, const int32_t timeout_ms) { int32_t bytesRead = 0; if (CDCDeviceExist(port)) { // Get the USB auto deviceUSB = devicesCDC.at(port); // Important stuffs boost::asio::io_context io_context; boost::asio::deadline_timer timer(io_context); boost::system::error_code ec; // Create dead line timer timer.expires_from_now(boost::posix_time::milliseconds(timeout_ms)); timer.async_wait([&](const boost::system::error_code& error) { if (!error) { // If time out occurs ec = boost::asio::error::operation_aborted; deviceUSB->cancel(); } }); // Start the thread std::thread io_thread([&]() { io_context.run(); }); // Read with error code bytesRead = boost::asio::read(*deviceUSB, boost::asio::buffer(data, size), ec); // Cancle the timer and wait for the io_context to join timer.cancel(); if (io_thread.joinable()) { io_thread.join(); } } return bytesRead; }

Av heretic16
Skrivet av ajn:

I Linux är det bara att öppna och läsa från tty devicen, som vilken annan fil som helst, behövs inga special bibliotek. Men du kanske kör Windows?

Jag kör Windows 11 och Lubuntu Linux. Men när jag skriver C++ kod så vill jag att dom ska passa båda. Write Once - Compile everywhere

Jag har hittat ett exempel
https://beta.boost.org/doc/libs/1_52_0/doc/html/boost_asio/re...

void handler( const boost::system::error_code& error, // Result of operation. std::size_t bytes_transferred // Number of bytes copied into the // buffers. If an error occurred, // this will be the number of // bytes successfully transferred // prior to the error. ); boost::asio::async_read(s, boost::asio::buffer(data, size), handler);

Med lite lambda-uttryck så kan man skriva

boost::asio::async_read(s, boost::asio::buffer(data, size), [&](const boost::system::error_code& error, std::size_t bytes_transferred){ denna kod körs när jag boost asio läser. });

Men då är ett problem! Time out! Viktigt!
Eller tror ni man kan köra egen timout? Typ en while loop.

Av heretic16
Skrivet av Elgot:

Har du ett globalt io-objekt? Det borde inte sluta funger…

Asio är ett komplext bibliotek och är kanske lite overkill för detta ändamål om man inte kör boost i övrigt. Tittade du på detta:
https://github.com/wjwwood/serial
Det ser enkelt ut.

Tackar.
Det jag har behov utav är någon typ av läsning som kan läsa och acceptera det den får.
Det ska inte vara blockerande.

Men ändå så borde Boost Asio fungera. Finns det inget färdigt exempel för Boost Asio? Jag har försökt hitta något, men har bara hitta blockerande läsning.

Av heretic16

Jag testade att införa ditt. Men nu verkar inte något fungera.
Finns det inge bättre bibliotek än boost asio? Jag menar, biblioteket verkar vara skrivet som en kratta.

Av heretic16

Boost Asio för seriell kommunikation - Kan man optimera detta kodexempel? C++

Jag använder Boost Asio för att kommunicera via USB uttaget. Orsaken varför jag använder Boost Asio har med att libusb kan inte enumerera korrekt port t.ex. COM1, COM2, COM3. Istället får man VendorID. Exempel: https://stackoverflow.com/questions/14722083/how-to-use-libus...

Som jag uppfattar detta så använder Boost Asio själva operativsystemets egna USB-bibliotek för att kommunicera. Medan libusb kommunicerar direkt till hårdvaran, därav snabbare, men man får inte med alla fina saker som Boost Asio erbjuder t.ex. buffer och enummerering av enheter.

Det jag har gjort är att jag har skrivit en läsfunktion och en skrivfunktion. Det jag tänkte fråga er är om det finns potential att kunna optimera denna kod? Så vad tror ni? Går det göra koden snabbare igenom att slippa använda trådar? Koden är klippt från en .cpp fil, därav försvann åäö.

Skrivfunktion:

static boost::asio::io_context io; static std::map<std::string, std::shared_ptr<boost::asio::serial_port>> devicesCDC; static bool existerarPorten(const char port[]) { return devicesCDC.find(port) != devicesCDC.end() ? true : false; } int32_t write(const char port[], const uint8_t data[], const uint16_t size, const int32_t timeout_ms) { int32_t writtenBytes = 0; if (existerarPorten(port)) { // Get the USB auto deviceUSB = devicesCDC.at(port); // Skapa en io_context och deadline_timer boost::asio::io_context io; boost::asio::deadline_timer timer(io); boost::system::error_code ec; // Starta deadline timer timer.expires_from_now(boost::posix_time::milliseconds(timeout_ms)); timer.async_wait([&](const boost::system::error_code& error) { if (!error) { // Om timeout intr ffar, st ng seriellporten ec = boost::asio::error::operation_aborted; deviceUSB->cancel(); } }); // Starta en separat tr d f r att k ra io_context std::thread io_thread([&]() { io.run(); }); // Utför skrivoperationen writtenBytes = boost::asio::write(*deviceUSB, boost::asio::buffer(data, size), ec); // Avbryt timern och v nta p io_context-tr den timer.cancel(); if (io_thread.joinable()) { io_thread.join(); } // Kontrollera fel if (ec) { if (ec == boost::asio::error::operation_aborted) { std::cerr << "CDC.cpp: Timeout intr ffade under skrivning till port: " << port << std::endl; return -1; // Returnera felkod f r timeout } std::cerr << "CDC.cpp: Fel vid skrivning: " << ec.message() << std::endl; return -1; } } return writtenBytes; }

Läsfunktion:

int32_t read(const char port[], uint8_t data[], const uint16_t size, const int32_t timeout_ms) { int32_t bytesRead = 0; if (existerarPorten(port)) { // Get the USB auto deviceUSB = devicesCDC.at(port); // Skapa en io_context och deadline_timer boost::asio::io_context io; boost::asio::deadline_timer timer(io); boost::system::error_code ec; // Starta deadline timer timer.expires_from_now(boost::posix_time::milliseconds(timeout_ms)); timer.async_wait([&](const boost::system::error_code& error) { if (!error) { // Om timeout intr ffar, st ng seriellporten ec = boost::asio::error::operation_aborted; deviceUSB->cancel(); } }); // Starta en separat tr d f r att k ra io_context std::thread io_thread([&]() { io.run(); }); // Utför operationen bytesRead = boost::asio::read(*deviceUSB, boost::asio::buffer(data, size), ec); // Avbryt timern och v nta p io_context-tr den timer.cancel(); if (io_thread.joinable()) { io_thread.join(); } // Kontrollera fel if (ec) { if (ec == boost::asio::error::operation_aborted) { std::cerr << "CDC.cpp: Timeout intr ffade under l sning fr n port: " << port << std::endl; return -1; // Returnera felkod f r timeout } std::cerr << "CDC.cpp: Fel vid l sning: " << ec.message() << std::endl; return -1; } } return bytesRead; }

Av heretic16

Uppenbarligen så verkar det vara ett känt problem med OpenCV för Vcpkg.
Så om jag installerar OpenCV manuellt.

Då går jag till https://opencv.org/releases/ och laddar ned kompilerade för Windows. Där efter så kopierar jag in hela buildmappen, som finns i det man laddar ned från OpenCV. Jag placerar buildmappen i mitt projekt och sedan länkar jag till följande headers och .lib.

Additional includes: C:\Users\<USER>\Documents\GitHub\GoobySoft\GoobySoft\Tools\Software\Libraries\OpenCV\windows\include Additional libraries: C:\Users\<USER>\Documents\GitHub\GoobySoft\GoobySoft\Tools\Software\Libraries\OpenCV\windows\x64\vc16\lib

Men jag får fortfarande LINK2019 problem att den hittar inte .lib filerna....Ska det verkligen vara så svårt att installera OpenCV?

Av heretic16

Hur installerar man OpenCV via Vcpkg?

Jag har installerat OpenCV via Vcpkg.

vcpkg install opencv

Då fick jag löjande

opencv4:x64-windows 4.10.0#1 computer vision library opencv4[calib3d]:x64-windows calib3d module opencv4[default-features]:x64-windows Platform-dependent default features opencv4[dnn]:x64-windows Enable dnn module opencv4[dshow]:x64-windows Enable DirectShow opencv4[fs]:x64-windows Enable filesystem support opencv4[gapi]:x64-windows Enable gapi module opencv4[highgui]:x64-windows highgui module opencv4[intrinsics]:x64-windows Enable intrinsics opencv4[jpeg]:x64-windows JPEG support for opencv opencv4[png]:x64-windows PNG support for opencv opencv4[quirc]:x64-windows Enable QR code module opencv4[thread]:x64-windows Enable thread support opencv4[tiff]:x64-windows TIFF support for opencv opencv4[webp]:x64-windows WebP support for opencv opencv4[win32ui]:x64-windows Enable win32ui opencv:x64-windows 4.10.0 computer vision library opencv[default-features]:x64-windows Platform-dependent default features

Men när jag inkluderar

#include <opencv4/opencv2/core.hpp>

Då får jag ett problem med följande

cv::VideoCapture cap;

Det den säger är att namespace cv har ingen medlem VideoCapture.
Tittar jag i core.hpp så kan jag se att min IDE kan inte hitta dessa header-filer. Den säger "cannot find source file ...." och sedan namn på .h filen och .hpp filen.

#ifndef OPENCV_CORE_HPP #define OPENCV_CORE_HPP #ifndef __cplusplus # error core.hpp header must be compiled as C++ #endif #include "opencv2/core/cvdef.h" #include "opencv2/core/base.hpp" #include "opencv2/core/cvstd.hpp" #include "opencv2/core/traits.hpp" #include "opencv2/core/matx.hpp" #include "opencv2/core/types.hpp" #include "opencv2/core/mat.hpp" #include "opencv2/core/persistence.hpp" /** @defgroup core Core functionality @{

Fråga:
Notera att jag använder <> när jag inkluderar headerfilerna från OpenCV version 4. Men hos dessa headerfiler så inkluderar dom med "", vilket betyder intern inkludering. Tydligen så finns dessa filer i min sökväg

C:\....\GitHub\vcpkg\installed\x64-windows\include\opencv4\opencv2

Men varför känner min Visual Studio 2022 IDE inte utav dessa OpenCV filer? Jag har ju installerat Vcpkg och Vcpkg fungerar utmärkt för t.ex. ImGui eller Boost för C++.

Av heretic16
Skrivet av Yoshman:

Rent krasst har faktiskt inte Rust någon konkurrent i det som är dess huvudsakliga "killer-feature". C++ kan bli en möjlig konkurrent längre fram om förslaget till "safe-C++" accepteras av ISO C++ och man skriver om all sin C++ kod från scratch inom ramen för "safe-C++" (som väldigt mycket ser ut som Rust, fast med lite mer svårläst syntax i.m.h.o).

Idag tycker jag att om man använder vektorer och smarta pekare, så gör man språket minnessäkert.

Citat:

Han som verkar styra Carbon, Chandler Carruth, är riktigt skarp. Så det bådar ju gått.
Men vet inte om du är medveten om vad de själva anser status för Carbon är ju nu, man befinner sig i förstudiefas där man i första hand vill ha svar på: finns det ens ett tillräckligt stort värde i något som Carbon för att gå till en v1.0?

Man hoppas kunna ha det svaret inom kanske 2 år.

Jag tror hellre Carbon kommer ersätta Rust. Google har betydligt större ekonomiska muskler än vad Mozilla har.
Jag tycker Carbon har renare syntax än Rust. Syntaxen från Rust är rent av hemsk. Hur tänkte utvecklare där? Kanske inte.
Men som sagt så kommer jag hålla mig kvar vid C++ för att jag litar på att utvecklarna av C++ kommer hitta på ett sätt som gör C++ helt oslagbart. Det är redan oslagbart idag också.

Idag tycker jag C++ är så enormt högnivå att det liknar Java. Jag tänker aldrig på frigöra minnet längre. Jag använder bara vektorer och smarta pekare. Sedan tänker jag inget mer på dom.

Citat:

Det DARPA kommer göra i vad de kallar project tractor är att börja med att maskinöversatta all C och C++ kod m.h.a. av en LLM.

Tänkte först att "det låter helt galet", men efter att testat att översätta ett relativt litet och avgränsat C++ projekt så tror jag det faktiskt kan fungera riktigt bra.

Projektet i fråga i mitt fall var lösningarna på alla 25 dagar av Advent of Code 2018, som jag passade på att skriva och köra på ett RTOS där jag varit med också utvecklat C++11/14/17 standardbiblioteket till. Blev rejält överraskad (osäker om man ska vara positiv för det fantastiska resultatet, eller skrämd över hur bra det var...) hur läsbar och trevlig resultatet var.

Detta låter galet. Litar inte på dom för 5 öre. Bara namnet "tractor" låter oseriöst. Vad är dom? 8 år i sinnet?

C, C++ och Rust har en särställningen bland alla någorlunda populära språk: endast dessa 3 är kompilerade språk, utan GC där "zero-cost abstractions" är en av grundfinesserna.

Citat:

För många use-case finns självklart även fler alternativ. Och i de lägena andra alternativ faktiskt fungerar ska man nog ställa sig frågan varför man skulle välja något av dessa 3 (ett fullt rationellt svar är: vi kan detta språk redan och är bra på det).

Flera av tech-jättarna, t.ex. Microsoft och Google, använder idag Rust. Faktum är att de har en policy att föredra Rust över C++ där möjligt.

Microsoft har sagt att dom ska använda Rust för varje nytt projekt som ej använder GC.
Men detta kommer dom få äta upp. Hela programmeringsvärlden bygger på en ung generation som leder utvecklingen. Denna typ av unga generation vill aldrig ens hålla på med gamla saker, utan bara nya teknologier med svart skärm och tjockt tangentbord.

Men som sagt, Rust är bara tillfälligt. Googles Carbon är nog framtiden. Om inte Microsoft hittar på något nytt och tvingar arbetsmarknaden att följa språket.

Citat:

Även om jag använt Rust mer "privat" än i jobbet har jag jobbat (i att: fått betalt för det jag skriver) med Rust hos två olika företag. Rust är på snabb uppgång inom bl.a. embedded.

Jobbar med embedded, aldrig sett Rust och kommer aldrig se det heller. Det är bara C som gäller, eller något mystiskt språk så som pascal. I vissa fall kan det vara C++, men då ska det vara dyra system också. En gång fick jag koda i Java SE. Det var skönt. Superenkelt. Det var för IoT.

Citat:

Både C++ och Rust är väldigt komplexa språk med rätt höga trösklar. Gissar att det är en personlig preferens vilket man tycker är lättast. Har själv ändå långt mer C++ erfarenhet, men skulle ändå hävda att Rust är enklare om man menar "tillräcklig delmängd för att kunna skriva vettig kod".

Och kolla slutkämmen i denna intervju. På frågan "För någon som precis börjar lära sig systemprogrammering, vilket språk skulle du rekommendera som första språk".

Jag tycker inte C++ har höga trösklar. Faktiskt så kör jag C liknande C++, där jag använder klasser vid behov. Men vektorer använder jag alltid i C++. Men annars så är det vanlig C programmering. Problemet med Rust är att språket har hämtat sin syntax från döende språk från 60-70-talet. Helt horribelt hur man kunde tänka så.

Nybörjarspråk: Python, helt klart. Där behöver man aldrig tänka.

Citat:

Båda svarar Rust. Tänkt då på att Herb Sutter inte är "vem som helst" inom C++ världen, han är ordförande i C++ ISO-kommitté.
Om man bryr sig om säkerhet (eng. safety) överhuvudtaget så är Rust objektivt ett långt bättre val.

Dom har helt fel. Att Rust ska vara bästa språket för nybörjade att lära sig. Beror på om man vill ha det svårt från början.
Egentligen föredrar jag Python för nybörjare. Där efter kan man gå till C och bygga sin kunskap mot C++ och högre nivå så som Java och C#.

Citat:

Safe-C++ är ett försöka att minska det gapet rejält, men "problemet" med Safe-C++ är att det ser mer ut som Rust med C++ syntax är modern C++. Gissar att just det är vad som får t.ex. Bjarne att vara lite skeptisk mot Safe-C++.

Jag har inget emot att man tvingar C++ programmerare att använda senaste standarden som visar vägen till kod där...ja, vad det nu heter, tar över minneshanteringen. Smarta pekare är helt enkelt guld i C++.

Citat:

Det är tyvärr den erfarenhet jag också fick av att leta Modbus-bibliotek. Många har bara implementerat en delmängd och det nästan alla startar med är client-TCP, sedan server-TCP och många stannade där.

Jag skriver eget bibliotek för Modbus i C++ som använder Boost Asio Enklast så.

Av heretic16
Skrivet av Yoshman:

Om man gillar något ska man självklart fortsätta använda det. C++ är så pass viktigt än att det kommer utvecklas och finnas kvar under mycket långt tid framåt.

Jag tror däremot Rust kommer inte vara lika populärt i framtiden som det är idag.
Orsaken har med att Rust har för många konkurrenter - Zig och Carbon. Kanske det kommer ett nytt hippespråk som lovar guld och gröna skogar?

Carbon tror jag faktiskt på. Språket stöds av Google! Nej, jag kommer inte lära mig Carbon. C++ är ett 10 års projekt.

Citat:

Tror i.o.f.s. en den av det där som bäst åsikter framförda av enskilda personer. Som det sista, givet att organisationer som Microsoft, Google och administrationen runt vita huset säger att Rust i nuläget är det som gäller i fall där en GC inte fungerar lär det språket ha en rätt säkrad framtid.

Vänta bara tills Carbon lanseras. Då kommer Rust tolkas som "omodernt" och "krånglig" av ny generation av programmerare.
Jag har varit med svängarna och det finns alltid en skara utvecklare som ständigt jagar efter senaste och nyaste språket att lära sig. Sedan finns det gamla rävar som jag som kör C och C++ vid behov.

Citat:

Ska bli riktigt spännande att följa det totala rewrite som DARPA ska göra av all deras C och C++ kod i Rust. Det är åtskilliga tiotals miljoner rader kod som man ska skriva om, det just för att de mest vanliga buggarna i C och C++ program inte ens kompilerar i Rust (en siffra som ofta nämns är att Rust tar 2/3 av alla C och C++ buggar vid kompilering, så blir inte buggfritt...).

Du menar att man kan enkelt skriva om C och C++ till Rust? Till vilken läsbar kvalité då? Vad händer om det blir fel så det måste bli manuell handpåläggning för att koden skall kunna kompileras i Rust?

Citat:

Och tar man Java så slog självklart inte det ut C++ från allt. Men när jag började mitt arbetsliv i mitten av 90-talet var det väldigt mycket där det var självklart att använda C++, men som "ingen" idag ens skulle fundera använda C++ till utan det är främst Java, C# och eventuellt JS eller Python.

Java är fint. Mysigt språk där allt bara fungerar. Synd att man måste ha JRE installerat.

Citat:

Språket D är ju ett exempel på en lång rad språk som aldrig fått någon större popularitet. Haraldrig skrivit D, läst lite om det men aldrig riktigt förstått vad som skulle göra det värt att gå dit jämfört med alla andra alternativ som finns.

D togs fram för att den skulle ersätta C++. Så gjorde man med Java också. Utvecklarna bakom Java skrev att målet var ett "bättre C++", utan massa krångel. Men man fick lägga språket på en väldigt hög nivå för att lyckas.

Citat:

Zig har inte ens nått någon version 1.0, så det kan mycket väl bli ett av många språk som aldrig blir något. Och om något ska kallas "en modern version av C" skulle jag utnämna Zig till det, både till hur svårt det verkar vara att lära sig och till vad dess designers ser som Zigs huvudområden. Så ingen direkt konkurrent med C++.

Jag tror inte på Zig. Låter som ett hippiespråk från en ung generation i USA. Språket dör bort när Carbon lanseras.

Citat:

Carbon är om något allt annat än en C++ killer. Dess huvudsyfte är ju att försöka fortsätta göra C++ relevant, frågan är om det är rätt sätt eller om andra idéer som t.ex. det förslag till "safe C++" är bättre. Verkar i.of.s. som Bjarne och en del andra inte riktigt gillar "safe C++" (som kommer pushas som ett ISO C++ förslag). Inte helt med på varför, men helt klart ser "safe C++" mer ut som Rust än som "vanlig" C++, och då kan man väl lika gärna använda Rust...

Finns på deras GitHub så skriver Carbon att denna ska ersätta C++.

Citat:

Det närmaste vi idag har en "C++ dödare" är väl just Rust. Är som sagt flera stora organisationer som i praktiken säger att nya projekt inte får använda C++, använd Rust om GC inte är OK annars finns flertalet språk att välja på.

Rust är inte bara den enda "C++ dödare". Det finns många språk som jag nämnde. Men problemet är att det är svårt att ersätta C++ om det är ett ständigt utvecklande språk och är idag, enligt min mening, väldigt säkert att programmera i.

Här är ett ytterligare nytt språk.....som ska konkurrera mot Rust. Men åter igen, det skapas massvis med språk som ska ersätta andra språk. Val är säkert ett dåligt språk dessutom. De flesta språk idag är dåliga.
https://www.youtube.com/watch?v=xLouek82-5g

Citat:

Men gissar att det blir rätt likt som för Java/C# runt millennieskiftet. Vissa saker som idag primärt görs i C++ kommer framåt primärt göras i Rust, men C++ kommer ändå leva kvar på många områden. Givet vad du jobbar med verkar ändå Rust snabbt bli populärt för mikrokontrollers, då en variant som kallas "no-std Rust" (som väldigt mycket känns som en direkt konkurrent mot Zig, vilket ger Zig rätt stor uppförsbacke).

Aldrig sett Rust på arbetsmarknaden. Det enda jag har sett Rust finnas är på hobbyprojekt på GitHub. Arbetsmarknaden är ofta C#, C++, Java, PHP, Python, JavaScript. Ja...sedan var listan slut.

Citat:

Men Rust lär inte nå någon värdsdominas. Det är inte lika komplext att lära sig som C++, men det är tyvärr en av de mer komplexa språken och förstår varför många känner frustration och "ger upp" med det språket. Kan mycket väl tänka mig använda Rust framåt om behoven kräver icke-GC-språk, men föredrar Go eller C# (och vilket av dessa beror på use-case) om möjligt.

Rust är svårare än C++. Tro mig.
Hade Rust varit smart så hade dom kopierat 100% av C++ syntaxen, men bara kallat den för Rust och implementera sin minnessäkerhet. Klart! Inga problem. Folk hade inte märkt någon skillnad.

Citat:

Såg en del Modbus-bibliotek baserade på boost::asio, t.ex.
https://github.com/fizyr/modbus
https://github.com/ChrisBFX/mothbus

Men de verkar inte sett någon aktivitet på rätt länge och Modbus är ett rätt smalt use-case, så man får nog räkna med att projekt likt de ovan kanske löser mycket mer än det omedelbara problem deras skapare hade.

Just ja. Dessa är Modbus TCP. Behöver RTU
Men skadar inte att man skriver eget Modbus. Finns ju något bibliotek man kan sno och skriva om.

Av heretic16

Hur tycker ni att man ska skriva ett bibliotek i OOP? Språket är C++

wxWidgets som jag använder, har olika bibliotek tillgängliga ute på SourceForge och GitHub...men enligt mig känns dom mest dåligt skriva. Exempelvis wxMathPlot med sina 4000 rader spagettikod...känns inte lockande.

Så jag tänkte skapa eget bibliotek! Men jag vill diskutera strukturen på den.
Mitt mål är att om jag har en sådan klass.

#pragma once #include <string> #include <vector> // Here the plot type enumeration must be placed typedef enum { WXPLOT_TYPE_LINE_PLOT, }WXPLOT_TYPE; // This class is the general class for all types of plots class wxPlot { private: // General plot information unsigned int plotWidth; unsigned int plotHeight; unsigned int fontSize; std::string title; std::string xLabel; std::string yLabel; std::vector<std::string> legend; // Flags bool gridOn; bool legendOn; bool xLabelOn; bool yLabelOn; bool titleOn; public: // Constructor wxPlot(WXPLOT_TYPE wxPlotType, unsigned int plotWidth = 100, unsigned int plotHeight = 100); // Deconstructor ~wxPlot(); // General functions void setPlotWidth(unsigned int plotWidth); void setPlotHeight(unsigned int plotHeight); void setFontSize(unsigned int fontSize); void setGridOn(bool gridOn); void setLegendOn(bool legendOn); void setXLabelOn(bool xLabelOn); void setYLabelOn(bool yLabelOn); void setTitleOn(bool titleOn); void setTitle(std::string& title); void setXlabel(std::string& xLabel); void setYlabel(std::string& yLabel); void setLegend(std::vector<std::string>& legend); // This function must be called to draw the plot void drawNow(); };

När jag anropar konstruktören wxPlot så ska jag bestämma vad för typ av plot t.ex line eller bar eller annat.
Frågeställning:

Min tanke är att jag ska använda enumereringen för styra vilken plottyp det ska vara.
Ska jag använda mig av polyformism här? Eller tycker ni att jag ska använda mig av funktionspekare eller liknande för att sätta adresser till fält-funktioner som man sedan anropar?

Men vi säger om det är olika funktioner på bar och line då för att sätta data?

Kanske man ska använda sig av templates här?
Beroende på vilken typ av klass man sätter, så kommer datan att tolkas annolunda beroende på plottyp.
Om man har en line-plot så kommer första dataraden tolkas som X-axel, andra dataraden kommer tolkas som Y-axel.
Men är det bar-plot, då kommer varje datarad i dataList tolkas som Y-axel endast. Jag bara stormar lite med idéer.

public: void setData(dataClass<?> dataList);

Eller ska man vara lite mera tydlig i sin C++ kod och skriva utan templates?

public: void setPlotData(std::vector<std::vector<float>> plotData);

Mål:

  • Clean Code™

  • Senaste C++23 standard

  • Matlab-lik

  • Det ska finnas ett mönster i koden, så det blir enkelt för andra att lägga till sin egen plot

Av heretic16
Skrivet av Yoshman:

APIet på *NIX-system har inte förändras m.a.p. serie-portar sedan 90-talet. Så är fullt möjligt att projektet är "klart".
Men har inte använt detta projekt så kan inte säga om så är fallet här.

Har dock använt detta rätt mycket (både i privata projekt och i arbete)
https://github.com/goburrow/serial

Senaste ändringen i Linux-specifika delen hände för 8 år sedan, det fungerar än

Rätt säker att boost själv inte har något Modbus-bibliotek. Det fanns då inget för ca 2 år sedan när jag var på jakt just efter ett sådant och C++ var ett potentiellt språk.

Valde initial sedan just libmodbus, men det hade (då i alla fall) en icke-färdig implementation. Rätt sker att libmodbus fungerar för många projekt, de som skrivit det initialt verkar ju ha löst just de problemet de råkade ha och har man själv samma/liknande problem fungerar det nog bra.

Inte relevant för dig då jag vet att du inte tänkte byta bort C++, men om det är någon som har möjlighet att fritt välja språk eller bara råkar använda Go redan nu kan jag tipsa om detta Modbus-bibliotek (för för Modbus RTU använder biblioteket ovan):

https://github.com/simonvetter/modbus

Var just att detta bibliotek fungerade så mycket bättre för Modbus (och Modbus var en kritisk komponent) som jag i större skala började använda Go. Visade sig vara ett väldigt trevligt språk för att hantera fältbussar (https://periph.io/), SBC, och annan low-level tech med väldigt mogna/stabila bibliotek

Jag känner att jag har stora anledningar att hålla mig kvar vid C++.
Orsaken har med att C++ utvecklas och ökar allt mer i popularitet med följd av Python. Troligtvis så är det spel och AI-trenden, som lyfter upp C++. Jag känner inte att jag har behov utav "super minnessäkerhet" i C++. Det enda jag vill ha är snabb kompileringstid och körtid.

Dessutom ogillar jag denna turnering kring vilket språk som "klår C++". Jag menar vi har alltid hört talas som "Java, the new C++ killer", "D, the new C++ killer", "Go, the new C++ killer", "Rust, the new C++ killer", "Zig, the new C++ killer", eller "Carbon, the new C++ killer". Är C++ så hemskt att folk vill verkligen utmana det? Hur många år har detta pågått? 30 som jag kan minnas.

Lite komiskt är att även Rust utmanas av Zig och Carbon nu Tror inte Rust överlever om man ska lyssna på hippsters

Något som jag skulle ha behov utav är ett modbus-bibliotek, som fungerar med Boost Asio. Alltså ett gränssnitt för Modbus som talar med Boost Asio. Detta vore inte helt fel. Annars måste jag ha Boost Asio + libmodbus. Blir krångligt. Modbus är ju ett jätte enkelt protokoll.

Av heretic16
Skrivet av Yoshman:

WebGL är ju rätt moget numera. Går att skriva enklare 3D-spel som kan köras direkt i webbläsaren
https://youtu.be/MQE0AU-wZlY

och går också att skriva vertex-/fragment-shader för lite roliga effekter som t.ex. readtids-rendering av Mandelbrot/Julia

Klicka för mer information

<Uppladdad bildlänk>

Visa mer

Men det ändrar inte det du skrev om CV:t. Det är helt klart olika kunskaper som krävs för inbyggda-system vs desktop-appar vs web-appar.

Just desktop-applikationer känns ändå som det är rätt mycket på dekis. Ta Microsoft t.ex., vet inte hur många nya ramverk de har presenterat senaste 10-15 åren där flera aldrig nått användbar nivå innan de lägger ned och börjar på nästa...

Hoppas de menar allvar med WinUI 3, för försöker faktiskt använda det...

WinUI 3 kanske är något för @heretic16? Det är i grunden ett C++ bibliotek och vad det låter lite tänkt att bli ett "modernt Win32"... Men finns också bindings mot C# (är det jag använder).

Finns även en story för cross-platform stöd via något som kallas Uno-Platform (har inte använt det, möjligen är det C# only)
https://learn.microsoft.com/en-us/windows/apps/how-tos/uno-mu...

WinUI 3 kräver inte Visual Studio, men stödet utanför VS är lite so-so

WinUI 3 är ju bara för Windows? Jag vill alltid göra något som är krossplattform och enkelt.
Microsoft hittar alltid på något nytt.

- WinUI,
- WPF
- WinForms
- UWP
- MFC
- Maui

Jadu...jag vågar inte investera min tid i dessa. För man vet aldrig när Microsoft kastar ut dom. wxWidgets har funnits sedan 1992 och har fullt stöd än idag. QT har stötts sedan 1994. MFC uppfanns 1992. FLTK sedan 1998.

Men MFC låter bra tycker jag

Av heretic16
Skrivet av talonmas:

Du pratar om framtid och stora företag och jobbannonser etc. Och sen om desktop-applikationer. Deskotop applikation är INTE framtiden. Vårt företag (100k+ anställda i 200 länder) har inte utvecklat en applikation för desktop de senaste 10 åren. Allt är webbapplikationer. Underhållet av dessa är så ofantligt mycket lättare och aldrig några problem med vilken version vem kör eller hur ska vi ta bort applikationer från folk som inte är behöriga längre etc etc.

deskop är helt enkelt inte framtiden om det är arbete för stora företag du är ute efter

Jag vet att framtiden är webbappar, och jag tycker att ALLT borde vara en webbapp idag. JavaScript, HTML, CSS och allt annat som dagens generation eftersträvar. Tänk vad enkelt. Man behöver aldrig ha någon bra dator.
Men jag är hårdvarukille För mig så är det tråkiga ofärgade system som ska programmeras. Stöter mest bara på C och C++. Även nya projekt tas beslut att dom ska skrivas i C++.

Av heretic16
Skrivet av Elgot:

Har du sett Qt Animation Framework? Nu vet jag inte vad det är du vill göra, men man kan göra animeringar.

Det finns en orsak varför QtCharts verkar ha problem med animeringen. Notera att jag pratar om QtWidgets nu. Inte QtQuick.
Det är därför QCustomCharts finns.

Citat:

Exakt vad är det som inte går? Och jag förstår fortfarande inte varför du tycker att inget stöd alls är bättre än brisfälligt stöd (om det nu är så).

Man måste kompilera och använda speciella libs för att Qt ska fungera med MySQL. Detta är ett vanligt problem hos Qt.

[quote]
Jag vet inte om jag kan säga emot, men inte heller hålla med. Hur mäter du?
[quote]
Nu jämfört jag äpplen mot päron. En applikation som jag har gjort i Qt är betydligt mycket långsammare än en applikation gjort i ImGui eller wxWidgets. Det är en skillnad faktiskt och det handlar om responstider. Jag tycker att ImGui är dock snabbast.

Citat:

Kan du ge exempel?

Qt har många onödiga makron och liknande saker som jag undrar "behövs detta verkligen?". Varken wxWidgets eller ImGui har detta. Men notera att jag är en person som försöker göra animeringar med QtWidgets. Dessutom tycker jag att Qt verkar ha lite av "det extra" som måste skrivas.

Citat:

Det händer att saker ändras, men det är inte särkilt ofta något gammalt slutar fungera. Det finns också LTS-versioner med längre hållbarhet.

Jo, men det är ganska stora skillnader tycker jag.

Citat:

Både Qt och WxWidgets finns som LGPL, så det bör inte vara någon större skillnad*.
*WxWidgets har dock ett undantag som tillåter att man modifierar själva ramverket utan att tillhandahålla källkoden, och för Qt gäller att inte riktigt alla funktioner är tillgängliga med LGPL-licensen.

Man måste ändå ha en licens om man ska använda Qt kommersiellt.

Citat:

Det kan det kanske bli, men jag tror inte att det är ramverkets fel (lika lite som att det är funktioner det är fel på om man skriver traditionell spaghettikod). Rimligen måste man väl koppla ihop tlll exempel en knapp med kod på något sätt?

Oftast är det "skit bakom tangentbordet" som är felet. Men jag tyckte signal and slots är bra, men det kan lätt användas fel.
Jag tycker jag ser ingen direkt logik att ha en klass som kan helt plötsligt skicka en signal till en annan klass bara för att man sätter en connect mellan dom.

Citat:

Vad är det du försöker göra? Vad för hack?

Jag läser av USB porten via en tråd, samtidigt som jag uppdaterar en plot i realtid. Det var inte smidigt.

Citat:

Var utsätts du för de där? Q_OBJECT är som sagt något man måste stå ut med, men de andra tror jag inte att man någonsin behöver se (om man inte tittar i genererade (temporära) filer) om man inte vill.

Varför måste man ens ha Q_OBJECT? Borde det inte vara uppenbart att klassen ska använda Qt-klasser.

Hur som helst så tycker jag inte Qt är dåligt. Nej nej. Qt är riktigt bra. Det är ett stort ramverk.
Det jag verkligen gillade med Qt var deras stöd för serial USB. Helt underbart bra!
Men databaser och plot...njaa...där kan dom förbättra.

Av heretic16
Skrivet av Elgot:

Nej, men det kanske inte behövs? Det är ju ett begränsat problem som man mycket väl kan bli klar med. (Nu har jag inte testat det där själv, det var bara något jag hittade)

Testade Boost Asio med C++ för att skriva till USB. Det fungerar. Jag tror det inte finns några andra bibliotek helt enkelt som uppfyller samma behov som jag kräver.

Undra om det finns annat roligt i Boost? Typ Modbus, eller är man tvingen att använda C biblioteket libmodbus?