यह उदाहरण है कि सी-स्टाइल फ़ंक्शन के लिए std::vector<std::byte> को कच्चे डेटा में कैसे परिवर्तित किया जाता है। यह एकदम सही काम है।

void SomeCApi(unsigned char* buffer, unsigned int size)
{
    for (unsigned char index = 0; index < size; ++index) {
        buffer[index] = index;
    }
}
 
int main()
{
    std::vector<std::byte> buffer{ 100 };
    SomeCApi(reinterpret_cast<unsigned char*>(&buffer[0]), buffer.size());
 
    for (const auto& element : buffer) { PrintByte(element); }
}

लेकिन मैं अपने बाइट्स वेक्टर को const unsigned char** को कैसे प्रदान कर सकता हूं ?? मुझे फ़ंक्शन SomeCApi(const unsigned char** buffer, unsigned int size) के लिए इसकी आवश्यकता है। मेरी कोशिश reinterpret_cast<const unsigned char**>(&bytes[0]), लेकिन यह काम नहीं कर रहा है। मुझे अपवाद मिलता है "पहुंच उल्लंघन पढ़ने का स्थान"।

एमएसवीसी 19, सी++17(नवीनतम)। मेरा मामला:

unsigned char* sig;
sig = (unsigned char*)alloca(signature_len);
std::vector<std::byte> bytes(signature_len);

ec_sig = d2i_ECDSA_SIG(NULL, reinterpret_cast<const unsigned char**>(&bytes[0]), signature_len); //It's throw Access violation reading location
//ec_sig = d2i_ECDSA_SIG(NULL, (const unsigned char**)&sig, signature_len); //It's perfect work with C-Style raw data and C-style cast.
if (ec_sig == NULL)
    std::cout << "BAD" << std::endl;
0
Naydachi Kamikadze 16 सितंबर 2020, 14:08

1 उत्तर

सबसे बढ़िया उत्तर

const char** स्वीकार करने वाले सी फ़ंक्शन को vector<char> प्रदान करने के लिए आप आंतरिक बफर तक पहुंच सकते हैं और इसमें एक पॉइंटर वापस कर सकते हैं:

#include <iostream>
#include <vector>

void someCApi(const char** c, size_t len)
{
    for (size_t i=0; i<len; ++i)
    {
        std::cout << static_cast<int>((*c)[i]) << std::endl;
    }
}

auto main() -> int
{
    std::vector<char> buff{1,3,5,7,11,13,17,19};
    const char* buffPtr = buff.data();
    someCApi(&buffPtr, buff.size());

    return 0;
}

https://onlinegdb.com/B1BSNKyrv

सूचक को सरणी में लाने के लिए सरल इंटरफ़ेस:

template <typename T>
class pptr
{
    const T* buff=nullptr;
public:
    ppta(std::vector<T>& v): buff(v.data()){};
    const T** operator()(){return &buff;}
};

//Usage
someCApi(pptr(buff)(), buff.size());
1
Adrian Maire 16 सितंबर 2020, 16:17