Я уверен, что это что-то простое, но я не могу понять это. Я в основном пытаюсь использовать c++ для создания строки HTML и вернуть ее для хранения в объектном классе модели c, который будет использоваться позже в веб-представлении.
Сторона c++, похоже, работает нормально. здесь метод, вызванный в файле cpp:
const char *SqliteConnection::htmlTest(){
HtmlItemValueTableBuilder htmlBuilder = HtmlItemValueTableBuilder();
std::string s = htmlBuilder.test();
cout << "TEST RESULT: " <<s;
return s.c_str();
}
Cout производит следующий вывод (который я хочу):
TEST RESULT: <!doctype html><html><head></head><div><STYLE type="text/css"> body { margin: 10%; } table { border-spacing: 5px; } td { background-color: #EFEFEF; font-size: 20px; padding: 4px; padding-left: 4px; padding-right: 4px; } tr { margin-bottom: 10px; margin-top: 10px; } </STYLE><table><thead></thead><tbody>
<tr><td>hello</td><td>world</td></tr>
</tbody></table></div></html>
Ниже приведен код, вызывающий его в отдельном файле Objective c++ (.mm):
-(NSString *)getFieldsMapAsHtmlForResult:(Result *)result {
const char *s = _sqliteConnection->htmlTest();
NSLog(@"Before Conversion: %s", s);
NSString *htmlString = [NSString stringWithUTF8String:s];
NSLog(@"After Conversion: %@",htmlString);
return htmlString;
}
Я видел, как многие люди рекомендуют использовать stringWithUTF8String для преобразования строки ac в NString. Это работало для меня в прошлом, но по какой-то причине, в обоих выводах NSLog, я ничего не получил. Строка просто таинственно исчезает.
Не могли бы вы порекомендовать то, что может быть причиной этого?
----- UPDATE ---- Следуя рекомендациям по отставке ниндзя, я попытался убедиться, что указатель, на который ссылается, не соответствует переменной, которая выпала из сферы действия. У меня был класс Result model c++, который я успешно передал моему объекту c++. Я решил добавить элемент данных, fields_map_as_html, и передать эту функцию, а не коду obj c++.
SqliteConnection::htmlTest()
возвращает указатель на локальную переменную, выходящую за пределы области видимости, поэтому она больше не действительна. Вместо этого вы можете вернуть "std :: string" и извлечь данные в вызывающей функции или использовать какой-либо другой метод, чтобы убедиться, что данные зависают, пока вы его не используете.