C/C++

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

Kapcsos zárójelek mint blokkhatárjelzők kikényszerítése C alatt egyetlen utasítás esetén is

Fórumok

A cím talán kissé érthetetlen de féltem nem férne bele a limitbe ha alaposan kimagyarázom ott...

Tehát, a bajom az hogy én szinte mindig C nyelven programozom, és úgy szeretném beállítani a gcc illetve g++ progit (nekem aztán teljesen mindegy hogy parancssori kapcsolóval vagy makefile által vagy bárhogy, csak legyen rá mód!) hogy ilyesmiket ne lehessen csinálni:

for(i=0;i<max;i++) a[i]=b[i];

Hanem csak ezt:

for(i=0;i<max;i++) {a[i]=b[i];}

azaz KÖVETELJE MEG a kapcsos zárójelek kitételét EGYETLEN utasítás esetén is!

Ugyanez igaz az if esetére is: ilyet NE lehessen:

if(a>b) g++;

Hanem csak így:

if(a>b) {g++;}

Tehát mindig, MINDIG követelje ki a kapcsos zárójeleket ilyenkor, egyetlen utasítás esetén is! És ne is warningoljon, hanem ha nincs ott, akkor simán ERROR és kész. Ne legyen hajlandó lefordítani. Léccike segítsetek! Ez az egyik legbosszantóbb hibája a C nyelvnek, hogy ilyesmiket megenged. Teljesen áttekinthetetlenné tudja tenni a kódot. Számtalan hibalehetőség forrása. Bevallom, semmiféle lehetőséget nem találtam ennek beállítására, pedig sokat keresgéltem.

Binlog: high performance structured binary log library (C++14)

Fórumok

Ez egy C++ specifikus "Én csináltam!" téma, egyben felhívás egy próba körre.

Forráskód: https://github.com/Morgan-Stanley/binlog
Dokumentáció: http://binlog.org/

Röviden: egy C++14 naplózó könyvtár, ami bináris logot gyárt: ezért nagyon gyors, a kimenet feldolgozása pedig könnyen gépesíthető. A bináris napló emberi fogyasztásra a mellékelt segédprogrammal (bread) alkalmas.

Vegyétek és fordítsátok, hátha valaki tudja jóra használni.

dlsym warning castolásnál

Fórumok

Írtam egy pluginbetöltő függvényt (a programnyelvemhez amúgy. Ez mellékes csak nem bírom megállni a dicsekvést). A függvény REMEKÜL MŰKÖDIK, ezt kihangsúlyozom, szóval nincs semmi hiba!

A bajom az amit bele is írtam a kódba megjegyzésként, hogy ha a kód úgy néz ki amint az a kikommentezett sorban vagyon, tehát ha közvetlenül castolom a pointert (ahogyan azt szerintem minden jótét és normális lélek ösztönösen csinálja, mintegy „csuklóból” mert az a logikus) akkor a g++ warningol mint az állat. (De a lefordított kód JÓ AKKOR IS!). A gcc viszont nem is warningol.

A warning üzenet ez:

loadplugin.cpp:72:49: error: ISO C++ forbids casting between pointer-to-function and pointer-to-object [-Werror]
nameptr=(upuplugin *)dlsym(Library,pluginname);
 

 

Maga a programrészlet (mindent kihagytam ami nem releváns. Hogy miféle union az az union upuu az se releváns):

#define usac   uint8_t

typedef void upuplugin(union upuu *th);

char *DLERRORstring=NULL; usac DLERRORflag=0;

void * loadplugin(void *Library, char *pluginname) {
DLERRORstring=NULL; DLERRORflag=0;
upuplugin *nameptr; nameptr=NULL;
if(Library   ==NULL)   {DLERRORflag=1; return nameptr;}
if(pluginname==NULL)   {DLERRORflag=2; return nameptr;}
if(pluginname[0]==0)   {DLERRORflag=3; return nameptr;}
dlerror(); // clear errorcode
// Ez lenne a logikus hívás, de valami ISO szabály miatt ekkor warningot dob a g++: (a gcc viszont NEM!):
//nameptr=(upuplugin *)dlsym(Library,pluginname);
*(void **)(&nameptr)=dlsym(Library,pluginname); // Ha így hívom meg a fenti helyett, nem dob warningot
DLERRORstring=dlerror();
if(DLERRORstring!=NULL) {DLERRORflag=4;nameptr=NULL;}
dlerror(); // clear errorcode
return (void *)nameptr;
}

 

Szóval nem értem, mi a rákért kell warningolnia egyrészt (ismétlem a kód JÓ és remekül működik!); másrészt ha ez a warningolás mégis szükséges valami komoly ok miatt, miért csak a g++ zaklat vele, a gcc miért nem.

C++ metódus const modifier hatása

Fórumok

Hello,

van egy ilyen kód (kipucolva, leegyszerüsítve, hátha valakit tényleg érdekel :))

#include <iostream>
#include <maxminddb.h>

class MyClass {
    public:
        bool lookup(const std::string& name);

    private:
        MMDB_s mmdb;
};

bool MyClass::lookup(const std::string& target) {

    int gai_error, mmdb_error;
    MMDB_lookup_result_s r;

    r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
    return true;
}

int main() {
    MyClass *c;

    c = new MyClass();
    std::string s = "foo";
    c->lookup(s);

    return 0;
}

Ez ezzel a paranccsal le is fordul:

g++ prog.cc -lmaxminddb

(clang-al is).

Ha a lookup() fv-t const-ra módosítom, akkor a fordító (mindegyik) elkezd rinyálni, de az MMDB_lookup_string()-re:

        bool lookup(const std::string& name) const;

...

bool MyClass::lookup(const std::string& target) const {
prog.cc: In member function 'bool MyClass::lookup(const string&) const':
prog.cc:17:28: error: invalid conversion from 'const MMDB_s*' to 'MMDB_s*' [-fpermissive]
   17 |     r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
      |                            ^~~~~
      |                            |
      |                            const MMDB_s*
In file included from constcheck.cc:2:
/usr/include/x86_64-linux-gnu/maxminddb.h:204:66: note:   initializing argument 1 of 'MMDB_lookup_result_s MMDB_lookup_string(MMDB_s*, const char*, int*, int*)'
  204 |     extern MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb,
      |                                                    ~~~~~~~~~~~~~~^~~~

 

Tud segíteni valaki ennek megértésében? Miért a fv törzsön belül egy másik fv argumentumánál panaszkodik, és miért csak akkor, ha ha fv const? Ennélkül miért fogadja el?

Fura hiba Visual C-vel, gcc-vel minden ok.

Fórumok

Tanácstalan vagyok egy fura linkelési hiba miatt.

Van egy szép nagyra hízott projektem ( https://github.com/csikfer/lanview2 ), ami multiplatformos (volt). Ubuntu-n simán lefordul, és működik. Windows alatt Wisual Studio 1017 a fordító, és egy általam értelmezhetetlen hibaüzenettel leáll az lv2g.dll linkelésénél:

lv2.lib(lv2.dll):-1: error: LNK2005: "public: int __cdecl QList<class QString>::size(void)const " (?size@?$QList@VQString@@@@QEBAHXZ) already defined in input_dialog.obj
lv2.lib(lv2.dll):-1: error: LNK2005: "public: class QString const & __cdecl QList<class QString>::operator[](int)const " (??A?$QList@VQString@@@@QEBAAEBVQString@@H@Z) already defined in input_dialog.obj

Az input_dialog.cpp -ben a következő metódus okozhatja a hibát:

void cSelectDialog::setValues(const QStringList& values, bool _m)
{
    QAbstractButton *pButton;
    int id, n = values.size();
    for (id = 0; id < n; ++id) {
        const QString& val = values[id];
        if (_m) pButton = new QCheckBox(val);
        else    pButton = new QRadioButton(val);
        pButtonGroup->addButton(pButton, id);
        pLayout->addWidget(pButton);
    }
    pLayout->addWidget(pDialogButtons);
    pButtonGroup->setExclusive(!_m);
}
A QStringList két inline metódusának hívásánál keletkezik a hiba, legalábbis, ha ezeket kiveszem, akkor lefordul.

Ha ez fordítói hiba, akkor nagyon furmányos, mert nincs rá találat a Google-n, és abban a pár ezer sorban hasonló módon jó párszor használt QStringList objektum esetén minden ok.

Ha én hibáztam, akkor is furmányosra sikeredett, mert gcc simán lefordítja, és egy elég egyszerű algoritmus, amit elhibázni sem könnyű.

Áthidaló megoldás sem igen jut eszembe (ill. amit próbáltam, az nem segít).

static_cast unsigned -> signed char

Fórumok

Sziasztok,

van egy feladat, mondjuk egy

std::string

típusú változóban kell a szóközöket (incl. tabulátorok...) kipucolni, erre volt egy ilyen kód:


========
std::string removewsp(std::string value) {

    int64_t i = 0;

    while (i < value.size()) {
        if (isspace(value[i])) {
            value.erase(i, 1);
        } else {
          i++;
        }
    }

    return value;
}
========

Aztán kitalálták, hogy az isspace() nem elég, mert pl az ASCII 160-at (NBSP) nem törli, így kegészítették erre:


========
#define NBSP 160

std::string removewsp(std::string value) {

    int64_t i = 0;

    while (i < value.size()) {
        if (isspace(value[i]) || (value[i] == NBSP)) {
            value.erase(i, 1);
        } else {
          i++;
        }
    }

    return value;
}
========

Ez viszont nem jó, mert egyrészt szól a fordító, hogy az ott soha nem lesz igaz, másrészt a fordítónak igaza van. (Úgy tudom az std::string mint típus char szekvencia, a "sima" char pedig signed, így az nem nagyon lesz soha 128-nál nagyobb értékű, de lehet -127 is).

Volt egy javaslatom, hogy akkor csináljuk így:


========
        if (isspace(value[i]) || (value[i] == static_cast<char>(NBSP))) {
========

mert szerintem ha egy olyan unsigned char tömbből csinálunk std:string-et, aminek az egyik eleme nagyobb, mint 128, akkor a fordító szépen elvégzi a castolást, így a 160-ból pl -96 lesz.


========
    unsigned char c_array = {102, 111, 111, 160, 98, 97, 114}; // "foo\0xA0bar"
    std::string c_str(c_array);
    value = c_str;
========

Ha ezt megnézem karakterenként, akkor a 3. helyen (0-tól) -96 lesz. Ráadásul a függvény is jól működik, míg cast nélkül a 160-at (értelemszerűen) nem találja meg.

A válasz az ötletre az volt, hogy ez csak a warning-ot szünteti meg, nem megoldás a problémára.

Szeretek tanulni és megérteni dolgokat, és mivel egyéb válasz nem jött, így kérdezem a T. Nagyérdeműt: miért csak a warning-ot szünteti meg a static_cast, és mi lenne a helyes megoldás?

Köszi.