Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - facster7

#1
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....
#2
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
#3
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?
#4
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;
}