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ú

Temas - VladisMSX1

#1
Hola foreros. Estoy intentando portar unas funciones que escribí en dev-c++ y funcionan correctamente a Visual Studio 2010. Me tira problemas por todos lados cuando porto el programa, con cosas como las llamadas system e incluso declaraciones como los for. En total, un código de algo mas de 500 líneas me lanza 64 errores, una barbaridad, y son todos del estilo de:

"Intellisense: Se esperaba una declaración"
"Intellisense: Se esperaba )"
"intellisense: "IMoaUnknownVtbl" no está definido"

Me llega a tirar errores incluso cuando intento usar variables declaradas en una función, diciendome que no están declaradas.

Nunca he usado Visual Studio y no se si tengo que incluir alguna librería o configurar el editor para que me interprete correctamente el código. ¿Alguna ayuda?

Gracias, un saludo ;)
#2
Buenas gente. Tengo un pequeño problema lógico que me está rompiendo el cráneo.

He creado una función que recibe una serie de datos (canal, valor de inicio, valor final, duración) y con un bucle anidado envía los datos a otra función. El bucle anidado está pensado para seguir un intervalo regular, el bucle interior se repite 25 veces en un segundo, y el exterior se repite en función del número de segundos que quiera que dure el envío, y ese dato en segundos es el que le envio a la función.

La gracia está en que el número de envíos por segundo tiene que ser constante, 25 por segundo, pero el rango de valores (valor final - valor de inicio) puede ser cualquiera. Eso significa que tengo que repetir valores o quitarlos para que ajuste a esos 25 valores por segundo, de manera escalonada y continua (no puedo eliminar los valores sobrantes de golpe al principio o al final).

La sucesión de datos, para que lo entendáis, es para subir o bajar la cantidad de luz que un dimmer le entrega a un foco. Envia el dato cada vez que el bucle interior cumple un ciclo a la función conectar.

Os copio la función para que veais el lio que he montado:


int rampa(int canal, int valor_a, int valor_b, int duracion)                 //Función de rampa para un canal
       {
       int i;
       if ((canal<1) || (canal>512) || (valor_a<0) || (valor_b>255) || (valor_b<valor_a) || (valor_b>255) || (duracion<1))
          {
          system("cls");
          cout<<"ERROR - Numero de canal o valor indicado fuera de rango\nPulsa cualquier tecla para continuar...";
          getch();
          return 1;
          }
       else
           {
           int i, j, k, cont, cont_b=0, intervalo, valores_segundo_sin, valores_segundo_fijo, resta, resta_cont;
           intervalo=valor_b-valor_a;                                           //Intervalo de valores de la rampa
           valores_segundo_sin=intervalo/duracion;                              //numero de valores por segundo sin reducir a 25/s
           valores_segundo_fijo=25;                                             //numero de valores por segundo fijos
           resta=valores_segundo_sin - valores_segundo_fijo;                    //numero de valores a eliminar en un segundo
           cont=valor_a;                                                        //asignamos al contador el valor de inicio
           resta_cont=valores_segundo_sin/valores_segundo_fijo;                   //Cada cuantos valores se elimina uno en un segundo
           //Positivamos los valores resta para poder trabajar con ellos
           if (resta_cont<0)
              {
              //Aqui la variacion de añadir o quitar IMPORTANTE
              resta=resta*(-1);
              }
           if (resta<0)
              {
              resta=resta*(-1);
              }
           
           //ARRAY DE VALORES DE CANALES
           char valores[526];
           for (k=0; k<526; k++)
              {
              valores[k]=0;
              }
           //ARRAY DE SECUENCIA
           char secuencia[1];
           
           for (j=0; j<duracion; j++)//Este bucle dura la cantidad de segundos que se han ordenado
               {
               for (i=0; i<25; i++)//Este bucle dura exactamente 1 segundo y contiene 25 repeticiones
                   {
                   valores[canal-1]=cont;
                   secuencia[0]=secuencia[0]+1;
                   cont++;
                   cont_b++;
                   if (cont_b==resta_cont)
                      {
                      cont++;
                      cont_b=0;
                      }
                   if (secuencia[0]==255)
                      {
                      secuencia[0]=0;
                      }
                   conectar(valores, secuencia);

                   Sleep(40); //Pausa en ms para que el bucle dure 1s (1000ms / 25= 40ms)
                   }
               }
           return 0;
           }
       };


Me da dos problemas principalmente. El primero es que no recorre todo el rango de valores que le pido. Si le digo que vaya de 0 a 255, solo llega a enviar un tercio de los valores.

El segundo problema es que no cumple la pausa de 40ms. O no está bien especificado. Porque tarda muuuuuuuuuuuuuuuuuuuuuucho mas de los segundos que le especifico.

¿Debería enfocarlo todo de otra manera? ¿Que hago mal?

Gracias por la ayuda  :D
#3
Buenos días programadores. Soy un desarrollador en prácticas y tengo un pequeño problema. Si pudiérais ayudarme os lo agradecería mucho.

Estoy escribiendo un programa en C para enviar paquetes Artnet a un dispositivo DMX. El programa en si es un socket Winsock que envía una cadena de números por UDP.

El problema que tengo es que cuando creo la conexión y defino el socket, puedo asignar el puerto de destino en el campo sin_port de la estructura sockaddr_in, asignando el valor del puerto a la función htons, pero el puerto de origen que suele aplicarme es un puert efímero con un valor sobre 63000. Y como el cacharrito DMX es un poco pejilguero, si el puerto de origen y el de destino no son ambos 6454, no ejecuta las instrucciones del paquete.

¿Cómo podría decirle a Winsock que me aplique el puerto de origen que yo deseo?

Gracias por todo, un saludo!