Вопрос C++ на ubuntu server не возвращает числа

  • Автор темы Автор темы d0zlove
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
10 Апр 2022
Сообщения
101
Реакции
8
суть проблемы такая: использую dll в тг боте чтобы быстрее посчитать, с помощью ctypes передаю в dll нужные строки в виде const char* и на винде все заебись, преобразую в string, а потом сравниваю с нужным текстом типа
C++:
Expand Collapse Copy
extern "C" {
__declspec(dllexport) int processData(const char* City){
    std::string city(City);

    if (city == "Омск"){
        //здесь могла бы быть ваша реклама
    }
return 0;
}
решил попопробовать запустить это все на ubuntu server 24.04. переделал dll в so, заменил __declspec(dllexport) на __attribute__((visibility("default"))) проверил логи текст правильно приходит, но вечно возврщается 0
 
if (city == "Омск") {
return 1;
}
 
покажи часть кода где ты в пайтоне получаешь город
Python:
Expand Collapse Copy
data = await state.get_data()
await kfc.Mathem(data["AddressOfWarehouse"],data['ReceptionMode'],"resultOfAcceptance",data['AddressOfAppointment'], weight,"20-фт", data['ContainerOwner'],float(nds),data['KOorKKO'])
async def Mathem(city,receptionmode,resultate,address_of_appointment, weight, container_type,container_owner,nds,koorkko):
    dll.processData.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.c_char_p,ctypes.c_char_p, ctypes.c_double, ctypes.c_char_p,ctypes.c_char_p,ctypes.c_double,ctypes.c_char_p]
    dll.processData.restype = ctypes.c_int

    koorkko_bytes = koorkko.lower().encode()
    resultate_bytes = resultate.lower().encode()
    address_of_appointment_bytes = address_of_appointment.lower().encode()
    container_type_bytes = container_type.lower().encode()
    container_owner_bytes = container_owner.lower().encode()
    city_bytes = city.lower().encode()
    receptionmode_bytes = receptionmode.lower().encode()

    result = dll.processData(city_bytes,receptionmode_bytes,resultate_bytes,address_of_appointment_bytes, float(weight), container_type_bytes, container_owner_bytes,float(nds),koorkko_bytes)
    return result
 
попробуй заменить Омск на омск и проверь
 
1751721622240.png
 
А корректо в стринг преобразуется? В дебаге заходит в условие?
дак да, это вообще пиздец какой-то, по байтам - одинаковые, но длины c++ видит разные при том через переменную аргументом длинна 20 а просто в функции 10
А корректо в стринг преобразуется? В дебаге заходит в условие?
щас еще покопался, в первой функции все сравнивается нормально, захдоит в другую и как-будто амнезия нахуй
 
дак да, это вообще пиздец какой-то, по байтам - одинаковые, но длины c++ видит разные при том через переменную аргументом длинна 20 а просто в функции 10

щас еще покопался, первую функцию все сравнивается нормально, захдоит в другую и как-будто амнезия нахуй
так строки оданковые
C++:
Expand Collapse Copy
const unsigned char expected[] = {
        0xD0, 0xB0, 0xD0, 0xBF, 0xD0, 0xBF, 0xD0, 0xB0,
        0xD1, 0x80, 0xD0, 0xB0, 0xD1, 0x82, 0xD0, 0xBD,
        0xD0, 0xB0, 0xD1, 0x8F
    };
    const size_t expected_len = sizeof(expected);
    
    if (appointment.size() != expected_len) {
        return -1;
    }
    
    for (size_t i = 0; i < expected_len; i++) {
        if (static_cast<unsigned char>(appointment[i]) != expected[i]) {
            return 1000 + i;
        }
    }
    
    return 1;  // совпадение
а так разные
C++:
Expand Collapse Copy
const unsigned char expected[] = {
        0xD0, 0xB0, 0xD0, 0xBF, 0xD0, 0xBF, 0xD0, 0xB0,
        0xD1, 0x80, 0xD0, 0xB0, 0xD1, 0x82, 0xD0, 0xBD,
        0xD0, 0xB0, 0xD1, 0x8F
    };
    const size_t expected_len = sizeof("аппаратная");
    
    if (appointment.size() != expected_len) {
        return -1;
    }
    
    for (size_t i = 0; i < expected_len; i++) {
        if (static_cast<unsigned char>(appointment[i]) != expected[i]) {
            return 1000 + i;
        }
    }
    
    return 1;  // совпадение
 
sizeof(const char*) :roflanEbalo:
strcmp на крайняк memcmp, но никак не == ты что поинтеры собрался сравнивать? :roflanEbalo:
strcmp не работает. memcmp не пробовал. ну в винде то все работало я че ебал что-ли что линукс так доебет
 
так не бывает, либо у тебя проверка на 1, когда стркмп возвращает 0 при успехе, либо тебе приходит не char а wchar
все гораздо хуже, у меня просто сравнивается char и string, переделать уже скорее всего не получится
 
Назад
Сверху Снизу