Miércoles 6 de Noviembre de 2024, 11:32
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
) »
Violacion de segmento al sumar 2 listas.
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Violacion de segmento al sumar 2 listas. (Leído 2519 veces)
Hammerstrike
Miembro activo
Mensajes: 27
Violacion de segmento al sumar 2 listas.
«
en:
Lunes 15 de Septiembre de 2008, 07:57 »
0
Hola:
Estoy tratando de sumar 2 listas de numeros enteros usando punteros y asignacion dinamica de memoria. El punto es que tengo algunas dudas, sobre todo cuando intento calcular la suma por que me da violacion de segmento.
Aqui va el codigo
Código: Text
#include <stdlib.h>
#include <stdio.h>
#define MAXCOL 30
/*Sumar 2 tablas de numeros*/
main(){
int nfilas,ncols;
/*Definiciones de punteros*/
int (*a)[MAXCOL], (*b)[MAXCOL], (*c)[MAXCOL];
/*Prototipos de funcion*/
void leerentrada(int (*a)[MAXCOL],int nfilas, int ncols);
void calcularsuma(int (*a)[MAXCOL],int (*b)[MAXCOL],int (*c)[MAXCOL],int nfilas,int ncols);
void sacarsalida(int (*c)[MAXCOL],int nfilas,int ncols);
/*Pedir los datos*/
printf("Cuantas filas? n");
scanf("%d",&nfilas);
printf("Cuantas columnas? ");
scanf("%d",&ncols);
/*Reserva de memoria inicial*/
*a[MAXCOL]=(int *) malloc(nfilas * ncols * sizeof(int));
*b[MAXCOL]=(int *) malloc(nfilas * ncols * sizeof(int));
*c[MAXCOL]=(int *) malloc(nfilas * ncols * sizeof(int));
/*Leer las tablas*/
printf("Primera tabla: n");
leerentrada(a,nfilas,ncols);
printf("Segunda tabla: n");
leerentrada(b,nfilas,ncols);
/*Calcular la suma*/
calcularsuma(a,b,c,nfilas,ncols);
/*Desplegar la salida*/
printf("La tabla resultante es:n ");
sacarsalida(c,nfilas,ncols);
}
void leerentrada(int (*a)[MAXCOL],int n, int m){
int i,j;
printf("%d %d",n,m);
for (i=0;i<n;++i){
printf("nIntroducir datos para la fila nº %2dn",i+1);
for (j=0;j<m;++j){
// printf("Ingrese el elemento nº (%d,%d) de la tabla:n",i,j);
scanf("%d",(*(a+i)+j));
}
}
return;
}
void calcularsuma(int (*a)[MAXCOL],int (*b)[MAXCOL],int (*c)[MAXCOL],int n,int m){
int i,j;
for (i=0;i<n;++i){
for (j=0;j<m;++j){
*(*(c+i)+j)= *(*(a+i)+j) + *(*(b+i)+j);
}
}
return;
}
void sacarsalida(int (*c)[MAXCOL],int n,int m){
int i,j;
for (i=0;i<n;++i){
for (j=0;j<m;++j){
printf("%4d",(*(*(c+i)+j)));
}
}
return;
}
Estare haciendo algo mal??? Lei por ahi que es recurrente el asociar el error violacion de segmento a punteros descarriados pero en este caso no se...
Alguna idea???
Gracias de antemano
Tweet
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #1 en:
Lunes 15 de Septiembre de 2008, 09:38 »
0
Hola Hammerstrike
Código: C
*
a
[
MAXCOL
]
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
*
b
[
MAXCOL
]
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
*
c
[
MAXCOL
]
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
Si vas a reservar toda la memoria de golpe, ¿por qué no declaras directamente vectores de enteros? Malloc() es para ir reservando memoria cuando la necesites. Si reservas todo de golpe, es lo mismo que hacer
Código: C
int
a
[
MAXCOL
]
,
b
[
MAXCOL
]
,
c
[
MAXCOL
]
;
Aparte, haciendo
Código: C
*
a
[
MAXCOL
]
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
incurres en un par de errores:
1. a[30] está fuera del rango de tu array, que va de 0 a 29.
2. Sólo reservas memoria para el puntero a[30], dejando los otros 30 (a[0] hasta a[29]) sin inicializar, por lo que podrían tener cualquier valor.
Ambos errores te pueden dar un SIGSEGV. Un saludo.
Fr33k K0mpu73r
Hammerstrike
Miembro activo
Mensajes: 27
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #2 en:
Lunes 15 de Septiembre de 2008, 17:58 »
0
Es que segun un libro la cosa deberia ser asi:
Código: Text
*a=(int *) malloc(nfilas * ncols * sizeof(int));
Pero me dice que los tipos son incompatibles en la asignacion.
Como podria solucionar esto???
Alguna idea???
Muchisimas gracias de antemano.
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #3 en:
Lunes 15 de Septiembre de 2008, 21:17 »
0
hola Hammerstrike
fijate que lo que te dice moskito es que al hacer
Código: Text
*a[MAXCOL]=(int *) malloc(nfilas * ncols * sizeof(int));
estas alocando la memoria en el ultimo elemento de a
debido a esto:
Código: Text
*a[MAXCOL] = . . .
y lo que dice tu libro esta bien
pero presta atencion que no es a[MAXCOL], sino a a secas
Código: Text
*a=(int *) malloc(nfilas * ncols * sizeof(int));
esa forma igual es para declarar un vector de la cantidad de posiciones que tenga tu matriz, pero es un solo vector.
yo preferiria alocar el primer vector que sea el ancho, y luego por cada posicion alocar el alto
saludos
ProfesorX
Moderador
Mensajes: 796
Nacionalidad:
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #4 en:
Martes 16 de Septiembre de 2008, 01:38 »
0
Para declarar una matriz de manera dinamica, debes utilizar un apuntador de apuntadores.
A continuacion te dejo un codigo que crea, asigna, muestra y libera una matriz dinamica, parte del codigo esta tomado del C FAQ (
http://www.faqs.org/faqs/C-faq/faq/
) Seccion 6.16
Código: C
#include <stdio.h>
#include <stdlib.h>
// Para asignar una matriz de manera dinamcia, debes usar un apuntador de apuntador
int
**
a
=
NULL
;
int
nfilas
=
2
;
int
ncols
=
2
;
int
i
,
j
;
int
main
(
int
argc
,
char
*
argv
[
]
)
{
// Crear la matriz de m x n
// Primero las filas
a
=
(
int
**
)
malloc
(
nfilas
*
sizeof
(
int
*
)
)
;
// Luego las columnas
for
(
i
=
0
;
i
<
nfilas
;
i
++
)
{
a
[
i
]
=
(
int
*
)
malloc
(
ncols
*
sizeof
(
int
)
)
;
}
// Ahora si, la podemos usar como una matriz normal.
// Llenar la matriz con ceros
for
(
i
=
0
;
i
<
nfilas
;
i
++
)
{
for
(
j
=
0
;
j
<
ncols
;
j
++
)
{
a
[
i
]
[
j
]
=
0
;
}
}
// Imprimir la matriz
for
(
i
=
0
;
i
<
nfilas
;
i
++
)
{
for
(
j
=
0
;
j
<
ncols
;
j
++
)
{
printf
(
"Elemento %d,%d = %dn"
,
i
+
1
,
j
+
1
,
a
[
i
]
[
j
]
)
;
}
}
// Liberar la memoria
for
(
i
=
0
;
i
<
nfilas
;
i
++
)
{
free
(
a
[
i
]
)
;
}
free
(
a
)
;
system
(
"pause"
)
;
return
0
;
}
Espero te sirva.
Sakudos
NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================
Hammerstrike
Miembro activo
Mensajes: 27
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #5 en:
Martes 16 de Septiembre de 2008, 06:40 »
0
Hola a todos.
Muchas gracias por las respuestas.
Rombus: Al principio lo hice como decia en el libro tal cual como tu me indicas. Pero lamentablemente me da un error (estoy usando Gcc 4.1 en debian) me dice "Incompatible types in assignment". De todas maneras voy a chequear la parte de asignar memoria por posicion. Muchas gracias.
ProfessorX: Muchas gracias por el ejemplo. Te aseguro que me servira.
Suerte
Hammer
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...
Hammerstrike
Miembro activo
Mensajes: 27
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #6 en:
Martes 16 de Septiembre de 2008, 08:05 »
0
He logrado compilar bien el programa. Pero parece que este gcc es bastante mañoso por que me da errores incluso siguiendo la notacion del libro que tengo. Como les decia, tuve que hacer lo siguiente:
Código: Text
/*Reserva de memoria inicial (filas)*/
a=(int *) malloc(nfilas * sizeof(int));
b=(int *) malloc(nfilas * sizeof(int));
c=(int *) malloc(nfilas * sizeof(int));
/*Ahora reserva para las columnas*/
for (i=0;i<ncols;++i){
*a[i]=(int *) malloc(ncols * sizeof(int));
*b[i]=(int *) malloc(ncols * sizeof(int));
*c[i]=(int *) malloc(ncols * sizeof(int));
}
El error esta cuando dejo la asignacion incial (filas) de esta manera:
Código: Text
/*Reserva de memoria inicial (filas)*/
*a=(int *) malloc(nfilas * sizeof(int));
*b=(int *) malloc(nfilas * sizeof(int));
*c=(int *) malloc(nfilas * sizeof(int));
Me da el siguiente error y no tengo idea por que:
Código: Text
:27:error: incompatible types in assignment
:27: error: incompatible types in assignment
:28: error: incompatible types in assignment
Lo bueno es que lo logre hacer funciona
Muchas gracias por las respuestas.
Salu2
Hammer
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #7 en:
Martes 16 de Septiembre de 2008, 08:34 »
0
Código: C
*
a
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
No es que gcc sea mañoso, es que esta sentencia está mal (a lo mejor un error tipográfico en el libro, o un error a secas, son comunes en los libros de programación), pues estás asignando un un puntero a entero (int *) a un entero (*a). Lo correcto, como has podido comprobar, es:
Código: C
a
=
(
int
*
)
malloc
(
nfilas
*
ncols
*
sizeof
(
int
)
)
;
a (int *) se le asigna un valor (int *). Saludos-
Fr33k K0mpu73r
Hammerstrike
Miembro activo
Mensajes: 27
Re: Violacion de segmento al sumar 2 listas.
«
Respuesta #8 en:
Martes 16 de Septiembre de 2008, 18:10 »
0
Si, muchas gracias.
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Violacion de segmento al sumar 2 listas.