|
Mostrar Mensajes
|
Páginas: [1] 2
|
1
|
Programación / Programación C/C++ / Problema con buzones
|
en: 4 Abril 2019, 18:47 pm
|
Hola! Estaba haciendo un ejercicio en el cual hay que sincronizar varios procesos y que estos procesos sigan sincronizandose (en este caso los procesos son unos semaforos que tienen que ir cambiando de color de forma logica osea cuando uno este en verde el otro no puede estar en verde y viceversa) hasta que se pulse ctrl-c. El caso es que mi idea era realizar esta sincronizacion con un buzon IPC pero el problema viene que despues de la primera interaccion del bucle infinito el programa ya no vuelve a cambiar de color los semaforos, es decir, si inicialmente los semaforos estan uno a verde y otro a rojo el programa entra en el bucle y cambia el verde a rojo y el rojo a verde SOLO 1 vez (el objetivo es que este cambio se produzca continuamente). Dejo aqui el codigo: int buzon = atoi(p_memC +334); //el buzon esta correctamente inicializado y guardado en memoria compartida int envio, recibo; struct tipo_mensaje { long tipo; char mensaje[20]; }mensaje; while(1){ if(*(p_memC+274) == VERDE) //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem { luz_sem(HORIZONTAL, ROJO); strcpy(mensaje. mensaje, "HORIZ ROJO"); mensaje.tipo = HORIZONTALROJO; if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1) { } }else if(*(p_memC+274) == ROJO){ mensaje.tipo=VERTICALROJO; if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1) { } luz_sem(HORIZONTAL, VERDE); //esta es una funcion que esta comprobada que funciona correctamente para cambiar el semaforo de color }else if(*(p_memC+275) == VERDE){ //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem luz_sem(VERTICAL, ROJO); strcpy(mensaje. mensaje, "VERTICAL ROJO"); mensaje.tipo = VERTICALROJO; if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1) { } }else if(*(p_memC+275) == ROJO){ mensaje.tipo=HORIZONTALROJO; if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1) { } luz_sem(VERTICAL, VERDE); } }
Muchas gracias!
|
|
|
2
|
Programación / Programación C/C++ / escribir en un fichero binario
|
en: 20 Diciembre 2018, 11:30 am
|
Hola, buenas, estaba haciendo un pequeño programa en el que una parte consiste en crear un fichero "prueba.bin", proyectarlo en memoria y luego inicializarlo a cero para luego ya meterle los valores que vamos a usar. El problema es que para inicializarlo, no se como meter los 0 en formato binario, lo habia hecho con write (archivo , buffer , strlen(buffer ));
pero despues me di cuenta de que asi estaba mal, ya que si no me equivoco se guarda en buffer como string. aqui os dejo el resto del codigo tambien, muchas gracias int archivo, tam_fich=40; char * buffer2; archivo=open("prueba.bin", O_RDWR | O_CREAT, 0777 ); if(archivo == -1){ } buffer2=mmap (0, tam_fich , PROT_READ | PROT_WRITE , MAP_SHARED, archivo , 0); if(buffer2==MAP_FAILED){ } /*aqui iria el codigo para guardar 10 ceros en formato binario*/
|
|
|
3
|
Programación / Programación C/C++ / cambiar de nombre a un proceso
|
en: 4 Diciembre 2018, 19:47 pm
|
Hola buenas, estaba haciendo un pequeño programa en C en el cual a partir de un proceso padre creo un proceso hijo y muestro por pantalla el PID del padre y del hijo, además de eso quería que al ejecutarlo en segundo plano al hacer un ps el nombre del proceso hijo cambie de "padre" a "hijo". He leido que con un execl cambiando el argumento argv[0] por "hijo" debería de funcionar pero no me funciona. Os adjunto aquí el código. Muchas gracias! #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv[]){ //printf("%s\n", argv[0]); if(strcmp(argv [0],"hijo")==0){ malo(); }else{ switch(fork()){ case -1: case 0: printf("%d: Soy el hijo\n", getpid ()); break; default: printf("%d: Soy el padre\n", getpid ()); } execl(argv[0],"hijo", NULL); //printf("%s", argv[0]); } pause(); //sleep(30); }
|
|
|
4
|
Programación / Programación C/C++ / Re: problema con ficheros :/
|
en: 4 Junio 2018, 20:29 pm
|
¿Podrías pasar todo el código para entender que hace el conjunto?
[code=c]int crearVacia(ListaEnlazadaRef raiz){ *raiz=NULL; //tipoNodo** <> ListaEnlazadaRef return 0; //tipoNodo* <> ListaEnlazada } int estaVacia(ListaEnlazada raiz) { return (raiz==NULL); } int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info) { return insertarAntesDeNodo(raiz,NULL,info); } int insertarAntesDeNodo(ListaEnlazadaRef raiz, tipoNodoRef pos, tipoInfoRef info){ tipoNodoRef nuevo, anterior; if((nuevo=creaNodo(info))==NULL){ #ifdef DEBUG fprintf(stderr , "Error: creando nodo\n"); #endif return -1; }else{ if(estaVacia(*raiz) || pos==NULL || pos==*raiz){ nuevo->sig=*raiz; *raiz=nuevo; }else{ anterior=*raiz; //ant=*raiz while(anterior!=NULL && anterior->sig!=pos){ anterior=anterior->sig; } if(anterior!=NULL){ nuevo->sig=pos; anterior->sig=nuevo; }else{ #ifdef DEBUG fprintf(stderr , "Error: posicion inexistente\n"); #endif return -2; } } return 0; } } int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info){ tipoNodoRef ant; if(estaVacia(*raiz) || *info < (*raiz)->info) return insertarNodoComienzo(raiz,info); else{ ant=*raiz; while(ant->sig!=NULL && ant->sig->info < *info){ ant = ant->sig; } return insertarDespuesDeNodo(raiz, ant, info); } } int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){ int cont=0; tipoNodoRef aux, nuevo; FILE *fid; tipoInfoRef info; if ((fid =fopen(nombreFichero , "r"))==NULL ){ #ifdef DEBUG fprintf(stderr , "Error: abriendo fichero\n"); #endif return -1; }else{ if(estaVacia(*raiz)){ crearVacia(raiz); insertarNodoComienzo(raiz, info); } else if((fscanf(fid , "%d ", info ))!=EOF ){ while(fscanf(fid , "%d ", info )!=EOF ){ aux=*raiz; insertarOrdenada(&aux, info); } }else{ #ifdef DEBUG fprintf(stderr , "Error: leyendo fichero\n"); #endif return -2; } } return 0; }
[/code] Y bueno aqui estaria la llamada en el main: [code =c ]printf("Introduce el nombre de la lista de la cual quieres coger los datos: "); scanf("%s%*c", nombreFichero ); printf("Guardando fichero en lista: %d\n", cargarListaEnlazadaTexto (&raiz , nombreFichero ));
[/code] (espero no haberme liado al copiar nada que no tenga que ver ni nada por el estilo :/ )
|
|
|
5
|
Programación / Programación C/C++ / Re: problema con ficheros :/
|
en: 4 Junio 2018, 19:10 pm
|
Te lías con los punteros: seguro que estaVacia espera un puntero; aux=*raiz; debería ser aux=raiz; insertarOrdenada ¿espera un puntero a puntero?
Lo de los punteros esta bien, igualmente lo he revisado y al cambiarlo a como me has dicho me dan errorres :/ Igualmente voy a dejar aqui los prototipos de las funciones que uso y los typedefs: typedef int tipoInfo; typedef tipoInfo *tipoInfoRef; typedef struct tipoNodo { tipoInfo info; struct tipoNodo * sig; } tipoNodo; typedef tipoNodo *tipoNodoRef; typedef tipoNodo * ListaEnlazada; typedef ListaEnlazada *ListaEnlazadaRef; /*Prototipos*/ int crearVacia(ListaEnlazadaRef raiz); int estaVacia(ListaEnlazada raiz); int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info); int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info);
|
|
|
6
|
Programación / Programación C/C++ / problema con ficheros :/
|
en: 4 Junio 2018, 14:50 pm
|
Hola buenas, me hayo haciendo un pequeño programa en C, en el cual una de las cosas que debe de hacer es crear una lista enlazada con los valores que le pasamos desde un fichero de texto, el problema es que al ejecutarlo me da "Violacion de segmento('core' generado)", y no encuentro el error. El codigo que tengo es el siguiente: int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){ int cont=0; tipoNodoRef aux, nuevo; FILE *fid; tipoInfoRef info; if ((fid =fopen(nombreFichero , "r"))==NULL ){ #ifdef DEBUG fprintf(stderr , "Error: abriendo fichero\n"); #endif return -1; }else{ if(estaVacia(*raiz)){ crearVacia(raiz); insertarNodoComienzo(raiz, info); } else if((fscanf(fid , "%d ", info ))!=EOF ){ while(fscanf(fid , "%d ", info )!=EOF ){ aux=*raiz; insertarOrdenada(&aux, info); } }else{ #ifdef DEBUG fprintf(stderr , "Error: leyendo fichero\n"); #endif return -2; } } return 0; }
**Todas las funciones a las que llamo dentro de la funcion funcionan a la perfeccion.
|
|
|
7
|
Programación / ASM / adressing mode error
|
en: 18 Mayo 2018, 18:22 pm
|
Hola muy buenas. Estaba haciendo un codigo en asm6809 y no me funcionaba bien pero si me compilaba, quite unas lineas del final para ir viendo poco a poco como cambiarlo y ahora me da dos errores en una parte que no he modificado: programa: std nuevo ;guardo el numero generado en nuevo cmpu #pilaU ;miro si la lista esta vacia comparando U con la direccion inicial que le hemos cargado #pilaU bne subrutina vacia: ;si la lista esta vacia la inicio pshu nuevo pshu #0x0000 ldx #nuevo stx anterior subrutina: ldx anterior ldd ,-x cmpd nuevo bhs insertar_despues;esta parte ya no la tengo hecha por lo que ahora mismo no existe insertar despues rts
El error de adressing mode me lo da excatamente en el pshu nuevo y pshu #0x0000
|
|
|
8
|
Programación / ASM / Re: ensamblador dudas
|
en: 18 Mayo 2018, 18:18 pm
|
Invalid OpCode, ¿dónde?
Muchas gracias por preguntar pero ya lo he conseguido corregir. De todas maneras te respondo, me daba invalid opcode al final del programa, no recuerdo ya exactamente el lugar
|
|
|
9
|
Programación / ASM / ensamblador dudas
|
en: 16 Mayo 2018, 16:35 pm
|
Hola, buenas. Quería ver si alguien me podría ayudar con un pequeño programita en ensamblador asm 6809. El programa consiste en pedir una semilla inicial para generar tantos numeros aleatorios como indique la semilla y se van imprimiendo dichos números en pantalla. Despues de esto se tienen que mostrar de nuevo esa lista de numeros pero que dichos numeros aparezcan de manera ordenada. Tengo ya las subrutinas en ficheros a parte hechas (leer_decimal, rand, srand, imprimir_decimal_ imprimir_cadena) y todas ellas por separado funcionan correctamente. A la hora de hacer el main para llevar a cabo lo descrito antes con tan solo el codigo que dejo aqui abajo me da un error: "invalid opcode" .module main ;definimos constantes teclado .equ 0xFF02 fin .equ 0xFF01 pantalla .equ 0XFF00 ;.org 0x100 .globl programa .globl rand .globl srand .globl leer_decimal .globl imprime_cadena cont: .word 0 introduc_sem: .ascii "Introduce semilla:" .byte 0 programa: ldx #0xE000 lda introduc_sem jsr leer_decimal std cont jsr srand std ,--x bucle: jsr rand std ,--x ldd cont addd #0xFFFF cmpd #0 bne bucle acabar: clra sta fin .area FIJA (ABS) .org 0xFFFE ; vector de RESET .word programa
Se me ha olvidado mencionar que lo que se supone que estoy intentando hacer en este fragmento de codigo es pedir la semilla, generar los numeros aleatorios y guardarlos en el registro X para no perder los numeros generados · No se debe hacer doble post >aquí las reglas del foro -Engel Lex
|
|
|
|
|
|
|