[C] Copier un emplacement mémoire

Fermé
boelraty - 24 juil. 2008 à 06:05
 boelraty - 24 juil. 2008 à 16:38
Bonjour,


Résumé du problème : pointeur type (void*) qui pointe vers une donnée correspondant au premier octet d'une longue série : 3*taille de l'image. A savoir que les octets changent souvent au fil du programme. J'aimerais sauvegarder les données quelque part au fur et à mesure pour pouvoir les réexploiter par la suite et ainsi ne pas être gêné par les changements des octets qui suivent la valeur pointée. Problème avec le type de donnée : octet brute !! Puis-je utiliser un char ?


Détail :
Je travaille actuellement sur un programme permettant de contrôler une caméra grâce à Video For Linux 2. Tout fonctionne bien, sauf que maintenant pour améliorer mon framerate, j'aimerais utiliser des threads pour l'écriture de mes fichiers BMP. Le problème c'est que pour ça, je dois connaître les données correspondantes. J'utilise jusqu'à maintenant un pointeur (void *) qui pointe vers la première valeur des données et me permet ainsi d'accéder aux autres. Sauf que pour chaque frame, je réutilise le même pointeur, donc au fur et à mesure les données changent, et comme les threads fonctionnent pendant que je change ces données, les images que j'obtiens ne sont pas bonnes.

Peut-être, y a t'il un moyen pour que je puisse avant de lancer le thread sauver les données dans une autre variable. Pour le moment, j'ai pas trouvé vu que les valeurs sont des octets et que c'est pas un type franchement reconnu ou je suis pas au courant. La solution est peut-être avec un sprintf et un char ou bien écrire les données dans un fichier, les lire et les réécrire par la suite.

Je ne sais pas si j'ai été assez clair, mais si quelqu'un se sent capable de m'apparter de l'aide, il est le bienvenue.

Merci à vous !
A voir également:

3 réponses

ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 339
24 juil. 2008 à 08:56
Tu peux aussi définir un flag booléen et le lever dès qu'un thread veut écrire dans cette zone de la mémoire.
Dès qu'il a fini, il repositionne le flag à false.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juil. 2008 à 09:01
Salut.
En effet, ce n'est pas très clair.
mais disons que des octets, c'est des octets...
Mais si tu regarde là http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/write.2.html, tu verra que le proto de write comporte void*.
Donc, tu peux sauvegarder ton image en une ligne dans un fichier. Char, ascii, int, double, ce n'est qu'une façon de lire une succession de bits.
Il est vrai qu'il faut faire attention avec les threads et le partage des données.
Avec gcc en général, un octet c'est un char (octet = 8bit -> 256 valeur possible, comme les char)
0
ok merci, pour le flag, c'est pas envisageable ici puisque dans ce cas, je gagne pas de temps, je suis obligé d'attendre qu'ils finissent avec les infos de la première image avant de poursuivre.

La solution des fichiers, c'est ce que j'avais pensé, mais bon, ...

Je pense voir du côté de memcpy(), une fonction que je connaissais pas !
0