Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: facster7 en 12 Julio 2018, 03:54 am



Título: Llenar matriz de estructuras con punteros en c
Publicado por: facster7 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. }


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: MAFUS 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.


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: facster7 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?


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: MAFUS 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], ...) {


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: facster7 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


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: MAFUS 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?


Título: Re: Llenar matriz de estructuras con punteros en c
Publicado por: facster7 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....