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 30/04/2013, à 20:43

temps

|résolu] Trie avec des switch en langage C

Bonjour,
Je cherche la meilleure méthode pour faire un trie à l'aide de switch.
Je lis des données qui sont écris avec 5 caractères
switch
case : 0 ... case 4
mais le troisième caractère est particulier car il représente le troisième caractère que quand il est suivit du premier ou du cinquième.
Quand il est suivit du deuxième c'est un sixième cas, et quand il est suivit du quatrième caractère c'est un septième cas.

L'idée première qui me viens est de mettre en amont du switch une zone tampon composé de deux variables
La première variable qui va servir à indiquer le dernier caractère lu, et la deuxième variable qui va indiquer au switch dans quel case aller.

Ensuite créer à l'intérieur du case 2, celui du troisième caractère un nouveau switch reprenant les cas possibles

Ma question est que si cela est facile à faire avec 5 caractères le système sur lequel je travaille en contient beaucoup plus, et de manière à ne pas avoir un code trop long, je me demande s'il est possible de boucler dans le switch les cas ou les caractères sont indépendants.

En d'autres mots revenir au début de la fonction sans que celle-ci ait eu le temps de se terminer ? Un saut comme dans le basique.

Cordialement

Dernière modification par temps (Le 01/05/2013, à 12:57)


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 30/04/2013, à 23:37

temps

Re : |résolu] Trie avec des switch en langage C

J'ai commencé à imaginer la forme, ce serait un peu dans ce genre :

remonteswitch : 

	switch (actif) {
case 1 :
 
	switch (position) {/* debut switch (position)*/ 
case 1 :
    printf("la position est %d\n",position);
break;
case 2 :
    printf("la position est %d\n",position);
break;
case 3 :
	actif = 2;
	ancienposition = position;
break;
case 4 :
    printf("la position est %d\n",position);
break;
case 5 :
    printf("la position est %d\n",position);
break;
}
case 2 :

switch (position){
case 1 :
case 5 :
    printf("la position est %d\n",ancienposition);
actif = 1;
goto remonteswitch ; 
case 2 :
    printf("la position est %d\n",6);
actif = 1;
break;
case 4 :
    printf("la position est %d\n",7);
actif = 1;
break;

}

break;
}

Qu'en pensez-vous ?

Pour plus de détails, ce n'est pas un exercice théorique, dans le synthétiseur vocal que j'ai créé, je prononce chaque lettre, mais parfois le même son s'écrit avec plusieurs lettres, en exemple le "o" seul est le son "o" mais suivit de "i" ou"n" ou "u" deux lettres donnent un seul son.

Pour défendre le goto, si nous cherchons sur la toile dans les cours la plupart ne veulent pas que celui-ci soit utilisé, quoique j'ai cru lire un jour que LT le défendait, ceci est une démonstration par l'effet. Plus sérieusement par la cause, en fait nous modélisons des systèmes physiques qui sont régit par plusieurs dimensions en équilibres et chaque dimension possède ses propres lois, nous analysons ces états d'équilibres à l'aide de notre cerveau qui analyse la position du système en fonction d'une multitude d'interactions entre les différentes dimension. En prenant un cas simple, seulement 5 dimensions, nous voyons bien que notre cerveau lie chacune de ces dimension directement aux autres, c'est pourquoi le goto est utile car c'est dans notre mode de penser que nous percevons des cas possibles et ceux-ci ne peuvent être liés à un point central, mais peuvent être seulement perçu dans un tout.

Cordialement

Dernière modification par temps (Le 01/05/2013, à 08:22)


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

#3 Le 01/05/2013, à 10:45

temps

Re : |résolu] Trie avec des switch en langage C

Bonjour,
J'ai testé la solution proposée et ça marche mais ça ne marche pas.
En fait le goto fonctionne très bien, mais est limité dans le nombre de switch qu'il peut traverser, en fait c'est comme un "break", ça sort du switch ou on est, pas de tous les switch imbriqués.
Les solutions que j'imagine sont :
Soit j'abandonne le fichier d'entete dans le format audio jo, ce qui va diviser le code par deux, supprimer pas mal d'action de filtrage pour retirer les entete des fichiers qui se concatennent dans la zone tampon, mais surtout enlever les switch de position.
Soit je fait un goto par switch rencontré, en fait ce serait un goto, qui envoie vers un autre goto qui envoie vers un goto qui arrive à la destination finalequi est le début de la fonction.
Je regarderai ça ce week-end
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 01/05/2013, à 11:39

telliam

Re : |résolu] Trie avec des switch en langage C

ça va surtout te faire un code illiisible, immaintenable, et surement buggé.
Tu codes en tatonnant c'est rarement productif.
je pense que tu devrais plutot regarder du coté de lex et yacc, ca devrait t'aider.


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

Hors ligne

#5 Le 01/05/2013, à 12:54

temps

Re : |résolu] Trie avec des switch en langage C

Bonjour,
J'ai lu ton message, et je suis aller voir mon code pour être sure parce qu'après tout c'est peut-être possible ce que tu dis.
Et voici et voila, le goto passe bien plusieurs switch, en premier j'ai testé s'il passait bien plusieurs if, ce qui est le cas, j'ai remplacé mes switch par des if, et la même effet, c'était ma manière de tester un code non fini qui m'a fait croire que le goto ne passait pas plusieurs switch.
En fait mon code est très simple, il est composé de quatre fonctions très simple , une qui lit le texte, une qui identifie le son à concaténer dans le fichier tampon selon la lettre lu, une qui adapte le fichier audio dans la zone tampon au format des cartes audio d'aujourd'hui, et une qui lance sox pour lire le fichier audio.
Le code fait des milliers de lignes mais c'est toujours la même tache qui se répète pour chaque lettre, et après encore la même tache selon que la lettre soit en début de mot pour garder l'entête. En fait le concept est très simple, c'est juste la quantité d'informations qui lui donne un aspect de complexité qui n'existe pas. C'est un peu comme quand on crée nos sons de bases par lettre, quand on regarde les effets ça a l'air complexe, mais quand on les construit avec les causes c'est évident.

Je poste en résolu.

J'ai regardé un peu la doc sur lex, sur l'instant je suis pas trop attiré.
En fait comme je l'ai écrit c'est la même tache repris un grand nombre de fois. A l'instant t le code source fait dans les 2900 lignes, il doit bien y en avoir 400 lignes vides.
Si je n'écris plus les entetes dans les fichiers audio de la base de données (très facile à réaliser), le code tombe à 1200 lignes utiles. Si au lieu d'écrire une multitude de fois la même tache je fais une fonction par tache qui se répète, le code va tomber à 200 ou 300 lignes utiles. Peut-être qu'un jour je m'y mettrai mais je doute, en ce moment je pense plus à créer une base de données des sons français, celle que j'ai je l'ai écrite en moins d'une heure, et en exemple dans oi.jo il y a plein de "0" c'est impossible d'avoir un front d'une durée "0" d'ou bug, d'ou il faut que je vérifie ce que j'ai mis dedans. Ensuite si j'ai une version française, il faut que je trouve un néerlandais pour pouvoir faire une base de données adapté aux Pays-Bas, ensuite tel ou tel accent régional, ensuite d'autres pays, d'autres langues selon mes rencontre. Je trouve du plaisir à construire les sons et à la limite dès qu'un outil fonctionne pour moi, c'est suffisant. Je trouve plus important et plus plaisant à l'esprit de faire des bibliothèques qui pourront être utiles pour ceux qui ont perdu la voix ou l'audition que de travailler sur l'amélioration (tablette qui dit ce qu'il a écrit d'avance, ou ce qu'il écrit, un  simple appui) de l'outil.

Cordialement

Dernière modification par temps (Le 01/05/2013, à 15:45)


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 08/05/2013, à 07:09

temps

Re : |résolu] Trie avec des switch en langage C

Bonjour,
Je ne vais peut-être pas utiliser la technique qui modifie le début des sons des voyelles pour obtenir les consonnes. directrices car cela prendrai plus de ressource que de concaténer une consonne directrice directement. Prenons le cas de la lettre "B", si nous plaçons directement la consonne directrice avant le son de la voyelle, celui-ci sera peut-être déformé ou encore inaudible. Il faut lui donner un petit espace avant pour que les fronts précédents (des lettres précédentes) ne le déforme pas. Après avoir donné ce petit espace le son "B" produit par la lettre "B" ne pèse que 72 octets et je peux réduire encore. En fait concaténer 72 octets sera toujour plus rapide que d'aller modifier le fichier tampon.
En preuve voici en ascii les 72 valeurs des fronts (amplitude/durée) qui prouve pour ceux qui veulent tester.

133 28
132 171
116 115
130 162
126 30
132 100
116 110
136 103
130 61
136 91
115 104
143 112
121 111
129 27
101 100
136 72
116 70
133 28
100 165
164 61
118 57
146 60
89 159
177 59
108 53
122 22
119 11
163 27
116 49
120 12
100 25
107 15
105 3
107 6
71 40
128 29

Je ne sais pas combien pèse les autres syntétiseur vocaux sous linux et leur qualité.
Mais ici nous avons une bibliothèque qui se pèse en centaine de Ko pas plus et un executable en ko, idéal sur des petits systèmes sous linux ,embarqué genre raspberry pi. Le plus lourd ce sont les voyelles dès que j'ai le temps je dois pouvoir réduire leurs poids par 10, les consonnes ne pèsent pas assez pour en parler.

De plus je me suis apperçu d'une erreur dans la bibliothèque actuelle. Les sons que j'ai mis sont correctes, ils fonctionnent très bien en les testant séparément, mais j'ai pas tenue compte que si on place la fin d'une voyelle trop près de la consonne qui suit, la voyelle devant détruit la consonne. Et quand j'ai testé en attachant les syllabe hier, j'ai pu m'appercevoir que ça n'allait pas. Je vais corriger, j'ai deux solutions, soit j’ajoute un blanc devant chaque consonne, soit un blanc à la fin de chaque voyelle, comme il y a moins de voyelles, j'opte pour la deuxième solution.
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