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

#1
Programación C/C++ / Problema con buzones
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)
        {
                perror("msgnd");
                raise(SIGINT);
        }
        }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)
                {
                        perror("msgrcv");
                        raise(SIGINT);
                }
       
        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)
        {
                perror("msgnd");
                raise(SIGINT);
        }
        }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)
                {
                        perror("msgrcv");
                        raise(SIGINT);
                }
        luz_sem(VERTICAL, VERDE);
        }
}


Muchas gracias!
#2
Programación C/C++ / escribir en un fichero binario
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

sprintf(buffer, "0");
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){
perror("Abrir fichero");
exit(1);
}
buffer2=mmap (0, tam_fich , PROT_READ | PROT_WRITE , MAP_SHARED, archivo , 0);

if(buffer2==MAP_FAILED){
perror("MEMORIA");
exit(1);
}

/*aqui iria el codigo para guardar 10 ceros en formato binario*/
#3
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:
perror("padre"); exit(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
Cita de: MAFUS en  4 Junio 2018, 20:15 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{
free(nuevo);
#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);
    fscanf(fid, "%d ", info);
    insertarNodoComienzo(raiz, info);
    }
    else if((fscanf(fid, "%d ", info))!=EOF){
    while(fscanf(fid, "%d ", info)!=EOF){
    aux=*raiz;
    insertarOrdenada(&aux, info);
    }
   
    }else{
    fclose(fid);
   #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
Cita de: MAFUS en  4 Junio 2018, 17:33 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
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);
fscanf(fid, "%d ", info);
insertarNodoComienzo(raiz, info);
}
else if((fscanf(fid, "%d ", info))!=EOF){
while(fscanf(fid, "%d ", info)!=EOF){
aux=*raiz;
insertarOrdenada(&aux, info);
}

}else{
fclose(fid);
#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
ASM / adressing mode error
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:

Código (asm) [Seleccionar]
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
ASM / Re: ensamblador dudas
18 Mayo 2018, 18:18 PM
Cita de: ivancea96 en 17 Mayo 2018, 13:53 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
ASM / ensamblador dudas
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"
       
Código (asm) [Seleccionar]
 .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
#10
Cita de: MAFUS en 27 Febrero 2018, 14:45 PM
Línea 63:
scanf("%c", &operacion);
operacion ya es un puntero y no debes usar el &. Debe quedarte así:
scanf("%c", operacion);


Sabía que sería algun detalle así. Muchas gracias!