Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: OmarHack en 7 Junio 2013, 17:25 pm



Título: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 7 Junio 2013, 17:25 pm
A ver si me podéis echar una mano con este código.
Lo que quiero es que ejecute una acción si las letras introducidas por teclado (qw) coinciden con las especificadas en el if.

Podría hacer un arreglo de 3 caracteres que almacenara "qw" y compararlo con "palabra" pero voy a incluir muchísimas combinaciones de letras y tendría que declarar muchísimos arreglos, con este código me ahorraría cientos de lineas y el código sería más legible pero en la linea del "if" me da el error:
Citar
ISO C++ forbids comparison between pointer and integer

También me salta un warning pero, ¿creo que solo me avisa de que estoy comparando una variable con una constante no?
Citar
multi-character character constant
 

Código
  1. #include <iostream>
  2. char palabra[20];      
  3. int main() {            
  4. std::cout << "introduce letras";    
  5. std::cin >> palabra;
  6. if (palabra == 'qw')
  7. {std::cout <<"\nHola mundo";}
  8. getchar();            
  9. getchar();            
  10. return 0;}


Aquí el código comentado:
Código
  1. #include <iostream> //Incluir biblioteca entrada salida.
  2. char palabra[20];      //Cadena de caracteres global.
  3. int main() {             //Funcion principal.
  4. std::cout << "introduce letras";    //Muestra el texto.
  5. std::cin >> palabra;//Recoge texto del teclado y se lo asigna a "palabra".
  6. if (palabra == 'qw') //Si se introdujo por teclado "qw"
  7. {std::cout <<"\nHola mundo";}  //muestra el texto.
  8. getchar();            //No cierra hasta que se pulse enter.
  9. getchar();               //No cierra hasta que se pulse enter.
  10. return 0;}                   //Devuelve 0 a la funcion.

PD: Poniéndolo así soluciono el warning:
Código
  1. if (palabra[20] == "qw")
Pero me sigue dando el mismo error.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: pacoperico en 7 Junio 2013, 17:30 pm
En tu codigo palabra no es una variable sino una constante apuntador es decir, el nombre de un arreglo es un puntero de tipo constante y que apunta al primer elemento del arreglo, palabra es lo mismo que &palabra[0].

El arreglo palabra[] declaralo como de tipo string a ver que tal.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: pacoperico en 7 Junio 2013, 17:43 pm
PD: Poniéndolo así soluciono el warning:
Código
  1. if (palabra[20] == "qw")
Pero me sigue dando el mismo error.

No estas comparando el arreglo palabra[] con "qw", estas comparando el elemento numero 20 del arreglo palabra[] con "qw"


Código
  1. #include <iostream>
  2. #include <string>
  3. std::string palabra;      
  4. int main() {            
  5. std::cout << "introduce letras";    
  6. std::cin >> palabra;
  7. if (palabra == "qw")
  8. {std::cout <<"\nHola mundo";}
  9. getchar();            
  10. getchar();            
  11. return 0;
  12. }
  13.  


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: CCross en 7 Junio 2013, 17:51 pm
El error se debe a que estas intentando comparar un puntero con un entro y esto esta
prohibido lo mejor para estos casos es usar la funcion strcmp quedaria asi:

Código
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. int main() {
  5.    char palabra[20]= {0};
  6.  
  7.    std::cout << "introduce letras: ";
  8.    std::cin >> palabra;
  9.  
  10.    if(strcmp(palabra, "qw")==0)
  11.    std::cout <<"\nHola mundo";
  12.    std::cin.get();
  13.  
  14.    return 0;}
  15.  

Saludos  ;D


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 7 Junio 2013, 18:00 pm
El error se debe a que estas intentando comparar un puntero con un entro y esto esta
prohibido lo mejor para estos casos es usar la funcion strcmp quedaria asi:

Código
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. int main() {
  5.    char palabra[20]= {0};
  6.  
  7.    std::cout << "introduce letras: ";
  8.    std::cin >> palabra;
  9.  
  10.    if(strcmp(palabra, "qw"))
  11.    std::cout <<"\nHola mundo";
  12.    std::cin.get();
  13.  
  14.    return 0;}
  15.  

Saludos  ;D
Gracias!
Hace justo lo contrario, si pongo por teclado qw no sale el texto, y si pongo otra cosa cualquiera si sale. ¿Cómo lo soluciono? Voy a mirar el uso de esa librería a ver que hace xD.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: maxim_o en 7 Junio 2013, 18:04 pm
Si estas usando c++, por que no usas string?


Código
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. string palabra;
  6. cout << "introduce letras";
  7. cin >> palabra;
  8. if (palabra == "qw")
  9. {
  10.    cout <<"\nHola mundo";
  11. }
  12. return 0;
  13. }
  14.  







Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: CCross en 7 Junio 2013, 18:06 pm
Hace justo lo contrario, si pongo por teclado qw no sale el texto, y si pongo otra cosa cualquiera si sale. ¿Cómo lo soluciono?
Disculpame se me escapo un detallito he editado el codigo de arriba ahora funciona
Saludos  ;)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 7 Junio 2013, 18:19 pm
Disculpame se me escapo un detallito he editado el codigo de arriba ahora funciona

Saludos  ;)
Muchas gracias! Ya lo arreglara yo también así:
Código
  1. if(strcmp(palabra, "qw") == 0)
  2.    {std::cout <<"\nHola mundo";}
  3.  
:)

Si estas usando c++, por que no usas string?


Código
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. string palabra;
  6. cout << "introduce letras";
  7. cin >> palabra;
  8. if (palabra == "qw")
  9. {
  10.    cout <<"\nHola mundo";
  11. }
  12. return 0;
  13. }
  14.  

¿Tan fácil? Pues no lo conocía, no hace mucho que uso cadenas de carácteres y en los dos cursos que estoy viendo (en c++) usaban "char palabra[20]"
¿Si quiero comparar por ejemplo la 3 letra de una cadena con la 4 de otra tengo que usar un for no? ¿O puedo hacerlo de alguna manera similar a esta: "palabra[2]"?

Muchas gracias a todos :)



Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 7 Junio 2013, 18:29 pm
¿O puedo hacerlo de alguna manera similar a esta: "palabra[2]"?
Puedes usar el operador [] sin problemas

Un ejemplo de uso de strings:

Código
  1. string Texto = "Cosita Linda";
  2.  
  3. Texto = "ABCDEFGHIJKLMNOPQRTST"; //Operador de asignacion, funciona incluso aunque la cadena sea mas grande que la anterior
  4.  
  5. Texto += "Otra cadena"; // Operador + para concatenar cadenas
  6.  
  7. cout<<Texto.size(); // La funcion size te indica el tamanyo de la cadena
  8.  
  9. if (Texto == "Esto") // Operador ==
  10.  
  11. cout<<Texto[0]; // Obtienes el primer caracter
  12. cout<<Texto[1]; // obtienes el segundo caracter
  13.  
  14. //...


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: maxim_o en 7 Junio 2013, 18:33 pm
Código
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main(){
  6.  
  7. string palabra;
  8. cout<< "Dame dos letras";
  9. cin>>palabra;
  10.  
  11. cout<<palabra[0]; // primera letra
  12. cout << palabra[1]; //primera letra
  13. cout<<palabra.length(); //tamaño total
  14. }

Se puede usar sin problemas igual....

Edito: Vale ya te lo habían resuelto.
Saludos


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 7 Junio 2013, 18:51 pm
Gracias, me solucionasteis un problema del copón!!! :)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 7 Junio 2013, 22:51 pm
Fallo.cpp `string' does not name a type
¿Cual es el problema? ¿Tengo que instalar la librería? ¿No la traen ya codeblocks o devcpp?
El include está echo y lo he probado tanto con #include <string.h> como con <string> como con <cstring> y nada.

PD: Solucionado y no sé ni que pasaba  :xD.
Si acabo el programa lo postearé aquí y espero que os guste. Es para el concurso de programación del foro! 


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 8 Junio 2013, 00:17 am
¿Cual es el problema? ¿Tengo que instalar la librería?
String forma parte de la librería estándar del lenguaje. Todo compilador debe tenerla instalada.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: rir3760 en 8 Junio 2013, 02:13 am
Fallo.cpp `string' does not name a type
¿Cual es el problema? ¿Tengo que instalar la librería? ¿No la traen ya codeblocks o devcpp?
El include está echo y lo he probado tanto con #include <string.h> como con <string> como con <cstring> y nada.
Debes incluir el encabezado <string> y referirte a la clase como "std::string" ya que se encuentra en el espacio de nombres estándar.

Para utilizar solo "string" debes primero utilizar la sentencia "using std::string;" o bien "using namespace::std;".

Un saludo


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: flony en 8 Junio 2013, 04:15 am
una posible solucion seria
Código:
#include<iostream>
#include<string>
using namespace std;

int main()
{
string palabra;
string palabra2;
palabra2="qw";
cout<<"introduce una palabra";
getline(cin, palabra);
if (palabra ==palabra2)
{
cout<<"hola mundo";
}
else
{
cout<<"casi";
}
system("PAUSE");
return 0;
}


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 8 Junio 2013, 13:54 pm
Ahora va perfecto, ya acabé el programa, ahora a meterle funcionalidades y portarlo a otras plataformas! Muchas gracias a todos! :silbar: Fijo que a muchos va a encantar. ;)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 08:00 am
¿Y sin string, o sea programando nosotros lo que en el fondo hace string?:

Código
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. char palabra[20]={0},palabra2[]="qw";
  5. cout << "introduce letras: ";
  6. cin >> palabra;
  7. int i;
  8. for (i=0;palabra[i]!='\0';i++)
  9.    if (palabra[i]==palabra2[i])
  10.        continue;
  11. if (i==2)
  12.    cout <<"Hola mundo";
  13. cin.get();
  14. return 0;}
  15.  

Saluditos desde Gran Canaria! .... ..(http://i1280.photobucket.com/albums/a497/leosansan/CANARIAS/mapa-canarias2_zps2d9868dc.jpg)
(http://st.forocoches.com/foro/images/smilies/dancer2.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: rir3760 en 9 Junio 2013, 08:53 am
En el bucle:
Código
  1. for (i=0;palabra[i]!='\0';i++)
  2.   if (palabra[i]==palabra2[i])
  3.      continue;
El condicional no tiene efecto.

Debería ser:
Código
  1. for (i = 0; palabra[i] != '\0'; i++)
  2.   if (palabra[i] != palabra2[i])
  3.      break;
O:
Código
  1. for (i = 0; palabra[i] != '\0' && palabra[i] == palabra2[i]; i++)
  2.   ;

Así al terminar el bucle basta con comparar los últimos caracteres para saber si las cadenas son iguales.

Un saludo


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: flony en 9 Junio 2013, 09:00 am
no opine porque me gustaba el tema de inventar la rueda de nuevo :) (frase sacada de aprendiendo c++de deitel)
lo unico para objetar si pone una palabra mayor o igual a 20 que pasaria


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 09:13 am
En el bucle:
Código
  1. for (i=0;palabra[i]!='\0';i++)
  2.   if (palabra[i]==palabra2[i])
  3.      continue;
El condicional no tiene efecto.

tiene efecto, combinado con la línea que le sigue. Fíjate bien en el if con la i, y si no pruébalo Otra cosa es que pierda eficiencia al comparar más allá del número de caracteres de palabra2. Sin dudarlo un instante me quedo con:

Citar

Código
  1. for (i = 0; palabra[i] != '\0' && palabra[i] == palabra2[i]; i++)
  2.   ;


Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 9 Junio 2013, 13:31 pm
Se podría cambiar sin problemas, pero eso haría el código más extenso. Aún que está genial saber como se hizo la rueda por si le quieres quitar las llantas y meterle otras más grandes. ;)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 13:40 pm
¿Y sin string, o sea programando nosotros lo que en el fondo hace string?:
Estás limitando la entrada a 19 letras (como le metas 25 te va a dar un desbordamiento de buffer).

Me parece que esto sería más correcto:

Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <vector>
  4. using namespace std;
  5. int main()
  6. {
  7.    char valor;
  8.    vector<char> palabra;
  9.    char palabra2[]="qw";
  10.  
  11.    cout << "introduce letras: ";
  12.    valor = getch();
  13.    do
  14.    {
  15.  
  16.        palabra.push_back(valor);
  17.        cout<<valor;
  18.        valor = getch();
  19.    }
  20.    while (valor != '\r'); // Enter
  21.  
  22.    cout<<endl;
  23.  
  24.    palabra.push_back('\0');
  25.    int i;
  26.    for (i=0; palabra[i]!='\0'; i++)
  27.        if (palabra[i]==palabra2[i])
  28.            continue;
  29.    if (i==2)
  30.        cout <<"Hola mundo";
  31.    cin.get();
  32.    return 0;
  33. }
  34.  


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 15:21 pm
Estás limitando la entrada a 19 letras (como le metas 25 te va a dar un desbordamiento de buffer).

Me parece que esto sería más correcto:

Código
  1. #include <iostream>
  2. [color=red][size=10pt][b]#include <conio.h>[/b][/size][/color]
  3. [size=10pt][b]#include <vector>[/b][/size]
  4. using namespace std;
  5. int main()
  6. {
  7.   .....................................
  8.  

¡amchcon has hecho uso de la librería conio ..... y de getch!. ¡¡¡¡Dos pecados mortales !!!!! :laugh:

Pues yo, siguiendo los pasos del maestro rir ,hago otra propuesta, eso sí espero que alguien la "pase" a C++  ;) ....a buen entendedor, pocas palabras:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.    char *palabra,*aux,palabra2[]="qw";
  7.    int ch;
  8.    int i=0,j=0;
  9.    palabra = NULL;
  10.    while ((ch = getchar()) != '\n'){
  11.        if ((aux = realloc(palabra, (i + 10) * sizeof *palabra)) == NULL){
  12.            puts("No hay espacio en memoria\n");
  13.            free(palabra);
  14.            return EXIT_FAILURE;
  15.        }
  16.        palabra = aux;
  17.        palabra[i++] = ch;
  18.    }
  19.    palabra[i++] = '\0';
  20.    for (i = 0; palabra[i] != '\0'; i++)
  21.        if (palabra[i] != palabra2[i])
  22.            break;
  23.    if (i==2)
  24.        {puts("Hola mundo\n");}
  25.   return EXIT_SUCCESS;
  26. }
  27.  

Saluditos! .... ..

(http://st.forocoches.com/foro/images/smilies/simba1.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 15:44 pm
¡amchcon has hecho uso de la librería conio ..... y de getch!. ¡¡¡¡Dos pecados mortales !!!!! :laugh:
:silbar: :silbar: :silbar: :silbar:

Tú código está bastante correcto. Lo que mejoraría son los reallocs, en vez de 1 en 1 hazlos de 5 en 5 o de 10 en 10 (El realloc puede ser una operación costosa).

eso sí espero que alguien la "pse" a C++
¡Adelante!  ;-)

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. char* Realloc(char* Puntero,int Original,int Final);
  6.  
  7. const int INTERVALO_REALLOC = 5;
  8.  
  9. int main(void)
  10. {
  11.    char *palabra,*aux,palabra2[]="qw";
  12.    int ch;
  13.    int i=0,j=0;
  14.    int ultimorealloc = 0;
  15.    palabra = NULL;
  16.  
  17.    aux = new char[INTERVALO_REALLOC];
  18.  
  19.    while ((ch = cin.get()) != '\n')
  20.   {
  21.        if ((i-ultimorealloc) == INTERVALO_REALLOC)
  22.        {
  23.            ultimorealloc = i;
  24.  
  25.            if ((aux = Realloc(palabra,i, (i + INTERVALO_REALLOC) * sizeof *palabra)) == NULL){
  26.                cerr<<"No hay espacio en memoria\n";
  27.                delete[] palabra;
  28.                return 1;
  29.            }
  30.  
  31.        }
  32.        palabra = aux;
  33.        palabra[i++] = ch;
  34.    }
  35.    palabra[i++] = '\0';
  36.    cout<<palabra<<endl;
  37.    for (i = 0; palabra[i] != '\0'; i++)
  38.    if (palabra[i] != palabra2[i])
  39.      break;
  40.    if (i==2)
  41.        cout<<"Hola mundo\n";
  42.  
  43.    cout<<palabra;
  44. //cin.get();
  45.   return 0;
  46. }
  47.  
  48.  
  49. char* Realloc(char* Puntero,int Original,int Final)
  50. {
  51.    char* Aux = new(nothrow) char[Final];
  52.  
  53.    if (!Aux)
  54.        return NULL;
  55.  
  56.    for (int i = 0; i < Original;i++)
  57.    {
  58.        Aux[i] = Puntero[i];
  59.    }
  60.  
  61.    delete[] Puntero;
  62.  
  63.    return Aux;
  64. }


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 9 Junio 2013, 16:37 pm
¿Se os ocurre como hacer que si el texto introducido por teclado lleva un espacio se guarde en otro string?
Que haga algo así:
Código
  1. if (string1 tiene un espacio)
  2. {
  3. guardar hasta el espacio string1;
  4. guardar a partir del espacio hasta el siguiente espacio o final del texto en string2;
  5. if (string2 tiene un espacio)
  6. {
  7. guardar a partir del espacio hasta el siguiente espacio o final del texto en string3;
  8. ........................................................
  9. }
  10. }

Al poner por ejemplo en el programa: "paco gonzalez martinez"
guarde "paco" en string1, "gonzalez" en string2 y "martinez" en string3.

Así podré ejecutar acciones para todos los que sean gonzalez de primer apellido, independientemente de si se llaman paco o tienen de segundo apellido martinez o gonzalez o lo que sea.

Llevo bastante buscando y no encuentro nada que me sirva.
A ver si vosotros sabéis.
Si encuentro algo lo pondré aquí.
Saludos.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 16:43 pm

Duda de novatillo en C++, ¿no sería más simple usar realloc en C++, como yo hice en C. o no se puede?. La verdad es que lo he intentado pero con resultados "insatisfactorios".


Saluditos! .... ..

(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 16:57 pm
Duda de novatillo en C++, ¿no sería más simple usar realloc en C++, como yo hice en C. o no se puede?. La verdad es que lo he intentado pero con resultados "insatisfactorios".


Saluditos! .... ..

(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

El realloc de C funciona claro:

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char* cosa = new char[3];
  9.    realloc(cosa,50);
  10.  
  11.    for (int i = 0; i < 50;i++)
  12.      cosa[i] = i+48;
  13.  
  14.    cosa[49] = '\0';
  15.  
  16.    cout<<cosa;
  17.    return 0;
  18. }

Pero tu me has dicho C++ puro asi que :S

¿Se os ocurre como hacer que si el texto introducido por teclado lleva un espacio se guarde en otro string?
Que haga algo así:
Código
  1. if (string1 tiene un espacio)
  2. {
  3. guardar hasta el espacio string1;
  4. guardar a partir del espacio hasta el siguiente espacio o final del texto en string2;
  5. if (string2 tiene un espacio)
  6. {
  7. guardar a partir del espacio hasta el siguiente espacio o final del texto en string3;
  8. ........................................................
  9. }
  10. }

Al poner por ejemplo en el programa: "paco gonzalez martinez"
guarde "paco" en string1, "gonzalez" en string2 y "martinez" en string3.

Así podré ejecutar acciones para todos los que sean gonzalez de primer apellido, independientemente de si se llaman paco o tienen de segundo apellido martinez o gonzalez o lo que sea.

Llevo bastante buscando y no encuentro nada que me sirva.
A ver si vosotros sabéis.
Si encuentro algo lo pondré aquí.
Saludos.

Pues:

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    string Nombres[3];
  9.  
  10.    for (int i = 0; i <3;i++)
  11.        cin>>Nombres[i];
  12.  
  13.       for (int i = 0; i <3;i++)
  14.        cout<<Nombres[i]<<endl;
  15.  
  16.    return 0;
  17. }
  18.  

Cuando termines de meter nombres le das a enter y listo :S


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: rir3760 en 9 Junio 2013, 17:23 pm
Cita de: rir3760
En el bucle:
Código
  1. for (i=0;palabra[i]!='\0';i++)
  2.   if (palabra[i]==palabra2[i])
  3.      continue;
El condicional no tiene efecto.

tiene efecto, combinado con la línea que le sigue. Fíjate bien en el if con la i, y si no pruébalo
Para explicarlo mejor, el bucle es:
Código
  1. int i;
  2. for (i = 0; palabra[i] != '\0'; i++)
  3.   if (palabra[i] == palabra2[i])
  4.      continue;
  5.  
  6. if (i==2)
  7.   cout <<"Hola mundo";
El cuerpo de este es una sola sentencia, el condicional:
Código
  1. if (palabra[i] == palabra2[i])
  2.   continue;
Si se cumple la condición (los caracteres son iguales) se pasa a la siguiente iteracion del bucle (debido a la sentencia "continue;") y si no se cumple como no hay mas que ejecutar ... también.

En algunas ocasiones utilizas bucles como este:
Código
  1. for (i = 0; palabra[i] != '\0'; i++)
  2.   if (palabra[i] == palabra2[i])
  3.      continue;
  4.   else
  5.      break;
Supongo la intención con el programa (de este tema) es la misma.

Un saludo


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 9 Junio 2013, 17:56 pm
rir3760, no me enteré de nada. :xD
¿Cuál es la diferencia con el código que puso Amchacon?
PD: Gracias y perdón por mi ignorancia!


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 18:01 pm
Rit estaba contestando a Leo no a ti.


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 18:24 pm
....................................

No sé si te has fijado que has respondido a mi primer post de la página anterior, al cual ya respondí.

Me gustaría tu opinión resecto al segundo código que propuse en C y su portabilidad a C++. Me da error en C++ el uso de realloc. "I don´t know".

Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 18:26 pm
No sé si te has fijado que has respondido a mi primer post de la página anterior, al cual ya respondí.

Me gustaría tu opinión resecto al segundo código que propuse en C y su portabilidad a C++. Me da error en C++ el uso de realloc. "I don´t know".

Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

Realloc debería funcionar en C++ perfectamente, debe ser otro fallo.

Ponnos el código aquí para que podamos opinar  :rolleyes:


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 18:57 pm
Realloc debería funcionar en C++ perfectamente, debe ser otro fallo.

Ponnos el código aquí para que podamos opinar  :rolleyes:

Error:

Citar

error: invalid conversion from 'void*' to 'char*' [-fpermissive]|


Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5. int main(void)
  6. {
  7.    char *palabra=NULL,*aux,palabra2[]="qw";
  8.    int ch;
  9.    int i=0,j=0;
  10.    i = 0;
  11.    while (ch = cin.get() != '\n')
  12.    {
  13.        if ((aux = realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)
  14.        {
  15.            cout<<"No hay espacio en memoria"<<endl;
  16.            free(palabra);
  17.            return 1;
  18.        }
  19.        palabra = aux;
  20.        palabra[i++] = ch;
  21.   }cout<<palabra<<endl;
  22.   palabra[i++] = '\0';
  23.    for (i = 0; palabra[i] != '\0'; i++)
  24.    if (palabra[i] != palabra2[i])
  25.        break;
  26.    if (i==2)
  27.        cout<<palabra<<endl;
  28.    cin.get();
  29.    return 0;
  30. }
  31.  

Saluditos! .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 19:13 pm
Código
  1. error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
Esto es porque realloc devuelve void* y no char*. El compilador no te lo permite porque estás usando un C++ estricto.

Puedes hacer un cast a char*:

Código
  1. (aux = (char*)realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)

La opción 2 es desactivar el C++ estricto:

(http://imageshack.us/a/img841/3452/sinttuloeok.png)

Otro error que tienes es que vas a aumentando elrealloc de 10 en 10. Esto estaría correcto si no lo hicieras en cada iteración del bucle. La idea es ahorrarse reallocs pero estás haciendo los mismos y reservando x10 memoria.

Otro error más es que intentas mostrar la palabra antes de haber puesto el caracter nulo. Por último se te han olvidado parentesís en el while. Corregidos esos errores:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5. int main(void)
  6. {
  7.    char *palabra=NULL,*aux,palabra2[]="qw";
  8.    int ch;
  9.    int i=0;
  10.    i = 0;
  11.  
  12.    while ((ch = cin.get()) != '\n')
  13.    {
  14.        if ((aux = (char*)realloc(palabra, (i+1) * sizeof *palabra)) == NULL)
  15.        {
  16.            cout<<"No hay espacio en memoria"<<endl;
  17.            free(palabra);
  18.            return 1;
  19.        }
  20.        palabra = aux;
  21.        palabra[i++] = ch;
  22.    }
  23.  
  24.    palabra[i++] = '\0';
  25.    for (i = 0; palabra[i] != '\0'; i++)
  26.        if (palabra[i] != palabra2[i])
  27.            break;
  28.   // if (i==2)
  29.        cout<<palabra<<endl;
  30.    cin.get();
  31.    return 0;
  32. }

Y aplicado a mi antiguo código con el ajuste "amortiguado" de realloc:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. const int INTERVALO_REALLOC = 5;
  7.  
  8. int main(void)
  9. {
  10.    char *palabra,*aux,palabra2[]="qw";
  11.    int ch;
  12.    int i=0,j=0;
  13.    int ultimorealloc = 0;
  14.    palabra = NULL;
  15.  
  16.    aux = new char[INTERVALO_REALLOC];
  17.  
  18.    while ((ch = cin.get()) != '\n')
  19.   {
  20.        if ((i-ultimorealloc) == INTERVALO_REALLOC)
  21.        {
  22.            ultimorealloc = i;
  23.  
  24.            if ((aux = (char*)realloc(palabra, (i + INTERVALO_REALLOC) * sizeof *palabra)) == NULL){
  25.                cerr<<"No hay espacio en memoria\n";
  26.                delete[] palabra;
  27.                return 1;
  28.            }
  29.  
  30.        }
  31.        palabra = aux;
  32.        palabra[i++] = ch;
  33.    }
  34.    palabra[i++] = '\0';
  35.    cout<<palabra<<endl;
  36.    for (i = 0; palabra[i] != '\0'; i++)
  37.    if (palabra[i] != palabra2[i])
  38.      break;
  39.    if (i==2)
  40.        cout<<"Hola mundo\n";
  41.  
  42.    cout<<palabra;
  43. //cin.get();
  44.   return 0;
  45. }


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 20:07 pm
Código
  1. error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
Esto es porque realloc devuelve void* y no char*. El compilador no te lo permite porque estás usando un C++ estricto.

Puedes hacer un cast a char*:

Código
  1. (aux = (char*)realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)

La opción 2 es desactivar el C++ estricto:


Otro error que tienes es que vas a aumentando elrealloc de 10 en 10. Esto estaría correcto si no lo hicieras en cada iteración del bucle. La idea es ahorrarse reallocs pero estás haciendo los mismos y reservando x10 memoria.
....................

Que malo es intentar hacer las cosas contra reloj sabiendo que el diablo está en los pequeños detalles y, peor aún, copiando directamente del C a C++ sin pensar propiamente en C++. !Mea culpa", hago propósito de enmienda.  ;)

¿Podrías explicarme brevemente que es eso del "C++ estricto?.

Y para que no se diga, una solución "rarita", como diría el amigo Pantalàimon:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6.    int i = -1,x=0;
  7.    char palabra2[]="qw";
  8.        while (i<2)
  9.        {
  10.                for ( x = 0; x <=255; x++)
  11.                {
  12.                        if (GetAsyncKeyState(x) == -32767)
  13.                        {
  14.                                 i++;
  15.                                 if (x+32==palabra2[i] && i<2)
  16.                                    {
  17.                                        printf ("%c", palabra2[i]);
  18.                                        continue;
  19.                                    }
  20.                                if  (x+32!=45 )
  21.                                {
  22.                                puts ( "\nNo coincide.");
  23.                                system ("pause");return 1;
  24.                                }
  25.                                else
  26.                                    puts ("\nHola\n");
  27.                    }
  28.                }
  29.        }
  30.    system ("pause");
  31.    return 0;
  32. }
  33.  

Saluditos! .... ..

(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 20:25 pm
¿Podrías explicarme brevemente que es eso del "C++ estricto?.
El termino no es oficial, me lo acabo de inventar yo.

Según el estándar de C++, hay algunas operaciones que no están permitidas porque se consideran ambiguas. Sin embargo, Mingw permite usar el flag "-fpermisive" por lo cual puede digerir esas operaciones.

En este caso, supongo que mingw hará un cast implícito a (char*). Según el estándar tendrías que hacer un cast explícito, tal y como lo he puesto ahí.

PD: Esa solución me ha matado  :o

Que fea es  ;-)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 20:41 pm
El termino no es oficial, me lo acabo de inventar yo.

Según el estándar de C++, hay algunas operaciones que no están permitidas porque se consideran ambiguas. Sin embargo, Mingw permite usar el flag "-fpermisive" por lo cual puede digerir esas operaciones.

En este caso, supongo que mingw hará un cast implícito a (char*). Según el estándar tendrías que hacer un cast explícito, tal y como lo he puesto ahí.

Me ha quedado clarito, clarito. Thanks!.

PD: Esa solución me ha matado  :o

Que fea es  ;-)

Ya "previne" que era "rarita". Como puedes observar, hago uso de una api para leer el teclado y lo demás viene por añadidura. Por practicar y que no se me oxiden las ideas. Al menos espero haber "sorprendido" a alguno por el "recorte" en seco respecto de lo que estábamos haciendo. ;)

Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


P.D: Por cierto, "-fpermissive" con una o dos "s".


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: OmarHack en 9 Junio 2013, 21:06 pm
Rit estaba contestando a Leo no a ti.
Ya decía yo que no me cuadraba algo.  :xD


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 9 Junio 2013, 22:39 pm
Ya decía yo que no me cuadraba algo.  :xD

Es rir o para ser más solemnes/precisos rir3760 (http://foro.elhacker.net/profiles/rir3760-u131561.html).

 Por si no lo sabías, para mí el maestro de maestros en esto del C/C++. Disfruto/aprendo como un niño con todas sus aportaciones/correciones/puntualizaciones. Sin duda, el más grande en cuanto al conocimiento en profundidad de los lenguajes mencionados .... e imagino que de algunos más.


Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: amchacon en 9 Junio 2013, 23:03 pm
P.D: Por cierto, "-fpermissive" con una o dos "s".
Con 2 ss como dice el error:

Código
  1. error: invalid conversion from 'void*' to 'char*' [-fpermissive]|

¿Puse 1s? Me cachis  :rolleyes:

Me ha quedado clarito, clarito. Thanks!.
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: flony en 10 Junio 2013, 04:34 am
jijiji sabia que se iban a ir a memoria dinamica....si leen bien el problema, la igualdad debe ser 2 char "qw" si tiene mas de dos caracteres la entrada por teclado con eso basta para anular el ingreso de mas palabras


Título: Re: Error raro en la compilación de este sencillo código.
Publicado por: leosansan en 10 Junio 2013, 07:52 am
jijiji sabia que se iban a ir a memoria dinamica......

Pues mi último código no usa ni dinámica ni estática, tan sólo hace uso del "eco" del teclado para ver si la cadena que se ingresa es justito "qw".

No obstante el camino más corto, exceptuando el último al que acabo de hacer referencia que no hace uso de un array o vector para la cadena introducida, posiblemente sea el que marcó maxim_o, que fue, siendo justos,  el primero en hacer uso de string y que si atendemos a lo que quería OmarHack:

A ver si me podéis echar una mano con este código.
Lo que quiero es que ejecute una acción si las letras introducidas por teclado (qw) coinciden con las especificadas en el if.
Podría hacer un arreglo de 3 caracteres que almacenara "qw" y compararlo con "palabra" pero voy a incluir muchísimas combinaciones de letras y tendría que declarar muchísimos arreglos, con este código me ahorraría cientos de lineas y el código sería más legible

en esencia creo que se reduciría a :

Código
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    string Nombre,nombre;
  8.    cout<<"Introduce cadena a comparar (qw o lo que sea):" ;
  9.    getline(cin, nombre);
  10.    cout<<"Inroduce letras a ver si coinciden con la anterior:" ;
  11.    getline(cin, Nombre);
  12.    if (Nombre==nombre)
  13.        cout <<"Coinciden"<<endl;
  14.   else
  15.      cout <<"No coinciden"<<endl;
  16.   return 0;
  17. }
  18.  

A lo breve.

Lo que surgió después fue un "a ver de que soy capaz", en el supuesto de que la cadena "qw" estaba prefijada y la cadena de entrada podía ser cualquier cosa. Un simple ejercicio de come cocos que ha tenido animado este tema.  ;)


Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)