Autor
|
Tema: Llenar matriz de estructuras con punteros en c (Leído 3,433 veces)
|
facster7
Desconectado
Mensajes: 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 :pCodigo: 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; }
|
|
« Última modificación: 12 Julio 2018, 04:38 am por facster7 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
Mensajes: 4
|
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
Mensajes: 1.603
|
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], ...) {
|
|
|
En línea
|
|
|
|
facster7
Desconectado
Mensajes: 4
|
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 como si perdiera la referencia
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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) { } } } 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?
|
|
|
En línea
|
|
|
|
facster7
Desconectado
Mensajes: 4
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Llenar una matriz con primos al azar! :S
Java
|
Electoniko-
|
4
|
8,772
|
10 Mayo 2012, 06:43 am
por baspetro
|
|
|
llenar matriz con Random en Dev C
Programación C/C++
|
binaryum
|
5
|
28,055
|
20 Julio 2010, 04:26 am
por MIG80
|
|
|
llenar una matriz en c++
Programación C/C++
|
gak-f5
|
1
|
44,060
|
28 Mayo 2012, 15:43 pm
por STANHMAL
|
|
|
Punteros a estructuras...???
Programación C/C++
|
Ja_90
|
4
|
2,618
|
11 Noviembre 2014, 21:10 pm
por eferion
|
|
|
Estructuras con Punteros
Programación C/C++
|
jgonzalezo
|
1
|
1,811
|
13 Abril 2015, 09:02 am
por eferion
|
|