C/C++

Kioptimalizálja a fordító, vagy nem?

Fórumok

Vegyük ezt a két formát C-ben:

if (cond) {
  func1();
} else {
  func0();
}

cond ? func1() : func0();

Azon túl, hogy próbáljam ki, mire számíthatok? A második alak esetén a visszatérési érték nem lesz változónak átadva. Ezért kioptimalizálja a fordító, vagy mindenképpen meghívja cond értékétől függően az egyik függvényt? Tehát az első formula írható-e második alakban félelemérzet nélkül?

C/C++ nyelvű programozás ANDROID, LINUX és WINDOWS alá egy forrás kóddal.

Fórumok

Nagyobb gyerekeknek és kezdőknek is ajánlom:

Könnyen írhatsz saját C/C++ nyelvű programokat ANDROID, LINUX és WINDOWS alá. A megírt program minden változtatás nélkül lefordítható mind a három rendszerhez. Így egy fáradtsággal három programot kaphatsz.

http://sign-el-soft.hu/cgi/ng-dvb.html

http://sign-el-soft.hu/cgi/android.html

Program indítási furcsaság, a putty három példányban indul.

Fórumok

Sziasztok!

Írogatok pár éve (lényegében magamnak) egy hálózat monitorozó/menedzselő/dokumentáló programot ( https://github.com/csikfer/lanview2 ). Ehhez legutóbb egy definiálható szerszámkészletet adtam, pl. a switch-re rájelentkezés CLI vagy Web (ami van). Egy (minimális) böngésző tab megnyitása viszonylag egyszerű volt Qt-ban, de a Terminál vagy SSH ablak megnyitására nem találtam megoldást (Qt környezet, lényeges a multiplatform Windows + Linux). Így maradt külső program hívása. Windows alatt a telnet vagy ssh-hoz a putty-ra esett a választás. Itt van egy olyan fura jelenség, hogy a putty (A QProcess::startDetached(...) -el indítva) három (néha kettő) példányban indul el. Ha szinkron indítom (várok a befejezésre), akkor csak egy példányban. Linux alatt nincs ilyen jelenség, és persze putty sem. Kipróbáltam más program hívását is, pl. a zenmap (nmap Windows verzió, GUI-val), az csak egy példányban indul. Ez egy feature a putty-ban, vagy én maradtam le valamiről?

Próbáltam nem a startDetached() -el indítani programot, és utána leválasztani, de ezt a Qt nem támogatja, a meghekkelése ugyan egyszerű, csak nem működik (10 sec után kilép a putty).

Igazándiból az lenne jó, ha a GUI egy tab-jában (QTabWidget) tudnák indítani egy terminált, vagy ssh-t.

android c/c++

Fórumok

androidon C/C++ programokhoz akarok jpeg és FFMpeg könyvtárakat is használni.

Ha a dinamikus libjpeg.so, libavcodec.so, ... könyvtárakat linkelem az apk elkészül, de indítás után azonnal leáll.

Ha a *.so dinamikus könyvtárakat csak beteszem a csomagba, és futásidőben akarom linkelni, akkor nem engedi.

Ha csak a libjpeg.a statikus könyvtárat használom, az működik.

Ha a libjpeg.a mellé a libavcodec.a, ... (+7 db teljes FFmpeg) könyvtárakat is linkelem, akkor az FFmpeg működik, de a jpeg nem jól működik (a képek dekódolásánál hibát jelez)

[Megoldva] Lamy toll gomb, radírként való használata ReMarkable 2 tableten

Fórumok

Sziasztok!

 

Adott egy ReMarkable tablet és egy Lamy toll. A tablethez jár egy ceruza amin van egy radírként funkcionáló gomb. Eddig minden szép és jó, viszont a Lamy tollon is van egy gomb, amit hiába nyomkodok, mivel más event kódja van mint a radír gombnak.

Ezért úgy döntöttem, írok valami trigger szerű programot, ami ha megnyomom a Lamy tollon a gombot, küld egy virtuális gombnyomást a radír kódjával.

 

A gond csak annyi, hogy én nem vagyok profi programozó és sikerült betévedni abba a bizonyos erdőbe... Vagyis a program nem igazán akar működni.

Örülnék ha valaki meg tudná mondani, hogy legalább jó úton járok e? Vagy, hogy mi a megoldás, remélem valami faék egyszerű.. 

A példa amiből dolgoztam itt található.

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <string.h>
#include <stdbool.h>

#define EVDEV "/dev/input/event1"

int main(int argc, char **argv) {
    unsigned char key_states[KEY_MAX/8 + 1];
    struct input_event evt, evt_w;
    int fd;
    bool flag = false;
    
    memset(key_states, 0, sizeof(key_states));
    fd = open(EVDEV, O_RDWR);
    ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);

    // Create some inconsistency
    printf("Type (lots) now to make evdev drop events from the queue\n");
    sleep(5);
    printf("\n");

    while(read(fd, &evt, sizeof(struct input_event)) > 0) {
        if(evt.type == EV_SYN && evt.code == SYN_DROPPED) {
            printf("Received SYN_DROPPED. Restart.\n");
            fsync(fd);
            ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);
        }
        else if(evt.type == EV_KEY && evt.code == BTN_TOOL_PEN) {
            // Ignore repetitions
            if(evt.value == 1) continue;

	    
            key_states[evt.code / 8] ^= 1 << (evt.code % 8);
            if((key_states[evt.code / 8] >> (evt.code % 8)) & 1 != evt.value) {
                printf("Inconsistency detected: Keycode %d is reported as %d, but %d is stored\n", evt.code, evt.value,
                        (key_states[evt.code / 8] >> (evt.code % 8)) & 1);
            	flag = ! flag;
		evt_w = evt;
		evt_w.code = BTN_TOOL_RUBBER;
		if (flag) {
			evt_w.value  = 1;
		}
		else {
			evt_w.value  = 0;
		}
		write(fd, evt_w, sizeof(struct input_event));
	    }
        }
    }
}

 

UI.: Tudom létezik erre ReMarkable hack, de az nekem valamiért nem működik..

UI2.: Próbáltam, kicserélni a gombok kiosztását is, de természetesen az sem megy... link

 

 

Sikerült megcsinálni! Később megírom részlettesen egy blogbejegyzésben és belinkelem ide.

Szerk: Az ígért link.

C++ callback as member function

Fórumok

Sziasztok,

Arduino alapokon szeretnék programot írni ESP32-re. MQTT protokollra szeretnék egy objektumot készíteni, hogy minden egységbe legyen zárva.
A következő problémába futottam bele: MQTT / PubSubclient librari alkalmazása esetén vagy lehet egy callback metódust alkalmazni, ami az üzenet érkezésekor hívódik meg.
Ez azonban alap esetben nem lehetséges, ha a callback metódus sima member function. Lehet objektumon kívüli vagy static, de akkor elvesztek egy pár objektum adta lehetőséget.

Az objektum a következő:
https://pastebin.com/tT8nNvWC

Sok keresés után találtam is megoldásokat, de ezek valahogy nem működnek.
Sajnos nem vagyok egy C guru, ezért fordulok hozzátok.

Tehát a mellékelt kódból kiemelve a megoldásokat és a hibákat:

  // this -> client.setCallback(callback);
            // Problem: argument of type "void (Mqtt::*)(char *topic, uint8_t *payload, unsigned int length)" is incompatible with parameter of type "void (*)(char *, uint8_t *, unsigned int)"C/C++(167)
 
            // this -> client.setCallback ( [this] (char* topic, uint8_t* payload, unsigned int length) { this->callback(topic, payload, length); });
            // Problem: no suitable conversion function from "lambda []void (char *topic, uint8_t *payload, unsigned int length)->void" to "void (*)(char *, uint8_t *, unsigned int)" existsC/C++(413)
             
            // client.setCallback(std::bind(&Mqtt::callback));
            // Problem no suitable conversion function from "std::_Binder<std::_Unforced, void (Mqtt::*)(char *topic, uint8_t *payload, unsigned int length)>" to "void (*)(char *, uint8_t *, unsigned int)" existsC/C++(413)

Tudna valaki segíteni?

 

üdv: redman

 

Shiftelés, bit-bang és a C

Fórumok

Iskolás feladat. Egy csipes processzor (most épp STM8), "plain C" (most épp sdcc).
Handlert írogatok egy 2x74HC164 shift regiszterrel kihajtott 8 digites hétszegmenses kijelzőhöz. Van egy adat és egy clock pinje (no meg persze táp).

Assembly -ben 16 bites regisztert shiftelgetek a carry flag irányába és egy utasítással a carry flaget kirakom az adat pin -re. "shift left" utasítás ami a carry -t is használja szinte minden egy csipes tud, nem gond.

Hogy kell ezt csinálni, ha C -ben kell megírni?

Egy ötlet: nem a carry de a 15. bitet figyelve ha az egy, akkor egyet írok a portra, ha ez 0 akkor nullát, a shift utasítás meg alap a C -ben.

Fejlődik a C, avagy struktúrák másolása

Fórumok

Adhattam volna címnek azt is hogy „újszülöttnek minden vicc új”, vagy hogy „ma is tanultam valamit”...

A lényeg ez a titokzatos sor (én írtam):

//tokencopy(f,g,g+1);
f->T[g]=f->T[g+1];

Mármint, ugye nem 1 hanem 2 sor. Ezek egy általam írt programban vagynak benne (a legújabb programnyelvemről van szó de tökmindegy). Előbb azt a sort tettem csak bele ami itt ki van kommentezve. Ez ugye egy (globális)függvény, ami annyit csinál, hogy egy struktúrákat tartalmazó tömb 2 elemét átmásolja, a g+1 -ediket a g-edik elembe, annak régi tartalmát felülírva. (Az "f" is egy struktúra amúgy, de most nem arról van szó, hanem a T tömbről aminek az elemei struktúrák maguk is). Persze senki ne gondoljon olyan böszmeségre, hogy a struktúra minden mezőjét külön másolom, csináltam 2 pointert mindegyik struktúra kezdetére mutatva, majd castoltam őket unsigned long long * típusúra, aztán egy ciklussal át lett másolva minden unsigned long long érték, a ciklus addig ment amennyi a struktúrám sizeof() értéke... Így jó lesz akkor is ha a struktúra mérete megváltozik. Arra kell csak ügyelnem, a mérete mindig az unsigned long long méretének többszöröse legyen.

Na de ez majdnem mellékes volt. A lényeg tehát hogy ezt a függvényt megírtam, amikor jött egy fura ötletem. Az, amiért kikommenteztem a tokencopy sort ami meghívná a függvényemet s leírtam helyette az alatta levő sort. Mert hátha van már olyan okos a C nyelv hogy képes ő maga is struktúrákat másolni... Tudtam ugyan, az eredeti Kernighan/Ritchie könyv szerint struktúrák esetén az egyetlen művelet a pointerük képzése, de a C++ esetén már rég úgy van (amennyire tudom legalábbis) hogy képes a struktúrák másolására. Gondoltam, hátha ezt az okosságot átemelték már a C nyelvbe is azóta!

És voila, behold meg hasonlók - simán lefordult a programom így is, még csak nem is warningolt!

Lehet hogy most megkapom a trolloktól a kiosztást hogy ez ilyen meg olyan ősrégi feature már, miért is nem tudtam róla korábban... Hja, kérem, nekem senki nem oktatta a progranyozást főiskolán, magam tanultam, És az eredeti Kernighan könyvből. Az, hm, talán mégse a legújabb verziója a C nyelvnek... Szóval, ezt most fedeztem fel és kész... De örülök neki! Nagyon jó kis feature.

Jó pap holtig tanul ugye. Sőt még az is aki nem pap.

[MEGOLDVA]STM8S SDCC optimalizációs probléma

Fórumok

STM8S -re írok egy egyszerű polling -os i2c handlert.
Több helyen szükség van arra, hogy kiolvassak egy-egy státusz regisztert, így lehet tovább lépni. A beolvasott értékkel nem érdekel, nem kell vele műveleteket végeznem, de ki kell olvasnom, különben nem lehet tovább lépni.

Az egyik forrásban pl. így oldotta meg a szerző "(void) I2C_SR3;" - no ezt a mostani SDCC simán ki optimalizálja, hiszen semmire nincs használva.
Egyelőre úgy "kerültem meg" hogy foglaltam egy fájl globál változót és abba "olvasom bele" a regiszter értékét. (Később, lehet még jó valamire, mondjuk hiba kezelésre, de most semmi szükségem rá, csak foglalja az értékes memóriát.)

Tudtok valami más megoldást?

OFF: A terv az, hogy majd interrupt -ba kerül az egész, valószínűleg assembly -ben. De itt inkább az elv lenne a lényeg.

Lotus C++ API Toolkit for Notes/Domino 3.0i

Fórumok

Sziasztok!

 

 Szükségem lenne a Lotus C++ API Toolkit for Notes/Domino 3.0i Multiplatform eAssembly nevű szoftverre. Ezt korábban bárki letölthette az IBM oldaláról, de onnan eltávolították, mert eladták egy HCL nevű indiai cégnek Lotus/Domino termékvonalat, a HCL viszont nem publikálja. Van itt esetleg valaki, aki elraktározta ezt magának korábban, és meg tudná osztani velem?

 

Előre is köszönöm.