• Domingo 13 de Julio de 2025, 20:23

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - zairillo

Páginas: [1]
1
Programación en C / Programación paralela
« en: Viernes 15 de Abril de 2011, 09:35 »
Hola a todos!

Estoy empezando a trabajar con programación paralela pero necesitaría aclarar unos conceptos que, después d buscar por internet, no me quedan claros del todo.
La sentencia #pragma omp parallel lo que hace es crear tantos threads como tu definas, ¿cierto?
Entonces si dentro de esa sentencia pongo por ejemplo:
 #pragma omp parallel shared(valor) //previamente definido a 0
{
id_thread = omp_get_thread_num();
leido = valor;
valor += 10;
escrito = valor;
printf("thread %d, lee valor %d y escribe valor %d", id_thread, leido, escrito);
}

Lo que hay dentro de la sentencia pragma lo ejecutará cada thread pero mientras uno lo esté ejecutando, otro no tendrá acceso a esa región, quiero decir, un thread empieza a ejecutarlo y cuando termina, empieza el siguiente y así sucesivamente, ¿es así?

Ahora bien, modifico lo siguiente en el programa:
#pragma omp parallel shared(valor) //previamente definido a 0
{
id_thread = omp_get_thread_num();
#pragma omp barrier
leido = valor;
valor += 10;
escrito = valor;
printf("thread %d, lee valor %d y escribe valor %d", id_thread, leido, escrito);
}

Por lo que cuando un thread lee la barrera, espera a que todos los demás threads lleguen ahí ¿correcto? Pero el problema que tengo es que no entiendo por qué los datos que presenta por pantalla no está en orden como en el caso anterior es decir, si la primera vez que se lee "valor" es 0 y se escribe 10, y la segunda vez se lee 10 y se esribe 20, ¿por qué no siempre va en ese orden?

Espero haberme explicado. Un saludo y muchas gracias!

2
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Jueves 2 de Abril de 2009, 13:48 »
:beer:

3
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Jueves 2 de Abril de 2009, 13:25 »
Todos no podemos saber tanto...Si todos fuéramos tan listos...qué sería...Pensé que en los foros se intentaba ayudar, como hace Eternal Idol, no chulear como haces tú, porque las cosas se pueden decir de otra forma...En fin...
He preguntado si sería igual, porque el resultado es algo imposible, ya que, el resultado es en segundo, y si eso lo pasaba a años serían 419805086867 años...Pero ya he estado investigando y con una función de la librería time.h me lo da exacto.
Muchas gracias por la ayuda de estos días, y perdón por las molestias!

4
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Jueves 2 de Abril de 2009, 12:16 »
He estado probando lo que me dijiste. Ya creo que sé en qué radica el problema.
Los valores que me devuelve el GPS están en hexadecimal, de ahí que a la hora de convertir a float los valores, lo que me salga no tenga mucho sentido... ¿La forma de la conversión sería la misma? ¿O tendría que cambiar algo por ser valores en hexadecimal?
Es que por ejemplo, pido la hora actual, la cuál me la devuleve en segundos, y sale una cosa así:

cad[0]=0x48;
cad[1]=0xBA;
cad[2]=0x37;
cad[3]=0x5F;

y al hacer el casting como me dijiste, me saldría lo siguiente en un float: 13238973219446194000.000000, lo cuál es una barbaridad de segundos, así que hay algo que no está bien a la hora de hacer la conversión, ya que tengo un programa para el GPS, en el que también puedo ver que esos valores en hexadecimal recibidos son los correctos.

5
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Miércoles 1 de Abril de 2009, 20:22 »
Eso del me lo habían dicho...no sabría tampoco mucho quien me lo dijo...jejeje
Muchas gracias Eternal Idol. Mañana lo probaré y te diré resultados.

Saludos!

6
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Miércoles 1 de Abril de 2009, 20:16 »
Lo probaré lo que me dices, ya entendí que no es una cadena, pero según me dijeron si le ponía al final, sí que sería como una cadena.

Y a la hora de poner el printf, ¿Por qué sacas 3 variables?

printf("%f %d %xrn", *t, cad, cad).

7
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Miércoles 1 de Abril de 2009, 20:08 »
He hecho el casting que me dices usando la función "atof", y el resultado es el que comento, sale 0.000000.
Como lo que me interesan son 4 posiciones del Buffer, extraigo esas 4 posiciones que me interesan en otro buffer, para que solamente esté eso, y ese segundo buffer lo mando a la función atof. Es decir, tengo:

unsigned char cad[500];
unsigned char nuevo[4];
double a;

en las posiciones 0,1,2,3, guardo los 4 posiciones de cad que me interesan y hago:
a=atof((const char*)nuevo);
printf("%frn",a);

y lo que sale es 0.00000.
también he probado a declarar nuevo de 5 posiciones, y poner en nuevo[5]='' y también poner nuevo[5]=0 y sigue saliendo lo mismo. ¿Algo mal? ¿Alguna idea más?

Siento las molestias, muchas gracias!

8
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Miércoles 1 de Abril de 2009, 19:25 »
Hola de nuevo!

Acabé entendiendo el ejemplo que me poniáis, lo hice en mi compilador y salió, pero a la hora de hacer lo mismo en mi proyecto me sigue devolviendo siempre 0.000000.
Me vuelvo a explicar por si hay algo que no dijese claro antes. Yo le mando una instrucción al GPS, el cuál me contesta con otra instrucción con un formato específico del protocolo que uso, y cada símbolo que me devuelve lo tengo almacenado en "unsigned char cad[100]". Entonces bien, yo para ver qué es lo que hay dentro hago un for(donde pongo un printf("%d",cad)), para sacar posición por posición lo que hay dentro de la cadena, por comprobarlo solamente, y me salen valores como 28, 64, 128, 154....Por lo que supongo que serán enteros asignados a los caractares ASCII de los símbolos que haya en cada posición de la cadena.
Entonces, cada 4 valores seguidos, en mi caso, me van a dar el nivel de cada satélite, por eso quiero unirlos y pasarlos a un float.
En la instrucción que me devuelve el GPS, según el protocolo los bytes(cada byte es una posición creo de la cadena) del 2 al 5 incluídos son el nvel del primer satélite(dice que el tipo de los bytes 2-5 es single(que equivale a un float)).

No sé si me he explicado un poco mejor, pero estoy desesperado porque no consigo convertirlo sin que me devuelva algo distinto a 0.000000.

Un saludo.

9
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Martes 31 de Marzo de 2009, 15:14 »
Muchas gracias por vuestra ayuda, me ha servido bastante.
Un saludo a todos!

10
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 14:16 »
Si no es una cadena, ¿qué es?
Eso es lo que me devuelve el receptor de GPS, y es a lo que necesito hacerle la conversión para la que pido ayuda. SI elguien sabe hacer eso, que me eche una mano.

Saludos!

11
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 13:41 »
Te pongo un ejemplo más parecido a lo que tengo:

   unsigned char cad[4];
   cad[0]=23;
   cad[1]=45;
   cad[2]=128;
   cad[3]=76;
   float c;
   char *p;
   double a;
   a=atof((const char*)cad);
   printf("%frn",a);

Y si hago esto, el resultado es 0.00000. Esto lo necesito porque tengo un GPS conectado al pc, y éste me está mandando información, y si no pongo unsigned char, hay valores que están negativos.

12
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 13:30 »
Lo he intentado, pero el problema es que la función atof está hecha para usar cadenas de char, y no de unsigned char como yo necesito usar, así que me dice "invalid conservion from unsigned char to const char". ¿Hay alguna manera de hacer algo ahí?

13
C/C++ / Re: Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 13:11 »
Sé que haciendo un casting solamente puedo cambiar el tipo de una variable, pero es que necesito cambiar el de cuatro bytes de tipo unsigned char de una cadena, a una sola variable de tipo float. No quiero cambiar de tipo cada posición de la cadena unsigned char por otra posición de float.

Si tengo:

float var;
unsigned char cad[4];
cad[0]=23;
cad[1]=45;
cad[2]=128;
cad[3]=72;

quiero ponerlos unidos en una sola variable de tipo float, quedando por ejemplo: var=234512872 (este no es el resultado final, es solo para la explicación)

Saludos!

14
C/C++ / Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 12:27 »
Hola a todos!

Necesito saber si hay alguna función o algo que me realice lo siguiente:

Estoy realizando un proyecto, y me encuentro con este problema: Tengo una cadena de caracteres declarada con "unsigned char cad[4], por ejemplo" y en cada una de esas 4 posiciones existirá un valor. Pues bien, necesito unir los 4 valores esos para formar una sola variable de tipo "float".
He estado mirando y existen funciones como atoi(convierte cadena Char en Int), atof(convierte cadena Char en double) y atol(convierte cadena Char en long), pero no he visto ninguna función que convierta Unsigned Char(que no Char solamente) a float.

Espero que me echéis una mano.

Un saludo.

15
C/C++ / Re: Cadena de caracteres hexadecimal
« en: Viernes 20 de Marzo de 2009, 14:03 »
Ya, falta los "data string", pero es que en esa instrucción especialmente, no se requiere el enviar más datos, así que con lo demás estaría bien.

Gracias por la ayuda de todas formas.

Saludos.

16
C/C++ / Re: Cadena de caracteres hexadecimal
« en: Viernes 20 de Marzo de 2009, 13:30 »
Ok, muchas gracias.

Entonces mi problema será con el GPS...jejeje...¿Hay alguien que haya trabajado con el protocolo TSIP?

saludos!

17
C/C++ / Re: Cadena de caracteres hexadecimal
« en: Viernes 20 de Marzo de 2009, 12:54 »
Muchas gracias!

Siento no haber sido más específico, solo era por no liarlo más, pero lo explico ahora.
Mi proyecto se basa en la transferencia de instrucciones, por medio de c++, entre el pc y un GPS. Este, está conectado al pc por medio del puerto serie. Para la transferencia de instrucciones, tengo que usar el protocolo TSIP, cuyo formato de instrucciones es el siguiente:
<DLE><id><data string bytes><DLE><ETX>, donde DLE=0x10, ETX=0x03.
Además, para la comunicación uso las API de windows.
Mi problema es que no sé cómo utilizar las cadenas de caracteres en hexadecimal, cómo las tengo que declarar.
Por ejemplo, para pedir el nivel de las señales, se usa la instrucción 0x27 según el protocolo, y no se necesita enviar más datos. Voy a poner la forma en la que yo lo haría:

char cadena[4];
cadena[0]=0x10;
cadena[1]=0x27;
cadena[2]=0x10;
cadena[3]=0x03;

A partir de aquí usaría la función WriteFile para enviar la cadena, y para recibir lo que el GPS me devuelva usaría la función ReadFile.

Espero que me haya explicado mejor.

Un saludo.

18
C/C++ / Cadena de caracteres hexadecimal
« en: Viernes 20 de Marzo de 2009, 11:57 »
Hola a todos!

Ando liado con un proyecto en el cual tengo que trabajar con cadenas de caracteres en las cuales hay caracteres en hexadecimal. Mi problema es que para comprobar que funciona, declaro una variable a la que le doy un valor en hexadecimal, 0x10 por ejemplo, y seguidamente la saco por pantalla, pero al sacarla por pantalla lo que me sale es un símbolo raro, ¿qué tengo que hacer?

Un saludo!

19
C++ Builder / Librería windows.h en c++
« en: Martes 17 de Febrero de 2009, 18:39 »
Hola a todos!

Estoy realizando un proyecto para la transferencia de datos por el puerto serie, y tengo un problema. A la hora de trabajar con el puerto uso CreteFile, ReadFile y WriteFile, todos incluídos en la librería windows.h. Mi problema es que cuando tengo el código realizado, si lo ejecuto en un ordenador que tenga el windows xp me funciona perfectamente, pero si lo compilo en un ordenador con wondows vista no me funciona, ¿Sabéis por qué puede ser?

Un saludo.

20
C++ Builder / Programación puerto serie en c++
« en: Jueves 5 de Febrero de 2009, 20:41 »
Hola amigos!

Para empezar mi proyecto, el cual se trata de la conexión de un GPS(realizado por otra alumna) al puerto serie del pc, lo primero que intento es ver que soy capaz de enviar datos y recibirlos por el puerto COM. Tengo un cable adaptador USB-serie, el cual va conectado al pc por el usb, quedando libre el terminal serie. De los 9 pines que tiene el terminal, uno es de transmisión y otro de recepción, así que los he puenteado para que así pueda recibir lo que transmita.
Dicho todo esto, os intentaré plantear mi duda lo más explícitamente posible.
He estado mirando muchos forros y en cada uno se habla de una cosa, y al final, no llego a ninguna conclusión. El compilador que uso es el Borland Builder c++ v.6.0, y mi sistema operativo es el windows vista.
Según he leído, por medio de las API`s de windows se puede manejar este puerto, pero ahora según tengo entendido es más complicado, porque antes era más sencillo con windows 98 o ms-dos.
Según he leído, el modo sería tratar el puerto como un fichero, es decir, abrirlo, realizar lo que queramos hacer y luego cerrarlo.
Otra forma que he leído es por medio de librerías que el propio compilador trae, o descargándomelas(lo cual no me funciona nunca).
Tengo un lío increíble, y no sé por dónde coger esto, necesitaría tutoriales, sitios donde estén las instrucciones para el manejo del puerto, algo de dónde poder empezar a entender todo esto.
Os agradecería muchísimo una ayuda para pode empezar con el proyecto.

Saludos!!

21
C++ Builder / Re: Usar puerto serial del pc
« en: Lunes 12 de Enero de 2009, 17:30 »
Muchas gracias!
Me ha sido de gran ayuda para empezar el proyecto.
Saludos!

22
C++ Builder / Re: Usar puerto serial del pc
« en: Lunes 12 de Enero de 2009, 10:58 »
Hola!

Gracias por contestar. Me explico mejor. El software lo haré para puerto serie(siempre escribía serie, hasta que me dijeron que era serial, y como no lo sé, pues por eso lo puse así), ya que el receptor que tengo se diseñó para ello, pero a la salida del receptor, conectaré un un cable que convierta el puerto serie en USB, para así poder conectarlo al pc por medio de USB. ¿No habría ningún problema verdad?
También me gustaría que me diéseis algún enlace para encontrar las instrucciones de los protocolos TSIP y TAIP, porque aún no sé con cuál de ellos trabajaré. ¿Me recomendáis alguno?
Por cierto, el sotware lo realizaré en Builder c++.
Un saludo.

23
C++ Builder / Usar puerto serial del pc
« en: Sábado 10 de Enero de 2009, 20:59 »
Hola a todos!

Soy nuevo aquí. Os expongo mi duda.
Voy a hacer un proyecto de fin de carrera, y para ello tengo que hacer un software para un receptor de GPS, el cuál está diseñado para la conexión al pc mediante el puerto serial. Mi duda es que, si yo programo todo para la transferencia por el puerto serial, y después le pongo un cable adaptador de puerto serial a usb, para conectarlo al usb de mi pc, ¿cambiaría algo?
Es que tengo portátil y no tiene puerto serial, y me gustaría hacer el software para usb, ya que el puerto usb es más moderno y se usa mucho más.
Quiero saber esto antes de empezar con el proyecto, para saber si informarme de una cosa u otra, ya que el receptor se diseñó con salida para puerto serial.

Muchas gracias!

Saludos!

Páginas: [1]