Exemple #1
0
/*
 *	<sentencia> →
 *	<identificador> := <expresión> #asignar ;  |
 *	leer ( <listaIdentificadores> ) ; |
 *	escribir ( <listaExpresiones> ) ;
 */
void sentencia(void) {
	token tok = prox_token();
	struct reg_expr id_reg, result_reg;
	
	switch(tok) {
		case ID:
			identificador(&id_reg);
			match(ASIGNACION);
			expresion(&result_reg);
			asignar(&id_reg, &result_reg);
			match(PUNTOYCOMA);
			break;
		case LEER:
			match(LEER);
			match(PARENIZQUIERDO);
			lista_identificadores();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		case ESCRIBIR:
			match(ESCRIBIR);
			match(PARENIZQUIERDO);
			lista_expresiones();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		default:
			error_sintactico(tok);
			return;
	}
}
int main(int argc, char **argv){
  float *x,*y,*t,*ks,*alpha_walk, *beta_walk, *gamma_walk, *epsilon_walk, *datost, *datosx, *datosy;
  float h,alpha,beta,gamma,epsilon;
  int n_points,i,n_puntos,n_burn;

  //96 lineas tienen los datos
  n_points = 96;
  //parametros entrados por consola
  n_puntos = atoi(argv[1]);
  n_burn = atoi(argv[2]);
  //arreglos para guardar los datos del tiempo, presas y depredadores
  datost = crearArregloCero(96);
  datosx = crearArregloCero(96);
  datosy = crearArregloCero(96);
  //asignar los datos del archivo a los arreglos datost, datosx, datosy
  asignar(datost,datosx,datosy);
  //arreglos para guardar los mejores parametros estimados
  alpha_walk = crearArregloCero(n_puntos);
  beta_walk = crearArregloCero(n_puntos);
  gamma_walk = crearArregloCero(n_puntos);
  epsilon_walk = crearArregloCero(n_puntos);
  //valores aleatorios para el modelo
  srand48(time(NULL));
  alpha_walk[0] = drand48()*0.2-0.1;
  beta_walk[0] = drand48()*0.2-0.1;
  gamma_walk[0] = drand48()*0.2-0.1;
  epsilon_walk[0] = drand48()*0.2-0.1;
  //inicializar los arreglos 
  alpha = alpha_walk[0];
  beta = beta_walk[0];
  gamma = gamma_walk[0];
  epsilon = epsilon_walk[0];
  //Arreglos para el RungeKutta
  ks = crearArregloCero(2);
  x = crearArregloCero(n_points);
  x[0] = 15.0;
  y = crearArregloCero(n_points);
  y[0] = 13.0;
  t = crearArregloCero(n_points);
  t[0] = 0.006;
  t[95] = 0.799;
  h = (t[95]-t[0])/n_points ;
  //RungeKutta
  loopRungeKutta4(ks,x,y,t,h,alpha,beta,gamma,epsilon,n_points);
  //Rungekutta y markov deben ir en un loop

  for(i=0;i<n_points;i++){
    printf("%f %f %f\n", t[i],x[i],y[i]);
  }

  return 0;
}
void retornar(t_valor_variable retorno) {
    if(status_check() != EXECUTING)
        return;

    //1) Obtengo el stack index
    t_stack * actual_stack_index = actual_pcb->stack_index;
    //2) Obtengo la entrada actual
    t_stack_entry *last_entry = get_last_entry(actual_stack_index);
    //3) Actualizo el PC a la posicion de retorno de la entrada actual
    actual_pcb->program_counter = last_entry->ret_pos;
    //4) Asigno el valor de retorno de la entrada actual a la variable de retorno
    asignar(obtener_t_posicion(last_entry->ret_vars), retorno);
    //5) Libero la ultima entrada del indice de stack
    free(pop_stack(actual_stack_index));
}
Exemple #4
0
void sentencia(void) {
    /*
	 * <sentencia> -> <identificador> ASIGNACION <expresión> PUNTOYCOMA
	 *              | LEER PARENIZQUIERDO <listaIdentificadores> PARENDERECHO PUNTOYCOMA
	 *              | ESCRIBIR PARENIZQUIERDO <listaExpresiones> PARENDERECHO PUNTOYCOMA
	 */
	token tok = next_token();
	reg_expr right_operand, left_operand;
	switch (tok) {
            
		case ID:
			identificador(&left_operand);
			match(ASIGNACION);
			expresion(&right_operand);
			asignar(&left_operand, &right_operand); // #asignar
			match(PUNTOYCOMA);
			break;

		case LEER:
			match(LEER);
			match(PARENIZQUIERDO);
			lista_identificadores();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;

		case ESCRIBIR:
			match(ESCRIBIR);
			match(PARENIZQUIERDO);
			lista_expresiones();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;

		default:
			syntax_error(tok, "SENTENCIA");
	}
}
Exemple #5
0
void menu(matriz A, matriz B)
{int op; limpiar();double x;
 gotoxy(10,5);  cout<<"[1] OBTENER UN ELEMENTO DE A..";
 gotoxy(10,6);  cout<<"[2] OBTENER UN ELEMENTO DE B..";
 gotoxy(10,7);  cout<<"[3] ASIGNAR UN ELEMENTO DE A..";
 gotoxy(10,8);  cout<<"[4] ASIGNAR UN ELEMENTO DE B..";
 gotoxy(10,9);  cout<<"[5] IGUALAR A<-B..............";
 gotoxy(10,10); cout<<"[6] IGUALAR B<-A..............";
 gotoxy(10,11); cout<<"[7] SUMAR A + B...............";
 gotoxy(10,12); cout<<"[8] NEGATIVA DE A.............";
 gotoxy(10,13); cout<<"[9] NEGATIVA DE B.............";
 gotoxy(10,14); cout<<"[10] RESTAR A - B.............";
 gotoxy(10,15); cout<<"[11] RESTAR B - A.............";
 gotoxy(10,16); cout<<"[12] ESCALAR PARA A...........";
 gotoxy(10,17); cout<<"[13] ESCALAR PARA B...........";
 gotoxy(10,18); cout<<"[14] PRODUCTO A * B...........";
 gotoxy(10,19); cout<<"[15] PRODUCTO B * A...........";
 gotoxy(10,20); cout<<"[16] TRANSPUESTA DE A.........";
 gotoxy(10,21); cout<<"[17] TRANSPUESTA DE B.........";
 gotoxy(10,22); cout<<"[18] DETERMINANTE DE A........";
 gotoxy(10,23); cout<<"[19] DETERMINANTE DE B........";
 gotoxy(10,24); cout<<"[20] INVERSA DE A.............";
 gotoxy(10,25); cout<<"[21] INVERSA DE B.............";
 gotoxy(10,26); cout<<"[22] SALIR....................";
 do{gotoxy(22,28); cout<<"Seleccione una opcion (1-22): ";cin>>op;
 if(op<1 || op>22)
  {gotoxy(20,28);cout<<"Opci¢n incorrecta vuelva a intentar";}
 }while(op<1 || op>22);
 switch(op)
 {case 1:  {limpiar();gotoxy(28,4);  cout<<"[1] OBTENER UN ELEMENTO DE A..";
	    obtener(A);menu(A,B);break;}
  case 2:  {limpiar(); gotoxy(28,4); cout<<"[2] OBTENER UN ELEMENTO DE B..";
	    obtener(B);menu(A,B);break;}
  case 3:  {limpiar(); gotoxy(28,4); cout<<"[3] ASIGNAR UN ELEMENTO DE A..";
	    imprimir(asignar(A));getchar();menu(A,B);break;}
  case 4:  {limpiar(); gotoxy(28,4); cout<<"[4] ASIGNAR UN ELEMENTO DE B..";
	    imprimir(asignar(B));getchar();menu(A,B);break;}
  case 5:  {limpiar(); gotoxy(28,4); cout<<"[5] IGUALAR A<-B..............";
	    imprimir(igual(A,B));menu(A,B);break;}
  case 6:  {limpiar(); gotoxy(28,4); cout<<"[6] IGUALAR B<-A..............";
	    imprimir(igual(B,A));menu(A,B);break;}
  case 7:  {limpiar(); gotoxy(28,4); cout<<"[7] SUMAR A + B...............";
	    imprimir(sumar(A,B));menu(A,B);break;}
  case 8:  {limpiar(); gotoxy(28,4); cout<<"[8] NEGATIVA DE A.............";
	    imprimir(negativa(A));menu(A,B);break;}
  case 9:  {limpiar(); gotoxy(28,4); cout<<"[9] NEGATIVA DE B.............";
	    imprimir(negativa(B));menu(A,B);break;}
  case 10: {limpiar(); gotoxy(28,4); cout<<"[10] RESTAR A - B.............";
	    imprimir(restar(A,B));menu(A,B);break;}
  case 11: {limpiar(); gotoxy(28,4); cout<<"[11] RESTAR B - A.............";
	    imprimir(restar(B,A));menu(A,B);break;}
  case 12: {limpiar(); gotoxy(28,4); cout<<"[12] ESCALAR PARA A...........";
	    imprimir(escalar(A));menu(A,B);break;}
  case 13: {limpiar(); gotoxy(28,4); cout<<"[13] ESCALAR PARA B...........";
	    imprimir(escalar(B));menu(A,B);break;}
  case 14: {limpiar(); gotoxy(28,4); cout<<"[14] PRODUCTO A * B...........";
	    imprimir(producto(A,B));menu(A,B);break;}
  case 15: {limpiar(); gotoxy(28,4); cout<<"[15] PRODUCTO B * A...........";
	    imprimir(producto(B,A));menu(A,B);break;}
  case 16: {limpiar(); gotoxy(28,4); cout<<"[16] TRANSPUESTA DE A.........";
	    imprimir(transpuesta(A));menu(A,B);break;}
  case 17: {limpiar(); gotoxy(28,4); cout<<"[17] TRANSPUESTA DE B.........";
	    imprimir(transpuesta(B));menu(A,B);break;}
  case 18: {limpiar(); gotoxy(28,4); cout<<"[18] DETERMINANTE DE A........";
	    x=det(A);gotoxy(5,5);cout<<"Determinante = "<<x;getchar();menu(A,B);break;}
  case 19: {limpiar(); gotoxy(28,4); cout<<"[19] DETERMINANTE DE B........";
	    x=det(B);gotoxy(5,5);cout<<"Determinante = "<<x;getchar();menu(A,B);break;}
  case 20: {limpiar(); gotoxy(28,4); cout<<"[20] INVERSA DE A.............";
	    inversa(A);menu(A,B);break;}
  case 21: {limpiar(); gotoxy(28,4); cout<<"[21] INVERSA DE B.............";
	    inversa(B);menu(A,B);break;}
  case 22: {limpiar(); gotoxy(28,4); cout<<"[22] SALIR....................";
	    gotoxy(10,10); cout<<"Saliendo...";
	    gotoxy(25,23); cout<<"Presione Enter Para Salir...";break;
	   }
 }
}
Exemple #6
0
String::String(const char *s, int largo) : buffer(NULL),
												tamanoReservado(0), tamano(0) {
	asignar(s, largo);
}
Exemple #7
0
String::String(const char * s) : buffer(NULL), tamanoReservado(0), tamano(0) {
	asignar(s);
}
void retornar(t_valor_variable retorno) {

	if (SEG_flag == 1)
			return;
		printf("retornar\n");
		uint32_t prog_counter_ant; //vamos a pedir los 12 bytes que guardamos en el stack para volver al cntxt anterior.
		uint32_t cursor_contexto_ant;
		uint32_t direccion_retornar;
		uint32_t cant_vars_ant;

		t_struct_sol_bytes * punts_contx_ant = malloc(sizeof(t_struct_sol_bytes));
		punts_contx_ant->base = var_seg_stack;
		punts_contx_ant->offset = (temp_cursor_stack - (3 * sizeof(uint32_t))); //-var_seg_stack;estoy casi seguro que no se le resta la base, porq el cursor de contexto ya es el offset de la base  //restamos el cursor actual - 12(xq es el tamaño de los punteros q guarde en la umv) - el inicio del stack.
		punts_contx_ant->tamanio = 3 * sizeof(uint32_t);

		socket_enviar(sockUMV, D_STRUCT_SOL_BYTES, punts_contx_ant);
		void * structRecibido;
		t_tipoEstructura tipoStruct;

		socket_recibir(sockUMV, &tipoStruct, &structRecibido);
		if (tipoStruct != D_STRUCT_RESPUESTA_UMV) {
			printf("%d\n", tipoStruct);
		}

		int tamanio_instruccion;
		tamanio_instruccion = ((t_struct_respuesta_umv*) structRecibido)->tamano_buffer;

		if (tamanio_instruccion == sizeof(int)) {
			int*respuesta = malloc(sizeof(int));
			memcpy(respuesta, ((t_struct_respuesta_umv*) structRecibido)->buffer, tamanio_instruccion);
			int valor1 = *respuesta;
			if (valor1 < 0) {
				excepcion_UMV(0);
				return;
			}

		}

		int tmanio_respuesta, offset;
		tmanio_respuesta = ((t_struct_respuesta_umv*) structRecibido)->tamano_buffer; //esto esta al pedo

		memcpy(&cursor_contexto_ant, ((t_struct_respuesta_umv*) structRecibido)->buffer, offset = sizeof(uint32_t));
		memcpy(&prog_counter_ant, ((t_struct_respuesta_umv*) structRecibido)->buffer + offset, sizeof(uint32_t));
		offset += sizeof(uint32_t);
		memcpy(&direccion_retornar, ((t_struct_respuesta_umv*) structRecibido)->buffer + offset, sizeof(uint32_t));
		free(((t_struct_respuesta_umv*) structRecibido)->buffer);
		free(structRecibido);
		dictionary_clean_and_destroy_elements(dicc_variables, free);  // debemos limpiar el diccionario y rellenarlo con las variables del contexto anterior

		cant_vars_ant = ((punts_contx_ant->offset) - cursor_contexto_ant) / 5;

		int i = 0;
		int incremento = 0;
		int posicion = 1;

		while (i < cant_vars_ant) {		// con esto volvemos a llenar el dicc_variables con las variables del contexto anterior

			int valor_var;
			char nombre_var;

			t_struct_sol_bytes * sol_var_ant = malloc(sizeof(t_struct_sol_bytes));
			sol_var_ant->base = var_seg_stack;
			sol_var_ant->offset = cursor_contexto_ant + incremento;
			sol_var_ant->tamanio = sizeof(char) + sizeof(int);
			socket_enviar(sockUMV, D_STRUCT_SOL_BYTES, sol_var_ant);

			void * structRecibido2;
			t_tipoEstructura tipoStruct2;

			socket_recibir(sockUMV, &tipoStruct2, &structRecibido2);
			if (tipoStruct2 != D_STRUCT_RESPUESTA_UMV) {
				printf("%d\n", tipoStruct2);
			}
			memcpy(&nombre_var, ((t_struct_respuesta_umv*) structRecibido2)->buffer, offset = sizeof(char));
			memcpy(&valor_var, ((t_struct_respuesta_umv*) structRecibido2)->buffer + offset, sizeof(int));		// no es necesario este valor

			char key = nombre_var;
			char keyABuscar[2] = { key, '\0' };

			int* posicion_variable = malloc(sizeof(int));
			*posicion_variable = posicion;

			dictionary_put(dicc_variables, keyABuscar, posicion_variable);

			incremento = incremento + (sol_var_ant->tamanio);
			i++;
			posicion++;
			free(sol_var_ant);
			free(((t_struct_respuesta_umv*) structRecibido2)->buffer);
			free(structRecibido2);
			//free(posicion_variable);
		}

		temp_counter = prog_counter_ant; //aca  cargamos PCounter del cntxt que guradamos en la UMV.
		temp_cursor_stack = cursor_contexto_ant; //aca cargo elcursor del cntxt anterior q se guardo en la UMV.
		//direccion_retornar=retorno; // esto no creo q sea asi, me parece que deberia hacerse una asignacion del valor de "reotorno" en la "direccion_retornar". lO hice mas arriba
		var_tamanio_contexto = cant_vars_ant; // recuperamos nuestro tamanio de contexto anterior cortesia de la variable cant_vars_ant creada para el recupero del diccionario de variables ;)

		if (retorno != -1) {
			asignar(direccion_retornar, retorno);		// el if es para reutilizar el reotornar en el finalizar omitiendo la asignacion
		}
		log_escribir(archLog,"Se termina de ejecutar una instruccion",INFO,"Se ejecuto retornar");
		free(punts_contx_ant);
		printf("retornar\n");
}