C/C++

Pre- és post increment, decrement kifejezésekben

Fórumok

Nézzük az alábbi C kifejezést:

unsigned int *ptr;

if (ptr && *ptr && --*ptr == 0) timeout();

Egyfelől logikus, amit csinál. Megnézi, a pointer nem NULL-e, utána megvizsgálja, a ptr által mutatott unsigned int változó nagyobb-e nullánál, ha ez is igaz, csökkenti azt, majd megnézi, nullává vált-e. Ha igen, hívja a timeout() függvényt. Ha a ptr == NULL, vagy érvényes, de az általa mutatott változó nulla, akkor nem nyúl semmihez. Ha a ptr által mutatott érték nem nulla, csökkenti azt, de csak akkor hívja timeout() függvényt, ha elérte a nullát.

Ilyesmit szoktam írni, de egy pillanatra megrémültem. A -- precedenciája nagyobb, mint az && operátoré, így akár az is lehetne, hogy előbb minden vizsgálat nélkül csökkent, s csak utána értékeli ki az &&-ek által határolt tagokat. Bár, ha így lenne, szinte semmire sem lenne jó az, hogy amint a logikai kifejezésről tudható annak értéke, nem értékeli ki azt tovább, hanem kilép.

Gyakorlatiasan, az elvárt módon csinálja, de ha szigorúan nézem a precedenciát, akkor szerintem nem működne ez jól.

Qt 6.2.1 WASM SSL [Megoldva]

Fórumok

Az esélytelenek teljes nyugalmával kérdezném, sikerült-e valakinek SSL-t hegesztenie Qt 6.2.1 alá úgy, hogy azzal SSL-képes WebAssembly applikációkat állítson elő?

EMSDK: 2.0.14
Qt: 6.2.1
SSL: 1.1.1k
 

Megoldás: a hiba az volt, hogy a configure-t meghívó scriptben whitespace hiba volt és ezért eldobta a config egy részét, beleértve az SSL beállításokat.

C __randomize_layout talany

Fórumok

Sziasztok,

Tudna segiteni valaki esetleg, ha egy struktura ezzel van definialva __randomize_layout, tipikusan egy csomo a kernelben, akkor azt hoyan tudom reprodukalni mondjuk egy kprobe vagy tracepointba?

eBPF doksi szerint

Using tracepoints 3: bpf

BPF gives us a few ways to connect to tracepoints via different program types:

    BPF_PROG_TYPE_TRACEPOINT: this program type gives access to the TP_STRUCT_entry data available at tracepoint entry; i.e. the data assigned from the raw tracepoint arguments via the TP_fast_assign() section in the tracepoint definition. The tricky part with these tracepoints is the context definition must match that described in the TP_STRUCT_entry definition exactly. For example, in samples/bpf/xdp_redirect_cpu_kern.c the tracepoint format for xdp_redirect tracepoints is defined as follows

De ha randomizalt (The randstruct plugin randomly rearranges fields at compile time given a randomization seed.) akkor nem ertem, hogy fog osszetalalkozni a ketto.

Elore is koszi.

Milyen széles a wchar_t ?

Fórumok

Unicode karakterek Rust --> C közötti átadásakor belefutottam egy érdekes hibaüzenetbe:

warning: `extern` block uses type `char`, which is not FFI-safe
 --> src/main.rs:2:25
  |
2 |     fn teszt_c(charvec: *const char, len: usize);
  |                         ^^^^^^^^^^^ not FFI-safe
  |
  = note: `#[warn(improper_ctypes)]` on by default
  = help: consider using `u32` or `libc::wchar_t` instead
  = note: the `char` type has no C equivalent

Érdekességképpen a rovásírás is a 17 bites tartományban, konkrétan az U+10C80 - U+10CFF értékek között található, ahogy több távolkeleti ország karakterkészlete sem fér bele a 16 bites unicode-ba.
És akkor adódik a kérdés. Ha a Rust char típusa (unicode) az u32 széles, akkor a C nyelv wchar_t típusa az milyen széles valójában? Vannak olyan C fordítók, amely wchar_t típusa nem tudja befogadni a unicode értékeket?

Melyik C fordítóknál nem 32 bites a wchar_t?

Zárt tömb, nyílt tömb C++-ban [megoldva] + új kérdés

Fórumok

Azt szeretném kérdezni, hogy nem lehet, hogy mégis van
különbség az alábbi belépési pontok között?

int main(int argc, char** argv)

int main (int argc, char *argv[])

Külföldön azt mondták nekem, hogy nem ekvivalensek,
mégpedig a második ún. zárt tömb-re hivatkozik, míg
az első nyílt tömbre.

Avagy a ** nyílt tömbre mutató pointer, míg a
* tomb[] zárt tömbre mutató pointer.

 

Akkor is ha igaz, csak szemantikailag mondjuk, de szerintem

a C++ szintaktikailag nem ellenőrzi. Tényleg létezik így valami, hogy

zárt tömb vagy nyílt tömb?

A másik dolog az, hogy hogy lehet megcsinálni, hogy tetszőlegesen

hosszú argumentum legyen? Vagy nincs argc, hanem teljesen dinamikus?

Egyik munkahelyen már volt és valami ...-t kellett használni, de ott nem

gcc volt a fordító, hanem valami ipari fordító volt, talán IAR?

 

Közben megoldva:

// zárt tömb

    char a = array_place[7];

0041137E  mov  al,byte ptr [_array_place+7 (417007h)]
00411383  mov  byte ptr [a],al

// nyílt tömb
    char b = ptr_place[7];

00411386  mov  eax,dword ptr [_ptr_place (417064h)]
0041138B  mov  cl,byte ptr [eax+7]
0041138E  mov  byte ptr [b],cl

 

Szóval arról van szó, hogy mégis így volt: zárt tömbnél csak byte a pointer,

míg nyíltnál dword, mivel az a lehető leghosszabb is lehet.

 

Még kérdés lenne az, hogy van valami amit tilos programozáskor zárt tömbökkel

művelni, mert azt mindig nyílt tömbökkel kell. Ki az aki tudja?

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.