C/C++

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) I"C_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.

[Megoldva] glibc/getaddrinfo() furcsaságok

Fórumok

Sziasztok!
Igazából arra lennék kíváncsi, hogy én rontok-e el valamit, vagy hiba van a libc-ben?

Van a következő forráskód: (a formaság kedvéért: src/tes2.c)
(egy nagyobb projekt része, azért van ennyi #include benne, ez egy kiragadott részlet, de egészben is ugyanezt produkálja)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h> 
#include <sys/types.h>
#include <sys/ipc.h>  
#include <sys/stat.h> 
#include <fcntl.h>  
#include <linux/limits.h>  
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define test_c 

int main(int argc, char *argv[]){
    char *buff1=NULL, *buff2=NULL, *buff3=NULL;    
    struct addrinfo hints;
    struct addrinfo *res;
    int err;

    memset(&hints, 0, sizeof(hints));   
    hints.ai_family = AF_UNSPEC;        
    hints.ai_socktype = SOCK_STREAM;    
  
    if((err = getaddrinfo("localhost", "http", &hints, &res)) != 0){
        printf( "getaddrinfo hiba: %s\n", gai_strerror(err));
        return -1;
    } 
    printf("1: %p, 2: %p, 3: %p", buff1, buff1, buff3);
    buff1 = malloc(100); /*<-- ezen sor hiányában is hibára fut */
    free(buff1);    /*<-- Ha ezt a free-t kikommentezem, akkor tökéletesen fut */

    printf("\n");
    return 0;
}

ezekkel a kapcsolókkal fordítom:

(természetesen itt is, a crypto libre szükség van a projektben, szóval nem hanyagságból van ott)

gcc -Wall -c -ggdb -Wpedantic -Wmissing-prototypes -o build/test2.o src/test2.c
gcc  build/test2.o -o bin/test2 -lefence -lcrypto

 

Ám a futtatáskor már ezt a hibaüzenetet kapom:
 

tux@pc:~$ ./bin/server
  Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
server: resolv_conf.c:423: __resolv_conf_allocate: Assertion `conf == ptr' failed.
Félbeszakítva (core készült)


tux@pc:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 

 

Ahogy írtam a kódban, a megjelölt sorban, ha kommentbe teszem a free(buff1);-et, akkor minden tökéletesen működik.

Szóval mi lehet a nyűgje a getaddrinfo() -nak?


UPDATE:

Hogy másoknak kevesebb bosszúságot okozzon:

EF_ALIGNMENT=8 ./bin/test2

(és akkor pontos lesz az illesztés)

linux gdb + win10 eclipse

Fórumok

Sziasztok!

Van egy távoli linuxos gép, amin ssh-n keresztül fejlesztek C/C++-ban.
No meg persze debuggolok gdb-vel.
Lokális Win10-en Eclipseben szeretném a debug felületet nézegetni, léptetni és a kimenetet nézegetni.

Szinte biztos vagyok benne, hogy összehozható, de még nem sikerült.
Kellene egy jó útbaigazító leírás.

R