Foros del Web » Programación para mayores de 30 ;) » C/C++ »

invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive]

Estas en el tema de invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive] en el foro de C/C++ en Foros del Web. Hola a todos, ojala pudieran ayudarme, estoy atorado en un programa de c++, mi compilador es devc++, gracias por su ayuda, les dejo el codigo: ...
  #1 (permalink)  
Antiguo 06/04/2015, 22:20
Zir
 
Fecha de Ingreso: abril-2015
Mensajes: 2
Antigüedad: 9 años, 6 meses
Puntos: 0
Pregunta invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive]

Hola a todos, ojala pudieran ayudarme, estoy atorado en un programa de c++, mi compilador es devc++, gracias por su ayuda, les dejo el codigo:

#include <stdio.h>
#include <stdlib.h>


struct nodo{
int dato;
struct nodo *siguiente;
};

typedef struct nodo Nodo;
typedef Nodo *pNodo;

void insertar(pNodo *nodoRaiz, int valor);
int eliminar(pNodo *nodoRaiz, int valor);
int estaVacia(pNodo nodoRaiz);
void imprimeLista(pNodo nodoActual);
void instrucciones (void);
void ordenar(pNodo *nodoRaiz);

int main () {
pNodo nodoInicial = NULL;
int op;
int elemento;
instrucciones();
printf("?");
scanf("%d", &op);
while (op != 4){
switch(op){
case 1:
printf("Valor del nodo: ");
scanf("\n%d",&elemento);
insertar(&nodoInicial,elemento);
imprimeLista(nodoInicial);
break;
case 2:
if(!estaVacia(nodoInicial)){
printf("Valor a eliminar: ");
scanf("\n%d",&elemento);

if(eliminar(&nodoInicial,elemento)){
printf("Valor %d eliminado.\n",elemento);
imprimeLista(nodoInicial);
}else{
printf("No se encuentra el elemento %d.\n\n",elemento);
}
}else{
printf("La lista esta vacia.\n\n");
}
break;
case 3:
ordenar(&nodoInicial);
imprimeLista(nodoInicial);
break;
default:
printf("Opción no válida.\n\n");
instrucciones();
break;
}
printf("? ");
scanf("%d",&op);
}
printf("Fin del programa");
return 0;
}

void instrucciones(void){
printf("Seleccione una opción:\n"
"1.- Insertar un elemento\n"
"2.- Eliminar un elemento\n"
"3.- Ordenar\n"
"4.- Salir\n");
}

void insertar(pNodo *nodoRaiz, int valor){
pNodo nodoNuevo;
pNodo nodoAnterior;
pNodo nodoActual;

nodoNuevo = malloc(sizeof(Nodo)); ////////////////ERRRORRR

if(nodoNuevo != NULL){
nodoNuevo -> dato = valor;
nodoNuevo -> siguiente = NULL;

nodoAnterior = NULL;
nodoActual = *nodoRaiz;

//while(nodoActual != NULL && valor > nodoActual->dato){
while(nodoActual != NULL){
nodoAnterior = nodoActual;
nodoActual = nodoActual -> siguiente;
}

if(nodoAnterior == NULL){
nodoNuevo -> siguiente = *nodoRaiz;
*nodoRaiz = nodoNuevo;
}else{
nodoAnterior -> siguiente = nodoNuevo;
nodoNuevo -> siguiente = nodoActual;
}
}else{
printf("No se inserto %d. No hay memoria disponible.\n",valor);
}
}

int eliminar(pNodo *nodoRaiz, int valor){
pNodo nodoAnterior;
pNodo nodoActual;
pNodo temp;

if(valor == (*nodoRaiz) -> dato){
temp = *nodoRaiz;
*nodoRaiz = (*nodoRaiz) -> siguiente;
free(temp);
return valor;
}else{
nodoAnterior = *nodoRaiz;
nodoActual = (*nodoRaiz) -> siguiente;
while(nodoActual != NULL && nodoActual -> dato != valor){
nodoAnterior = nodoActual;
nodoActual = nodoActual -> siguiente;
}

if(nodoActual != NULL){
temp = nodoActual;
nodoAnterior -> siguiente = nodoActual -> siguiente;
free(temp);
return valor;
}
}

return 0;
}

int estaVacia(pNodo nodoRaiz){
return nodoRaiz == NULL;
}

void imprimeLista(pNodo nodoActual){
if(nodoActual == NULL){
printf("La lista esta vacia");
}else{
printf("La lista es:\n");

while (nodoActual != NULL){
printf("%d -> ",nodoActual -> dato);
nodoActual = nodoActual -> siguiente;
}
printf("NULL\n\n");
}
}

void ordenar(pNodo *nodoRaiz){
pNodo actual;
int aux;
int cambio = 1;

while(cambio)
{
cambio = 0;
actual = *nodoRaiz;
while(actual->siguiente != NULL)
{
if(actual -> dato > actual -> siguiente ->dato)
{
aux = actual -> dato;
actual -> dato = actual -> siguiente ->dato;
actual -> siguiente -> dato = aux;
cambio = 0;
}
actual = actual -> siguiente;
}
}
}

Aquí una imagen:
  #2 (permalink)  
Antiguo 06/04/2015, 23:41
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive]

Estas usando mal la función malloc();

Prueba así:
Código C++:
Ver original
  1. nodoNuevo = (pNodo)malloc(sizeof(Nodo)); ////////////////ERRRORRR

http://www.cplusplus.com/reference/cstdlib/malloc/

Y un consejo, cuando pegues código etiquétalo en forma C++, para que quede más legible (en el desplegable donde pone "Highlight")

Saludos
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 06/04/2015, 23:54
Zir
 
Fecha de Ingreso: abril-2015
Mensajes: 2
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive]

Genial gracias!! no comprendo todavia esos detalles...
  #4 (permalink)  
Antiguo 07/04/2015, 07:27
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años
Puntos: 38
Respuesta: invalid conversion from 'void*' to 'pNodo {aka nodo*}' [-fpermissive]

eso es que malloc devuelve un puntero genérico a void.
En una explicacion algo más entendible:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct nodo{
  5. int dato;
  6. struct nodo *siguiente;
  7. }n;
  8.  
  9. int main (){
  10.     //nodo nuevo junto con malloc ahora no chilla ya que devuelve es un puntero a void, pues lo guardamos en un puntero de tipo void como debe de ser =D
  11.     void* nodoNuevo = malloc( sizeof(n) );
  12.    
  13.     nodo* pNodo;  // <- ¿Pero quieres guardarlo aquí no? XD
  14.    
  15.     //¡solución! Cast de nuevo nodo que es del tipo void* a pNodo que es un puntero a nodo*. =DD
  16.     pNodo = ( nodo* ) nodoNuevo;
  17.    
  18.     //ahora pNodo ya guarda la dirección de lo que tu quieres. Es más o menos lo que
  19.     //hace nodoNuevo = (pNodo)malloc(sizeof(Nodo)); tal como te lo dijo dehm
  20.     pNodo->dato = 10;
  21.    
  22.    
  23.     printf("%d\n",pNodo->dato );
  24.    
  25.     free(nodoNuevo);
  26.     getchar();
  27.     return 0;
  28. }

Todo lo de arriba hace en una sola linea: nodo* pNodo; = ( nodo* )malloc( sizeof(n) );
Creo que ahora ya sabes que ocurre y por que te da error. El error te da por que malloc no es advino.. No puede saber el tipo de puntero que debe retornar, eso lo tienes que indicar tu haciendo un cast al tipo que necesites. ;)

Etiquetas: dinamica, malloc, memoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:59.