Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: jonniemaxxx en 24 Mayo 2014, 03:52 AM

Título: Conversion de String Constante a Char*
Publicado por: jonniemaxxx en 24 Mayo 2014, 03:52 AM
Hola, ando haciendo un programa para mis clases de Programacion basica, lo he terminado pero no entiendo porque me bota un warning en esta funcion

Código (cpp) [Seleccionar]
char* Item_Name(int Item){
    char* ItemName[10];
    ItemName[0] = "Producto 1";
    ItemName[1] = "Producto 2";
    ItemName[2] = "Producto 3";
    ItemName[3] = "Producto 4";
    ItemName[4] = "Producto 5";
    ItemName[5] = "Producto 6";
    ItemName[6] = "Producto 7";
    ItemName[7] = "Producto 8";
    ItemName[8] = "Producto 9";
    ItemName[9] = "Producto 10";
    //Retorna el Nombre del Producto Item
    return ItemName[Item-1];
};


Les agradeceria su Colaboracion aunque el programa funcione quiero quitarle ese warning :3 utilizo Code Blocks
Título: Re: Conversion de String Constante a Char*
Publicado por: x64core en 24 Mayo 2014, 04:05 AM
Cita de: jonniemaxxx en 24 Mayo 2014, 03:52 AM
Hola, ando haciendo un programa para mis clases de Programacion basica, lo he terminado pero no entiendo porque me bota un warning en esta funcion

Código (cpp) [Seleccionar]
char* Item_Name(int Item){
    char* ItemName[10];
    ItemName[0] = "Producto 1";
    ItemName[1] = "Producto 2";
    ItemName[2] = "Producto 3";
    ItemName[3] = "Producto 4";
    ItemName[4] = "Producto 5";
    ItemName[5] = "Producto 6";
    ItemName[6] = "Producto 7";
    ItemName[7] = "Producto 8";
    ItemName[8] = "Producto 9";
    ItemName[9] = "Producto 10";
    //Retorna el Nombre del Producto Item
    return ItemName[Item-1];
};


Les agradeceria su Colaboracion aunque el programa funcione quiero quitarle ese warning :3 utilizo Code Blocks
¿En que linea exactamente? En la asinación de los punteros? o en el retorno?
de todas maneras simplemente hacer un casting o hacer la declaracion de la variable como constante aunque esa manera de obtener el puntero
no me gusta porqué no crear un array de punteros global?
Título: Re: Conversion de String Constante a Char*
Publicado por: jonniemaxxx en 24 Mayo 2014, 04:27 AM
o sea de la linea 3 a la linea 12 hahaha como lo harias tu ? ando algo perdido y si en la asignacion
Título: Re: Conversion de String Constante a Char*
Publicado por: x64core en 24 Mayo 2014, 05:06 AM
Cita de: jonniemaxxx en 24 Mayo 2014, 04:27 AM
o sea de la linea 3 a la linea 12 hahaha como lo harias tu ? ando algo perdido y si en la asignacion
Simplemente crear el array:
const char* ItemName[] = {
"Producto 1",
"Producto 2",
"Producto 3",
"Producto 4",
"Producto 5",
"Producto 6",
"Producto 7",
"Producto 8",
"Producto 9",
"Producto 10"
};


char* Item_Name(int Item){
  // validate it
  if(Item <= sizeof(ItemName) / sizeof(ItemName[0]))
   {
   return ItemName[Item-1];
  }
  return NULL;
};
Título: Re: Conversion de String Constante a Char*
Publicado por: rir3760 en 24 Mayo 2014, 16:08 PM
Cita de: jonniemaxxx en 24 Mayo 2014, 03:52 AMno entiendo porque me bota un warning en esta funcion
Código (cpp) [Seleccionar]
char* Item_Name(int Item)
{
    char* ItemName[10];
   
    ItemName[0] = "Producto 1";
    ItemName[1] = "Producto 2";
   
    // ...
   
    return ItemName[Item-1];
};
Se presenta el mensaje de advertencia porque en C++ una cadena literal como "Producto 1" es de tipo "const char [N]" y este, en las asignaciones y sentencia de retorno, genera un valor de tipo "const char *". El problema es que los tipos no coinciden ya que tanto la función como los elementos del array los declaras de tipo "char *" (sin el calificador const).

Una solución ya la indico x64Core, otra opción es simplemente utilizar el tipo correcto:
Código (cpp) [Seleccionar]
const char *Item_Name(int Item)
{
const char *ItemName[10];

ItemName[0] = "Producto 1";
ItemName[1] = "Producto 2";

// ...

return ItemName[Item - 1];
}


Un saludo
Título: Re: Conversion de String Constante a Char*
Publicado por: jonniemaxxx en 24 Mayo 2014, 20:19 PM
Oye muchas gracias ahora si :D esa respuesta es mas acorde con mi nivel actual de conocimiento :D jaja