Domingo 22 de Diciembre de 2024, 12:49
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Punteros A Funcion
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Punteros A Funcion (Leído 1622 veces)
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Punteros A Funcion
«
en:
Sábado 18 de Octubre de 2008, 17:39 »
0
Hola gente!
estoy realizando una estructura generica de lista (sigo con mis estructuras genercias XD) y estoy teniendo un problema a la hora de implementar una funcion insertaOrdenado(); que lo que debe hacer es , justamente, insertar nodos de manera ordenada segun el campo a comparar que se le sea especificado con un puntero a funcion.
el codigo con el problema aislado es el siguiente, esta completo para poder probarlo directamente:
Código: C
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define FALSE 0
#define TRUE !FALSE
typedef
char
boolean
;
typedef
int
(
*
list_funCmp_t
)
(
void
*
a
,
void
*
b
)
;
typedef
void
(
*
list_funPrint_t
)
(
void
*
a
)
;
#define INT 0
/*
#define STRING 0
#define CHAR 0
*/
typedef
struct
lPtr
{
void
*
valor
;
struct
lPtr
*
next
;
}
list_t
;
typedef
struct
{
list_t
*
entrada
;
//Entrada a la lista;
int
sizeTipo
;
list_funCmp_t funCmp
;
list_funPrint_t funPrint
;
}
listAdm_t
;
///Funciones de COMPARACION---------------------------------------///
int
comparaEnteros
(
void
*
a
,
void
*
b
)
{
return
*
(
int
*
)
a
-
*
(
int
*
)
b
;
}
int
comparaCadenas
(
void
*
a
,
void
*
b
)
{
return
(
(
int
)
strcpy
(
(
char
*
)
a
,
(
char
*
)
b
)
)
;
//0 si son iguales, > 1 si b < a; < 1 si a < b
}
///Funciones de IMPRESION----------------------------------------///
void
imprimeEnteros
(
void
*
a
)
{
printf
(
"%d"
,*
(
int
*
)
a
)
;
}
void
imprimeCadenas
(
void
*
a
)
{
printf
(
"%s"
,
(
char
*
)
a
)
;
}
///Servicios de LISTA
listAdm_t
*
lAdmCreate
(
int
sizeTipo
,
list_funCmp_t funCmp
,
list_funPrint_t funPrint
)
{
//Crea La estructura administrativa
listAdm_t
*
listAdm
=
(
listAdm_t
*
)
malloc
(
sizeof
(
listAdm_t
)
)
;
assert
(
listAdm
)
;
listAdm
->
funCmp
=
funCmp
;
listAdm
->
funPrint
=
funPrint
;
listAdm
->
sizeTipo
=
sizeTipo
;
listAdm
->
entrada
=
NULL
;
return
listAdm
;
}
list_t
*
creaNodo
(
listAdm_t
*
lista
,
list_t
*
pNext
,
void
*
elemento
)
{
//necesito la estructura administrativa para el peso de dato
list_t
*
nodo
=
(
list_t
*
)
malloc
(
sizeof
(
list_t
)
)
;
assert
(
nodo
)
;
nodo
->
valor
=
malloc
(
lista
->
sizeTipo
)
;
assert
(
nodo
->
valor
)
;
nodo
->
next
=
pNext
;
memcpy
(
(
char
*
)
nodo
->
valor
,
(
char
*
)
elemento
,
lista
->
sizeTipo
)
;
return
nodo
;
}
list_t
*
lInsertOrdered
(
listAdm_t
*
listAdm
,
list_t
*
lista
,
void
*
elemento
)
{
//Ordenado de menor a mayor
if
(
!
lista
||
(
listAdm
->
funCmp
(
lista
->
valor
,
elemento
)
)
>=
0
)
{
return
creaNodo
(
listAdm
,
listAdm
->
entrada
,
elemento
)
;
}
lista
->
next
=
lInsertOrdered
(
listAdm
,
lista
->
next
,
elemento
)
;
return
lista
;
}
void
printList
(
listAdm_t
*
listAdm
,
list_t
*
list
)
{
if
(
list
)
{
//Si existe la lista
listAdm
->
funPrint
(
list
->
valor
)
;
printf
(
" - "
)
;
printList
(
listAdm
,
list
->
next
)
;
}
}
int
main
(
void
)
{
#ifdef STRING
char
i
[
50
]
=
"iber"
,
b
[
50
]
=
"jose"
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
i
)
,
comparaCadenas
,
imprimeCadenas
)
;
#endif
#ifdef CHAR
char
i
=
'a'
,
b
=
'g'
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
char
)
,
comparaCaracteres
,
imprimeCaracteres
)
;
#endif
#ifdef INT
int
i
=
6
,
b
=
9
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
int
)
,
comparaEnteros
,
imprimeEnteros
)
;
printf
(
"hellon"
)
;
#endif
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
i
)
;
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
b
)
;
printList
(
lista
,
lista
->
entrada
)
;
return
0
;
}
tiene un par de ifndefs para realizarle distintas pruebas con los diferentes tipos de datos y verificar que en verdad sea generica.
ahora lo que pasa es q se queda iterando hasta un segmentation fault en el ciclo de impresion, antes habia logrado que funcione correctamente la inserta ordenado pero solo lo hacia con int's (poco generico q digamos XD).
esca esta la funcion problematica (tambien esta en el codigo anterior pero para que se vea mas directo)
Código: C
list_t
*
lInsertOrdered
(
listAdm_t
*
listAdm
,
list_t
*
lista
,
void
*
elemento
)
{
//Ordenado de menor a mayor
if
(
!
lista
||
(
listAdm
->
funCmp
(
lista
->
valor
,
elemento
)
)
>=
0
)
{
return
creaNodo
(
listAdm
,
listAdm
->
entrada
,
elemento
)
;
}
lista
->
next
=
lInsertOrdered
(
listAdm
,
lista
->
next
,
elemento
)
;
return
lista
;
}
la logica creo q esta bien.
si no tengo lista, o si el valor es menor al que tengo en la lista inserto a la cabeza, sino llamo recursivamente a la funcion pasandole el siguiente elemento de la lista.
estoy dandole vueltas al codigo pero no logro decifrar el error.
espero sus comentarios!
saludos!
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Punteros A Funcion
«
Respuesta #1 en:
Sábado 18 de Octubre de 2008, 17:49 »
0
Ambos elementos apuntan entre si en el next asi que nunca termina el bucle ...
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Punteros A Funcion
«
Respuesta #2 en:
Sábado 18 de Octubre de 2008, 18:10 »
0
:O!
si! ahi lo arregle!
return creaNodo(listAdm,
lista
, elemento);
en vez de
return creaNodo(listAdm, listAdm->entrada, elemento);
y me anda pero solo con enteros, pruebo con string y no me anda :S
mira:
Código: C
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define FALSE 0
#define TRUE !FALSE
typedef
char
boolean
;
typedef
int
(
*
list_funCmp_t
)
(
void
*
a
,
void
*
b
)
;
typedef
void
(
*
list_funPrint_t
)
(
void
*
a
)
;
//#define INT 0
#define STRING 0
//#define CHAR 0
typedef
struct
lPtr
{
void
*
valor
;
struct
lPtr
*
next
;
}
list_t
;
typedef
struct
{
list_t
*
entrada
;
//Entrada a la lista;
int
sizeTipo
;
list_funCmp_t funCmp
;
list_funPrint_t funPrint
;
}
listAdm_t
;
///Funciones de COMPARACION---------------------------------------///
int
comparaEnteros
(
void
*
a
,
void
*
b
)
{
return
*
(
int
*
)
a
-
*
(
int
*
)
b
;
}
int
comparaCadenas
(
void
*
a
,
void
*
b
)
{
return
(
(
int
)
strcpy
(
(
char
*
)
a
,
(
char
*
)
b
)
)
;
//0 si son iguales, > 1 si b < a; < 1 si a < b
}
///Funciones de IMPRESION----------------------------------------///
void
imprimeEnteros
(
void
*
a
)
{
printf
(
"%d"
,*
(
int
*
)
a
)
;
}
void
imprimeCadenas
(
void
*
a
)
{
printf
(
"%s"
,
(
char
*
)
a
)
;
}
///Servicios de LISTA
listAdm_t
*
lAdmCreate
(
int
sizeTipo
,
list_funCmp_t funCmp
,
list_funPrint_t funPrint
)
{
//Crea La estructura administrativa
listAdm_t
*
listAdm
=
(
listAdm_t
*
)
malloc
(
sizeof
(
listAdm_t
)
)
;
assert
(
listAdm
)
;
listAdm
->
funCmp
=
funCmp
;
listAdm
->
funPrint
=
funPrint
;
listAdm
->
sizeTipo
=
sizeTipo
;
listAdm
->
entrada
=
NULL
;
return
listAdm
;
}
list_t
*
creaNodo
(
listAdm_t
*
lista
,
list_t
*
pNext
,
void
*
elemento
)
{
//necesito la estructura administrativa para el peso de dato
list_t
*
nodo
=
(
list_t
*
)
malloc
(
sizeof
(
list_t
)
)
;
assert
(
nodo
)
;
nodo
->
valor
=
malloc
(
lista
->
sizeTipo
)
;
assert
(
nodo
->
valor
)
;
nodo
->
next
=
pNext
;
memcpy
(
(
char
*
)
nodo
->
valor
,
(
char
*
)
elemento
,
lista
->
sizeTipo
)
;
return
nodo
;
}
list_t
*
lInsertOrdered
(
listAdm_t
*
listAdm
,
list_t
*
lista
,
void
*
elemento
)
{
//Ordenado de menor a mayor
if
(
!
lista
||
(
listAdm
->
funCmp
(
lista
->
valor
,
elemento
)
)
>=
0
)
{
return
creaNodo
(
listAdm
,
lista
,
elemento
)
;
}
lista
->
next
=
lInsertOrdered
(
listAdm
,
lista
->
next
,
elemento
)
;
return
lista
;
}
void
printList
(
listAdm_t
*
listAdm
,
list_t
*
list
)
{
if
(
list
)
{
//Si existe la lista
listAdm
->
funPrint
(
list
->
valor
)
;
printf
(
" - "
)
;
printList
(
listAdm
,
list
->
next
)
;
}
}
int
main
(
void
)
{
#ifdef STRING
char
i
[
]
=
"AAZ"
,
b
[
]
=
"AAA"
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
i
)
,
comparaCadenas
,
imprimeCadenas
)
;
#endif
#ifdef CHAR
char
i
=
'a'
,
b
=
'g'
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
char
)
,
comparaCaracteres
,
imprimeCaracteres
)
;
#endif
#ifdef INT
int
i
=
6
,
b
=
9
;
listAdm_t
*
lista
=
lAdmCreate
(
sizeof
(
int
)
,
comparaEnteros
,
imprimeEnteros
)
;
#endif
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
i
)
;
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
b
)
;
#ifdef INT
i
=
0
;
b
=
8
;
#endif
#ifdef STRING
strcpy
(
i
,
"ZZZ"
)
;
strcpy
(
b
,
"BBB"
)
;
#endif
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
i
)
;
lista
->
entrada
=
lInsertOrdered
(
lista
,
lista
->
entrada
,
(
void
*
)
&
b
)
;
printList
(
lista
,
lista
->
entrada
)
;
return
0
;
}
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Punteros A Funcion
«
Respuesta #3 en:
Sábado 18 de Octubre de 2008, 18:23 »
0
Tenes que depurar un poco mas:
int comparaCadenas(void *a, void *b){
return ((int)
strcpy
((char *)a, (char*)b)); //0 si son iguales, > 1 si b < a; < 1 si a < b
}
strcpy es string copy, strcmp es lo que queres, string compare.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Punteros A Funcion
«
Respuesta #4 en:
Sábado 18 de Octubre de 2008, 18:29 »
0
ufff
siempre se me confunden
gracias Eternal IDOL!!
cuando tenga todas las estructuras genericas las voy a compratir con la comunidad XD
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Punteros A Funcion
«
Respuesta #5 en:
Sábado 18 de Octubre de 2008, 18:33 »
0
De nadas
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Punteros A Funcion