Autor
|
Tema: Error raro en la compilación de este sencillo código. (Leído 26,989 veces)
|
leosansan
Desconectado
Mensajes: 1.314
|
....................................
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! .... ..
|
|
|
En línea
|
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Realloc debería funcionar en C++ perfectamente, debe ser otro fallo. Ponnos el código aquí para que podamos opinar Error: error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
#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! .... ..
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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*: (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: #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: #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; }
|
|
« Última modificación: 9 Junio 2013, 19:16 pm por amchacon »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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*: (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:#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! .... ..
|
|
« Última modificación: 10 Junio 2013, 22:15 pm por leosansan »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
¿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 Que fea es
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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 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".
|
|
« Última modificación: 9 Junio 2013, 20:43 pm por leosansan »
|
En línea
|
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Rit estaba contestando a Leo no a ti.
Ya decía yo que no me cuadraba algo.
|
|
|
En línea
|
I like to test things.
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
P.D: Por cierto, "-fpermissive" con una o dos "s". Con 2 ss como dice el error: error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
¿Puse 1s? Me cachis Me ha quedado clarito, clarito. Thanks!.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda a resolver este error de compilacion por favor!
Programación C/C++
|
carles24
|
2
|
3,576
|
20 Noviembre 2011, 16:22 pm
por satu
|
|
|
Error de compilación en Dev C++ raro
Programación C/C++
|
Kasswed
|
9
|
5,351
|
8 Mayo 2012, 00:34 am
por n0z
|
|
|
un codigo para este programa sencillo
Programación General
|
etaccracker
|
2
|
2,541
|
29 Marzo 2013, 16:04 pm
por crazykenny
|
|
|
Programa sencillo: ¿Qué significa este error?
Programación C/C++
|
noob2012
|
4
|
4,104
|
28 Mayo 2013, 21:41 pm
por elkiy
|
|
|
Qué error tiene este sencillo código? (html - php)
« 1 2 »
Desarrollo Web
|
Danyel_Casvill
|
13
|
6,239
|
24 Junio 2014, 22:07 pm
por Graphixx
|
|