2010-05-21 22 views
8

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:

  1. realiza la conversión provoca un comportamiento indefinido? Si es así, ¿por qué?

  2. ¿Cuál es la forma correcta de pasar el vector de cadena a foo (char const * const * const)?

Respuesta

1

Bueno, me parece correcto. c_str crea una matriz terminada nula de char que es constante hasta la siguiente operación de cadena no const. Almacena los punteros c_str en una matriz const char *.

No soy especialista en sobrealimentación así que el problema podría estar allí, pero supongo que sus cadenas en el vector están en una codificación que es incompatible con la que se espera en la función foo.

Compruebe su código desde el punto de vista de la codificación.

MY2C

5

Desde foo sólo toma un puntero, mi suposición es que requiere una matriz terminada en NULL. Asigne un elemento adicional para aR y asígnele NULL.

Mi sugerencia sería:

std::vector<const char*> c_strings; 
c_strings.reserve(aNames.size() + 1); 

std::transform(
    aNames.begin(), aNames.end(), 
    std::back_inserter(c_strings), 
    boost::bind(&std::string::c_str, _1) 
    ); 

c_strings.push_back(0); 
foo(&c_strings[0]); 
+0

+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. –

+0

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

+0

¡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

1

Prueba esto:

std::vector<char*> arr(aNames.size()+1); 
for(size_t i = 0; i < aNames.size(); ++i) 
    arr[i] = aNames[i].c_str(); 
arr[arr.size()-1] = NULL; // just in case 
foo(&arr[0]); 
+1

No se compilará - 'c_str' devuelve un' const char * ' –

+0

Ok. Cambiar el vector para contener elementos "const char *" compila para mí ahora. –

Cuestiones relacionadas