elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Llenar matriz de estructuras con punteros en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Llenar matriz de estructuras con punteros en c  (Leído 3,425 veces)
facster7

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Llenar matriz de estructuras con punteros en c
« en: 12 Julio 2018, 03:54 am »

Estoy intentado llenar una matriz de estructuras usando punteros, pero solo lo hace para la primera corrida de los ciclos despues me manda un fallo de segmento, habia comenzado a escribirlo en windows y corria bien el llenado lo hacia pero ahora lo estoy corriendo en linux y no se que pasa.

Si me pudieran decir donde tengo mi error se los agradeceria :p


Codigo:
Estructura
Código
  1. struct Pagina
  2. {
  3.    char *Instruccion;
  4.    char *register1;
  5.    char *register2;
  6. };



Código
  1. int *Escribir_swap(const char *PCB,  TMS *TABLE_TMS, Pagina **Paginas, int dk){ /*dk numero de marcos a utilizar el proceso*/
  2.    FILE *A;
  3.    char exeption[5] = " \n\t,";
  4.    char LINE[LONG_MAX_LINE];
  5.    int TAM = 0, flag = 0; /*para controlar si creo una nueva pagina en la tms*/
  6.    int *pos = (int *)malloc(dk*sizeof(int)); /* Vamos guardando las posiciones que ocupara el proceso en la swap*/
  7.    int i = 0, j = 0, num_page = 0;
  8.  
  9.    for(i = 0; i < MARCOS; i++){
  10.        if(enable_pos[i] == 1){
  11.            for(j = 0; j < PAGINAS; j++){
  12.                if( strcmp(Get_I(TAM, PCB, LINE, exeption, A),  "END") == 0 ){
  13.                    flag = 0;
  14.                    break;
  15.                 }
  16.                 else{
  17.                    (Paginas[i][j].Instruccion = strdup(Get_I(TAM, PCB, LINE, exeption, A)));
  18.                    (Paginas[i][j].register1 = strdup(Get_R(TAM, PCB, LINE, exeption, A, 1)));
  19.                    (Paginas[i][j].register2 = strdup(Get_R(TAM, PCB, LINE, exeption, A, 2)));
  20.  
  21.                    TABLE_TMS[i].NOM_ARCHIVO = PCB; /*nombre del proceso en la tms*/
  22.                    TABLE_TMS[i].num_page = num_page;  /*el numero de pagina en la tms*/
  23.                    enable_pos[i] = 0; /*activamos bandera en esa posicion para indicar que esta ocupada*/
  24.                    pos[num_page] = i; /*llenamos el vector que contiene la posicion de las paginas en la swap*/
  25.                    flag = 1;
  26.                    TAM++;
  27.                }
  28.            }
  29.        }
  30.        if (flag == 1 & num_page <= dk) /* si creo la nueva pagina*/
  31.         {
  32.             num_page++;  /*creamos el nuevo indice para una nueva pagina*/
  33.         }
  34.    }
  35.    return pos;
  36. }


« Última modificación: 12 Julio 2018, 04:38 am por facster7 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #1 en: 12 Julio 2018, 04:25 am »

El problema podría estar en la forma de tratar el argumento de la función Pagina **Paginas. Es un puntero a puntero por tanto toda información del tamaño de las dimensiones ha desaparecido, sólo se conoce el tamaño del tipo de dato. Esto hace que al usarlo como matriz en Paginas[i][j] el programa no sepa cuántos bytes deba saltar por cada incremento de i.


« Última modificación: 12 Julio 2018, 04:31 am por MAFUS » En línea

facster7

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #2 en: 12 Julio 2018, 06:14 am »

El problema podría estar en la forma de tratar el argumento de la función Pagina **Paginas. Es un puntero a puntero por tanto toda información del tamaño de las dimensiones ha desaparecido, sólo se conoce el tamaño del tipo de dato. Esto hace que al usarlo como matriz en Paginas[i][j] el programa no sepa cuántos bytes deba saltar por cada incremento de i.

Como podria mantener esa informacion, de que manera podria indicar el desplazamiento de cada ciclo?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #3 en: 12 Julio 2018, 12:28 pm »

No sé cómo has declarado el dato Pagina **paginas fuera de la función.
Si es un array de dos dimensiones el argumento de la función debe ser un array de dos dimensiones donde obligatoriamente la de más a la derecha debe estar definida. Es decir:
Si has declarado el array en main() o dónde sea como
Código:
Pagina paginas[MARCOS][PAGINAS];
El argumento de la función debe ser
Código:
int* Escribir_swap( ..., Pagina paginas[][PAGINAS], ...) {
En línea

facster7

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #4 en: 12 Julio 2018, 19:36 pm »

No sé cómo has declarado el dato Pagina **paginas fuera de la función.
Si es un array de dos dimensiones el argumento de la función debe ser un array de dos dimensiones donde obligatoriamente la de más a la derecha debe estar definida. Es decir:
Si has declarado el array en main() o dónde sea como
Código:
Pagina paginas[MARCOS][PAGINAS];
El argumento de la función debe ser
Código:
int* Escribir_swap( ..., Pagina paginas[][PAGINAS], ...) {

La define como variable global de esta forma
Código
  1. Pagina **Paginas
posteriormente reservomemoria para ella dentro del main
Código
  1. Paginas = (Pagina **)malloc(MARCOS*sizeof(Pagina *));
  2. for ( i =0; i<MARCOS; i++)
  3.       Pagina[i] = (Pagina *)malloc(PAGINAS*sizeof(Pagina));
  4.  

De hecho de igual forma intente hacerlo como array y da el mismo resultado, solo llena la primera estructura, falla cuando
Código:
 i = 0 y j =1
como si perdiera la referencia
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #5 en: 12 Julio 2018, 20:36 pm »

Hice este programa de prueba para abordar el problema
Código
  1. #include <stdio.h>
  2.  
  3. int **dato;
  4.  
  5. void f(int **dato, int max_fila, int max_columna) {
  6.    for(int i=0; i<max_fila; ++i) {
  7.        for(int j=0; j<max_columna; ++j) {
  8.            dato[i][j] = (i+1)*(j+1);
  9.        }
  10.    }
  11. }
  12.  
  13. void g(int **dato, int max_fila, int max_columna) {
  14.    for(int i=0; i<max_fila; ++i) {
  15.        for(int j=0; j<max_columna; ++j) {
  16.            printf("%d\n", dato[i][j]);
  17.        }
  18.    }
  19. }
  20.  
  21. int main() {
  22.    int fila = 5;
  23.    int columna = 3;
  24.  
  25.    dato = malloc(fila*sizeof(int*));
  26.    for(int i=0; i<fila; ++i)
  27.        dato[i] = malloc(columna*sizeof(int));
  28.  
  29.    f(dato, fila, columna);
  30.    g(dato, fila, columna);
  31. }

Y funciona perfecto. Después, regresando a tu código he visto otra cosa:
Código:
TABLE_TMS[i].NOM_ARCHIVO = PCB;
siendo PCB un const char*, argumento de la función. Esto podría dar error si se libera PCB de forma automática o manual. ¿Hace falta usar strdup?
En línea

facster7

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Llenar matriz de estructuras con punteros en c
« Respuesta #6 en: 14 Julio 2018, 09:25 am »

Logre encontrar el error, la funcion Get_R en ciertas ocasiones me lanza NULL
 y eh ahi que me lanzaba el fallo de segmentacion por que hacia strdup(NULL), lo que no entiendo es por que en windows me dejaba correr el codigo y no me marcaba algun fallo, pero bueno.

Muchas Gracias por tu ayuda y por las sugerencias..

pd: si tienes razon sobre que me faltaba ese strdup....
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Llenar una matriz con primos al azar! :S
Java
Electoniko- 4 8,765 Último mensaje 10 Mayo 2012, 06:43 am
por baspetro
llenar matriz con Random en Dev C
Programación C/C++
binaryum 5 28,045 Último mensaje 20 Julio 2010, 04:26 am
por MIG80
llenar una matriz en c++
Programación C/C++
gak-f5 1 44,045 Último mensaje 28 Mayo 2012, 15:43 pm
por STANHMAL
Punteros a estructuras...???
Programación C/C++
Ja_90 4 2,613 Último mensaje 11 Noviembre 2014, 21:10 pm
por eferion
Estructuras con Punteros
Programación C/C++
jgonzalezo 1 1,803 Último mensaje 13 Abril 2015, 09:02 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines