Llenar matriz de estructuras con punteros en c

Iniciado por facster7, 12 Julio 2018, 03:54 AM

0 Miembros y 1 Visitante están viendo este tema.

facster7

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
struct Pagina
{
   char *Instruccion;
   char *register1;
   char *register2;
};




int *Escribir_swap(const char *PCB,  TMS *TABLE_TMS, Pagina **Paginas, int dk){ /*dk numero de marcos a utilizar el proceso*/
   FILE *A;
   char exeption[5] = " \n\t,";
   char LINE[LONG_MAX_LINE];
   int TAM = 0, flag = 0; /*para controlar si creo una nueva pagina en la tms*/
   int *pos = (int *)malloc(dk*sizeof(int)); /* Vamos guardando las posiciones que ocupara el proceso en la swap*/
   int i = 0, j = 0, num_page = 0;

   for(i = 0; i < MARCOS; i++){
       if(enable_pos[i] == 1){
           for(j = 0; j < PAGINAS; j++){
               if( strcmp(Get_I(TAM, PCB, LINE, exeption, A),  "END") == 0 ){
                   flag = 0;
                   break;
                }
                else{
                   (Paginas[i][j].Instruccion = strdup(Get_I(TAM, PCB, LINE, exeption, A)));
                   (Paginas[i][j].register1 = strdup(Get_R(TAM, PCB, LINE, exeption, A, 1)));
                   (Paginas[i][j].register2 = strdup(Get_R(TAM, PCB, LINE, exeption, A, 2)));
                   
                   TABLE_TMS[i].NOM_ARCHIVO = PCB; /*nombre del proceso en la tms*/
                   TABLE_TMS[i].num_page = num_page;  /*el numero de pagina en la tms*/
                   enable_pos[i] = 0; /*activamos bandera en esa posicion para indicar que esta ocupada*/
                   pos[num_page] = i; /*llenamos el vector que contiene la posicion de las paginas en la swap*/
                   flag = 1;
                   TAM++;
               }
           }
       }
       if (flag == 1 & num_page <= dk) /* si creo la nueva pagina*/
        {
            num_page++;  /*creamos el nuevo indice para una nueva pagina*/
        }
   }
   return pos;
}

MAFUS

#1
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.

facster7

Cita de: 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.

Como podria mantener esa informacion, de que manera podria indicar el desplazamiento de cada ciclo?

MAFUS

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
Pagina paginas[MARCOS][PAGINAS];
El argumento de la función debe ser
int* Escribir_swap( ..., Pagina paginas[][PAGINAS], ...) {

facster7

Cita de: 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
Pagina paginas[MARCOS][PAGINAS];
El argumento de la función debe ser
int* Escribir_swap( ..., Pagina paginas[][PAGINAS], ...) {

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


De hecho de igual forma intente hacerlo como array y da el mismo resultado, solo llena la primera estructura, falla cuando i = 0 y j =1 como si perdiera la referencia

MAFUS

Hice este programa de prueba para abordar el problema
#include <stdio.h>

int **dato;

void f(int **dato, int max_fila, int max_columna) {
    for(int i=0; i<max_fila; ++i) {
        for(int j=0; j<max_columna; ++j) {
            dato[i][j] = (i+1)*(j+1);
        }
    }
}

void g(int **dato, int max_fila, int max_columna) {
    for(int i=0; i<max_fila; ++i) {
        for(int j=0; j<max_columna; ++j) {
            printf("%d\n", dato[i][j]);
        }
    }
}

int main() {
    int fila = 5;
    int columna = 3;

    dato = malloc(fila*sizeof(int*));
    for(int i=0; i<fila; ++i)
        dato[i] = malloc(columna*sizeof(int));

    f(dato, fila, columna);
    g(dato, fila, columna);
}


Y funciona perfecto. Después, regresando a tu código he visto otra cosa:
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?

facster7

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....