편집 : 제임스 홉킨 (James Hopkin)의 제안을 구현 한 후에도 이상한 문자보다 훨씬 좋은 "잘못된 이름 'null'"이라는 경고가 표시됩니다. 그런 다음 라이브러리 문서를 다시 읽고 그 특정 함수에 대해 인수에는 aNames의 크기보다 NULL이 아닌 하나 이상의 요소가 있어야합니다. 추가 문자열에는 다른 용도가 있습니다. 문자열을 한 개 더 추가하면 코드가 제대로 실행됩니다. 제 잘못이고, 너무 유감입니다.문자열의 벡터를 foo (char const * const * const)에 전달하는 방법은 무엇입니까?
원본 게시물 :
안녕하세요,
이 내 첫 번째 게시물이 너무 좋은 주시기 바랍니다있다. 이 포럼에서 검색하고 봤지만 여전히 답을 찾을 수 없습니다. 이 문제로 하루 이상 나를 괴롭 히므로 제게 도움을주십시오. 고맙습니다.
문자열 함수의 벡터를 라이브러리 함수 foo (char const * const * const)에 전달해야합니다. 문자열에 대한 포인터이기 때문에 & Vec [0]을 전달할 수 없습니다. 따라서 배열이 있고 해당 배열에 c_str() 전달하십시오. 나는 위의 코드를 실행하면
는 다음 함수 foo가에 대한 몇 가지 경고를 던져 :
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
그러나, 몇 가지 정의되지 않은 동작이 발생 같다 : 다음은 내 코드입니다 (aNames은 문자열의 벡터이다) 불법 문자 ('èI'blablabla)가 있습니다. 나는이 같은 함수 foo 전에 AR을 인쇄 할 경우
는 :
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
그런 다음, 다 괜찮습니다. 내 질문 :
변환으로 인해 정의되지 않은 동작이 발생합니까? 그렇다면 왜?
문자열의 벡터를 foo (char const * const * const)로 전달하는 올바른 방법은 무엇입니까?
+1 좋은 생각. 실제로'foo' 함수의 배열 크기를 찾는 유일한 방법은 NULL 포인터를 찾는 것입니다. –
네, 잘 됐네요! foo 함수의 서명이 진짜가 아닌 한. @ user347208 : 정확한 함수 서명입니까? – neuro
도움 주셔서 대단히 감사합니다! @neuro : 정확한 함수 서명은 int foo (const char * filename, char const * const * const rowNames, char const * const * const columnNames)입니다. 그러나, 제 에디션에서 말했던 것처럼, 저는 신중하게 문서를 읽지 않아서 유감입니다. 시간 낭비입니다. 어쨌든, 모두 도와 줘서 고마워! – EXP0