Editar: Después de implementar la sugerencia de James Hopkin, sigo recibiendo las advertencias de "nombre inválido 'nulo'", que es mucho mejor que esos caracteres extraños. Luego, volví y leí nuevamente el documento de la biblioteca, y resulta que para esa función en particular, su argumento debería tener un elemento más de cadena no NULL que el tamaño de aNames. Esa cadena adicional tiene algún otro propósito. Después de agregar una cadena más, el código funciona bien. Todo es mi culpa, y lo siento mucho.cómo pasar el vector de cadena a foo (char const * const * const)?
Original post:
Hola,
Este es mi primer post así que por favor sea agradable. Busqué en este foro y busqué en Google pero todavía no puedo encontrar la respuesta. Este problema me ha molestado por más de un día, así que por favor dame algo de ayuda. Gracias.
Necesito pasar un vector de cadena a una función de biblioteca foo (char const * const * const). No puedo pasar el & Vec [0] ya que es un puntero a una cadena. Por lo tanto, tengo una matriz y paso el c_str() a esa matriz. La siguiente es mi código (anames es el vector de cadena):
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
Sin embargo, parece que causa un comportamiento indefinido:
Si funciono con el código anterior, entonces la función foo lanzar algunas advertencias acerca caracteres ilegales ('èI' blablabla) en aR.
Si imprimo aR antes de la función foo como esto:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
Entonces, todo está bien. Mis preguntas son:
realiza la conversión provoca un comportamiento indefinido? Si es así, ¿por qué?
¿Cuál es la forma correcta de pasar el vector de cadena a foo (char const * const * const)?
+1 Buena suposición. De hecho, la única posibilidad de encontrar un tamaño de matriz para la función 'foo' es encontrar el puntero NULL. –
Sí, ¡supongo! A menos que la firma de la función foo no sea la real. @ user347208: ¿Es esa la firma de función exacta? – neuro
¡Muchas gracias por su ayuda! @neuro: la firma exacta de la función es int foo (const char * filename, char const * const * const rowNames, char const * const * const columnNames). Sin embargo, como dije en mi edición, lamento no haber leído los documentos cuidadosamente y haber perdido el tiempo. De todos modos, ¡muchas gracias por su ayuda! – EXP0