Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/10/2014, à 14:47

temps

[résolu] sprintf

Bonjour,
je cherche à créer une commande pour system,
mais j'arrive pas à écrire ma ligne en remplaçant %d par le contenue de valeur2,
est-ce que quelqu'un sait comment faire ?
voici ma ligne

sprintf(fichierfronts, "awk 'NR==5 {$2="%d"}1' fronts.cpp",valeur2);

si je place des

\

avant les

"

du %d, ça compile bien mais à l'appel l'application s'arrête.

Cordialement

Dernière modification par temps (Le 28/10/2014, à 01:44)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 27/10/2014, à 15:18

Braun

Re : [résolu] sprintf

Bonjour,
A première vue il y a une fameuse salade dans ta chaîne de contrôle.

Hors ligne

#3 Le 27/10/2014, à 15:30

temps

Re : [résolu] sprintf

Bonjour,
Merci pour la réponse.
J'utilise juste la réponse qui fonctionne en terminal d'un fil précédent en remplaçant la donnée changée à l'aide d'une variable nommée valeur2.
En détail, je modifie le deuxième caractère de la ligne cinq du fichier fronts.cpp, mais au lieu de le faire en terminal, j'essaie de l'intégrer dans une application en C qui utilise system(fichierfronts); après avoir créer ma commande dans fichierfronts.

Cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#4 Le 27/10/2014, à 17:19

Braun

Re : [résolu] sprintf

Eventuellement, tu pourrais déjà faire quelques manipulations avec la fonction printf( ) et voir ton œuvre dans la console avant de l'envoyer dans un buffer.

Hors ligne

#5 Le 27/10/2014, à 22:36

temps

Re : [résolu] sprintf

Bonjour, merci pour la proposition
J'ai pensé à cette solution d'analyse car en fait je ne suis sure que ce ne soit pas l'action de la fonction que je lance qui fasse planter.
Pour écrire dans le fichier j'ai trois solutions, soit sed soit awk soit je n'utilise pas system et je travaille directement avec fopen.
Actuellement mon code ajuste directement les valeurs manipulées par les QSpinBox dans la structure qui permet la construction des fichiers créés, peut-être que le problème vient de là, et qu'en fait il faut que je temporise avec le connect dans un bouton séparé.

Je vais tester un peu ce soir, et aussi réviser un peu awk car même si je ne me souviens pas le détail, je sais que parfois les \ sont indispensables.

Cordialement

Dernière modification par temps (Le 27/10/2014, à 22:38)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 28/10/2014, à 00:15

telliam

Re : [résolu] sprintf

c'est quoi la cause de plantage? tu as un coredump?


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#7 Le 28/10/2014, à 01:30

temps

Re : [résolu] sprintf

Bonjour,
Bien vue, c'était un coredump.
J'ai mis de coté system avec sed et awk, pour revenir sur fopen.
En premier j'ai mis mon connect qui se contente de donner la valeur du int à une variable.
Ensuite j'ai placé un bouton qui écris la valeur de la variable dans la structure. Voici le code

void clavier::fonctionacte ()
{
   FILE* fichier = NULL;
   fichier = fopen ("fronts.cpp", "r+");
    if (fichier != NULL)
    {
        fseek(fichier, 79, SEEK_SET);
	fprintf(fichier, "%d", selecampli1);
        fclose(fichier);
    }
}

Le problème qu'il me reste à résoudre, c'est que fseek fonctionne au caractère et moi, j'ai besoin de travailler à la donnée, ainsi si je place la valeur de 239, je ne vais pas effacer l"ancienne valeur en entier, mais seulement un caractere, ce qui donne si l'ancienne valeur est 133, la nouvelle valeur 13239 à la place de 239.
OOPs désolé ça fonctionne, je m'étais tout simplement trompé en comptant, il fallait mettre 77 à la place de 79 pour remplacer.
Je vais faire quelques tests.

Je poste en résolu, mais d'éventuelles solutions avec system sont les bienvenues, ça peut toujours servir.

Le fichier est là : https://github.com/temps9/PianoBaul/blo … lavier.cpp

Cordialement

Dernière modification par temps (Le 28/10/2014, à 01:53)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#8 Le 28/10/2014, à 09:26

temps

Re : [résolu] sprintf

Bonjour,
J'ai fini le code avec des fseek ça marche bien, mais j'ai réfléchit que fseek fonctionne en comptant les caractères, or j'utilise des int qui peuvent avoir 1, 2, ou 3 caractères et par la même il faudrait que j'écrive un correcteur de positionnement selon les valeurs sélectionnées. En d'autres mots, si je reprends mes tests avec des variations dans le nombre de caractères, ce ne sera pas bon.
Plutot que perdre du temps à tester, j'ai préféré changer ma structure pour placer les 14 valeurs modifiable en début de ligne, ensuite je compte les lignes avant de changer la valeur.
Ce qui donne

void clavier::fonctionacte ()
{
   FILE* fichier = NULL;
   fichier = fopen ("fronts.cpp", "r+");
    if (fichier != NULL)
    {
  for (int i = 0; i < 5; i++)
{
while (fgetc(fichier) != '\n')
; 
}
	fprintf(fichier, "%d", selecampli1);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selecampli2);
  for (int i = 0; i < 2; i++)
{
while (fgetc(fichier) != '\n')
; 
}
	fprintf(fichier, "%d", selecdure1);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selecdure2);
  for (int i = 0; i < 2; i++)
{
while (fgetc(fichier) != '\n')
; 
}
	fprintf(fichier, "%d", selecvara1);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selecvara2);
  for (int i = 0; i < 2; i++)
{
while (fgetc(fichier) != '\n')
; 
}
	fprintf(fichier, "%d", selecvardu1);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selecvardu2);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selectduree);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selectforceh);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selectforceb);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selecttremolo);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selectforceplus);
while (fgetc(fichier) != '\n')
; 
	fprintf(fichier, "%d", selectzonememoire);

        fclose(fichier);
    }
}

et pour le placement dans la nouvelle structure

#include "fronts.h"
#include "jo.h"
jo clavier32[26] = {
   { // a touche1
{ 
239 , 
130 , 133, 130, 133, 130, 133, 130, 133, 130, 133, 130, 133, 130}, // amplitude
{ 
85 , 
84 , 169, 168, 85, 84, 169, 168, 85, 84, 169, 168, 169, 168}, // dureefront
{ 
12 , 
11 , 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1}, // changeamplitude
{ 
0 , 
0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // changedureefront
1 , // duree
7 , // laforceh
21 , // laforceb
7 , // tremolo
21 , // forceplus
2  // combiendezonememoire
   },

En d'autres mots je laisse la technique qui est possible mais demande une correction

        fseek(fichier, 77, SEEK_SET);
	fprintf(fichier, "%d", selecampli1);
        fseek(fichier, 82, SEEK_SET);
	fprintf(fichier, "%d", selecampli2);
        fseek(fichier, 165, SEEK_SET);
	fprintf(fichier, "%d", selecdure1);
        fseek(fichier, 170, SEEK_SET);
	fprintf(fichier, "%d", selecdure2);
        fclose(fichier);

Cordialement

Dernière modification par temps (Le 28/10/2014, à 10:20)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#9 Le 28/10/2014, à 10:42

telliam

Re : [résolu] sprintf

si fseek,fgetc,.. ne correspond pas à tes besoins c'est que tu n'as pas choisi les bonnes fonctions pour tes accès fichier


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#10 Le 28/10/2014, à 11:45

temps

Re : [résolu] sprintf

Bonjour,
Oui, j'ai vu en testant.
En fait j'ai gardé la nouvelle technique des structures que j'avais intégré dans l'avant dernière application.
Le problème avec les structures, c'est qu'une fois la compilation effectuée, il ne sert à rien de modifier le fichier structure qui a servit à compiler.
En d'autres mots, il faut que je reprenne une technique sans la méthode de structure qui créait comme avant un fichier séparé, facile à modifier. D'ou étape lecture du fichier, pour récupération des données, et ensuite action.

L'objectif à l'instant t, est de pouvoir changer les facteurs, ensuite remplir les différentes formes de variation (avec protection anti-dépassement) dans les 40 premier Adnforme.cpp, je vais essayer de faire ça avant la fin de la semaine, mais c'est pas sure.

De toutes façons, il ne faut pas perdre de vue que la note relevée est une note reprère et qu'ensuite il faut à partir d'elle construire les 25 autres notes du claviers, alors autant générer directement un nouveau fichier extérieur sans structure, le saut de ligne suffit pour déterminer avec un scanf.

Cordialement

Dernière modification par temps (Le 28/10/2014, à 11:54)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#11 Le 28/10/2014, à 12:01

telliam

Re : [résolu] sprintf

générer un fichier c, c'est surement une très très mauvaise idée !!


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#12 Le 28/10/2014, à 15:41

temps

Re : [résolu] sprintf

Bonjour,
Pourquoi ?
Ce choix est due au temps que cela va me prendre et à la certitude du bon fonctionnement.
C'est une technique que j'utilise depuis plusieurs années dans mon format audio.
taper à la va vite la fonction acte devient

void clavier::fonctionacte ()
{
   FILE* fichierfronts = NULL;
   fichierfronts = fopen ("fronts.txt", "w+");
    if (fichierfronts != NULL)
    {
          fprintf(fichierfronts, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", selecampli1, selecampli2, selecdure1, selecdure2, selecvara1, selecvara2, selecvardu1, selecvardu2, selectduree, selectforceh, selectforceb, selecttremolo, selectforceplus, selectzonememoire);
          fprintf(fichierfronts, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", selecampli1, selecampli2, selecdure1*0.5, selecdure2*0.5, selecvara1, selecvara2, selecvardu1, selecvardu2, selectduree, selectforceh, selectforceb, selecttremolo, selectforceplus, selectzonememoire);

        fclose(fichierfronts);
    }
}

Là il y a 2 notes, mais l'avantage c'est que je peux construire les 25 notes filles directement dans la construction du fichier et je supprime jo.h fronts.h et fronts.cpp de l'application.
Bien sure il faudra modifier Adnforme.cpp, mais comme je ne les ai pas encore construit. ça ne change rien.

A la relecture, puisqu'il n'y a que les deux valeurs des durées qui changent, il n'y a qu'à les changer dans Adnforme, d'ou une seule ligne de 14 int suffit dans la fonction acte, ainsi je garde les structure pour indiquer le coefficient de variation des durées et par la même dans certains cas particulier retrouver la gamme, un repère pour ceux qui ont des partitions construites sur des croyances de fréquences.

Cordialement

Dernière modification par temps (Le 28/10/2014, à 16:50)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#13 Le 28/10/2014, à 17:09

temps

Re : [résolu] sprintf

et pour récupérer les données, il suffit de placer au début de Adnforme

#include "AdnForme.h"

   FILE* fichierdesfronts = NULL;
    int mesdonner[14]; //son du n, la référence
 
    fichierdesfronts = fopen("fronts.txt", "r");
 
    if (fichierdesfronts != NULL)
    {
        fscanf(fichierdesfronts, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d", &mesdonner[0], &mesdonner[1], &mesdonner[2], &mesdonner[3], &mesdonner[4], &mesdonner[5], &mesdonner[6], &mesdonner[7], &mesdonner[8], &mesdonner[9], &mesdonner[10], &mesdonner[11], &mesdonner[12], &mesdonner[13]);       
 
        fclose(fichierdesfronts);
    }

quelques nouvelles ce jour, la technique marche très bien.

Il ne me reste qu'à trouver quel est la variation de vitesse dans la game entre les notes, pour mettre les bonnes valeurs dans la structure qui ne sert plus qu'à ça, et aussi créer 40 associations de boucles. Puisque j'en étais à reprendre, au passage je génère les 26 notes sélectionnées à l'appui sur le bouton act, alors qu'avant chaque note était générée quand on la demandait.

Le lien de téléchargement http://www.letime.net/vocale/PianoBaul.tar.gz

111ko qui produisent une infinité de notes, qui dit mieux ?

Cordialement

Dernière modification par temps (Le 30/10/2014, à 00:59)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne