Передача строкового значения в функцию с помощью указателя uint8_t

Я изучаю C ++ для создания пользовательской функции (пользовательская функция — это то, как ее называет cloudera), которую я хочу использовать в SQL Hadoop Cloudera Impala. Cloudera предоставила заголовочный файл с определениями типов для аргументов пользовательских функций

struct AnyVal {
bool is_null;
AnyVal(bool is_null = false) : is_null(is_null) {}
};
//Integer Value
struct IntVal : public AnyVal {
int32_t val;

IntVal(int32_t val = 0) : val(val) { }

static IntVal null() {
IntVal result;
result.is_null = true;
return result;
}
}
//String Value
struct StringVal : public AnyVal {
static const int MAX_LENGTH = (1 << 30);
int len;
uint8_t* ptr;
/// Construct a StringVal from ptr/len. Note: this does not make a copy of ptr
/// so the buffer must exist as long as this StringVal does.
StringVal(uint8_t* ptr = NULL, int len = 0) : len(len), ptr(ptr) {
assert(len >= 0);
};
/// Construct a StringVal from NULL-terminated c-string. Note: this does not make a copy of ptr so the underlying string must exist as long as this StringVal does.
StringVal(const char* ptr) : len(strlen(ptr)), ptr((uint8_t*)ptr) {}

static StringVal null() {
StringVal sv;
sv.is_null = true;
return sv;
}
}

Теперь для простой функции Add, подобной приведенной ниже, я понял, как передать ссылку на объект IntVal после установки IntVal.val, и это сработало!

IntVal AddUdf(FunctionContext* context, const IntVal& arg1, const IntVal& arg2) {
if (arg1.is_null || arg2.is_null) return IntVal::null();
return IntVal(arg1.val + arg2.val);
}

int main() {
impala_udf::FunctionContext *FunctionContext_t ;
IntVal num1, num2 , res;
num1.val=10;
num2.val=20;
IntVal& num1_ref = num1;
IntVal& num2_ref = num2;
res = AddUdf(FunctionContext_t, num1_ref, num2_ref);
cout << "Addition Result = " << res.val << "\n";
}

Но я не знаю, как сделать подобное для строковой функции, так как StringVal требует, чтобы я передал указатель типа uint8_t для строки? Я попробовал ниже одного, но потом получил «ошибка: невозможно преобразовать std :: string uint8_t * в назначении «*

int main() {
impala_udf::FunctionContext *FunctionContext_t ;
StringVal str , res;
string input="Hello";
str.len=input.length();
str.ptr=&input;
StringVal& arg1=str;
res = StripVowels(FunctionContext_t, str);
cout << "Result = " << (char *) res.ptr<< "\n";
}

Я также попробовал следующее, но без радости. любой указатель в правильном направлении будет высоко ценится. Благодарю.

str.ptr=reinterpret_cast<uint8_t*>(&input);

0

Решение

Строка сама по себе не является символьным указателем (что вам нужно), но вы можете получить его с помощью функции c_str.

str.ptr=(uint8_t*)(input.c_str ());

Если вы хотите использовать приведение в новом стиле, вам может потребоваться как const_cast (для преобразования из const char * в char *), так и reinterpret_cast, в зависимости от того, как определен str.ptr.

0

Другие решения

Это потому, что вам нужен указатель на c-строку, и вы предоставляете указатель на std::string, str.ptr = input.c_str() должен работать на вас.

РЕДАКТИРОВАТЬ:
Однако, кажется, вам нужен неконстантный указатель. В этом случае вам нужно выделить input переменная себя, как:

char input[128];

Это создает массив фиксированного размера в стеке.
Но вы можете выделить его динамически с помощью нового:
char* input = new char[size];

Также проверьте функции в заголовок cstring, Вы можете использовать их.

Вам также может понадобиться uint8_t* как описано выше.

Не забудь delete[] Строка позже, когда она вам больше не нужна. Но так как вы передаете это функции, эта функция, вероятно, должна обработать это.

0

По вопросам рекламы [email protected]