Error raro en la compilación de este sencillo código.

Iniciado por OmarHack, 7 Junio 2013, 17:25 PM

0 Miembros y 1 Visitante están viendo este tema.

leosansan

Cita de: rir3760 en  9 Junio 2013, 17:23 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! .... ..


amchacon

Cita de: 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! .... ..


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

Ponnos el código aquí para que podamos opinar  :rolleyes:
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

Cita de: amchacon en  9 Junio 2013, 18:26 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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;
int main(void)
{
    char *palabra=NULL,*aux,palabra2[]="qw";
    int ch;
    int i=0,j=0;
    i = 0;
    while (ch = cin.get() != '\n')
    {
        if ((aux = realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)
        {
            cout<<"No hay espacio en memoria"<<endl;
            free(palabra);
            return 1;
        }
        palabra = aux;
        palabra[i++] = ch;
   }cout<<palabra<<endl;
   palabra[i++] = '\0';
    for (i = 0; palabra[i] != '\0'; i++)
    if (palabra[i] != palabra2[i])
        break;
    if (i==2)
        cout<<palabra<<endl;
    cin.get();
    return 0;
}


Saluditos! .... ..


amchacon

#33
Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
(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.

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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;
int main(void)
{
   char *palabra=NULL,*aux,palabra2[]="qw";
   int ch;
   int i=0;
   i = 0;

   while ((ch = cin.get()) != '\n')
   {
       if ((aux = (char*)realloc(palabra, (i+1) * sizeof *palabra)) == NULL)
       {
           cout<<"No hay espacio en memoria"<<endl;
           free(palabra);
           return 1;
       }
       palabra = aux;
       palabra[i++] = ch;
   }

   palabra[i++] = '\0';
   for (i = 0; palabra[i] != '\0'; i++)
       if (palabra[i] != palabra2[i])
           break;
  // if (i==2)
       cout<<palabra<<endl;
   cin.get();
   return 0;
}


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

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

const int INTERVALO_REALLOC = 5;

int main(void)
{
   char *palabra,*aux,palabra2[]="qw";
   int ch;
   int i=0,j=0;
   int ultimorealloc = 0;
   palabra = NULL;

   aux = new char[INTERVALO_REALLOC];

   while ((ch = cin.get()) != '\n')
  {
       if ((i-ultimorealloc) == INTERVALO_REALLOC)
       {
           ultimorealloc = i;

           if ((aux = (char*)realloc(palabra, (i + INTERVALO_REALLOC) * sizeof *palabra)) == NULL){
               cerr<<"No hay espacio en memoria\n";
               delete[] palabra;
               return 1;
           }

       }
       palabra = aux;
       palabra[i++] = ch;
   }
   palabra[i++] = '\0';
   cout<<palabra<<endl;
   for (i = 0; palabra[i] != '\0'; i++)
   if (palabra[i] != palabra2[i])
     break;
   if (i==2)
       cout<<"Hola mundo\n";

   cout<<palabra;
//cin.get();
  return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#34
Cita de: amchacon en  9 Junio 2013, 19:13 PM
Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
(aux = (char*)realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)

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


Cita de: amchacon en  9 Junio 2013, 19:13 PM
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 (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
   int i = -1,x=0;
   char palabra2[]="qw";
       while (i<2)
       {
               for ( x = 0; x <=255; x++)
               {
                       if (GetAsyncKeyState(x) == -32767)
                       {
                                i++;
                                if (x+32==palabra2[i] && i<2)
                                   {
                                       printf ("%c", palabra2[i]);
                                       continue;
                                   }
                               if  (x+32!=45 )
                               {
                               puts ( "\nNo coincide.");
                               system ("pause");return 1;
                               }
                               else
                                   puts ("\nHola\n");
                   }
               }
       }
   system ("pause");
   return 0;
}


Saluditos! .... ..


amchacon

Cita de: leosansan en  9 Junio 2013, 20:07 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  ;-)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#36
Cita de: amchacon en  9 Junio 2013, 20:25 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!.

Cita de: amchacon en  9 Junio 2013, 20:25 PM
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! .... ..



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

OmarHack

I like to test things.

leosansan

#38
Cita de: OmarHack en  9 Junio 2013, 21:06 PM
Ya decía yo que no me cuadraba algo.  :xD

Es rir o para ser más solemnes/precisos rir3760.

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! .... ..

amchacon

Cita de: leosansan en  9 Junio 2013, 20:41 PMP.D: Por cierto, "-fpermissive" con una o dos "s".
Con 2 ss como dice el error:

Código (cpp) [Seleccionar]
error: invalid conversion from 'void*' to 'char*' [-fpermissive]|

¿Puse 1s? Me cachis  :rolleyes:

Cita de: leosansan en  9 Junio 2013, 20:41 PMMe ha quedado clarito, clarito. Thanks!.



Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar