Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 2 months ago. This question has been closed. Reason: Duplicate question
Receive the string from c ++ to mbed, then work the string.
After the first run, the program stops responding. This happens after I call the 'void control ()' function, why?
#include "mbed.h"
Serial pc(USBTX, USBRX); // tx, rx
char stringa[200];
int seq_ph[200]; //vettore in cui salvo gli indici delle immagini dei fonemi trovati nella stringa
struct phoneme{ //struct per contenere vari fonemi (matrice) e l'indice dell'immagine associata
char poss_ph[25][4];
int lips;
};
phoneme vect_ph[20]; //vettore di struct, serve per contenere i vari gruppi di fonemi di una lingua
//Questa funzione riempie il vettore di struct vect_ph[] con tutti i fonemi e le immagini associate della lingua italiana
void italian_ph()
{
for (int i=0; i<20; i++) //inizializzo il vettore
{
for (int j=0; j<25; j++)
for (int k=0; k<4; k++)
{
vect_ph[i].poss_ph[j][k]='\0'; //carico tutti caratteri nulli nelle matrici in cui salverò i fonemi
}
vect_ph[i].lips=0; //pongo uguali a 0 tutti gli indici delle immagini
}
//Fonema 1
vect_ph[0].poss_ph[0][0]='a'; //carico tutti i fonemi della lingua
vect_ph[0].lips=1;
//Fonema 2
vect_ph[1].poss_ph[0][0]='o';
vect_ph[1].poss_ph[1][0]='u';
vect_ph[1].poss_ph[2][0]='h';
vect_ph[1].poss_ph[3][0]='q';
vect_ph[1].poss_ph[3][1]='u';
vect_ph[1].lips=2;
//Fonema 3
vect_ph[2].poss_ph[0][0]='e';
vect_ph[2].poss_ph[1][0]='i';
vect_ph[2].lips=3;
//Fonema 4
vect_ph[3].poss_ph[0][0]='c';
vect_ph[3].poss_ph[1][0]='d';
vect_ph[3].poss_ph[2][0]='g';
vect_ph[3].poss_ph[3][0]='n';
vect_ph[3].poss_ph[4][0]='s';
vect_ph[3].poss_ph[5][0]='t';
vect_ph[3].poss_ph[6][0]='z';
vect_ph[3].poss_ph[7][0]='g';
vect_ph[3].poss_ph[7][1]='n';
vect_ph[3].poss_ph[8][0]='f';
vect_ph[3].poss_ph[9][0]='v';
vect_ph[3].poss_ph[10][0]='s';
vect_ph[3].poss_ph[10][1]='c';
vect_ph[3].poss_ph[11][0]='c';
vect_ph[3].poss_ph[11][1]='h';
vect_ph[3].poss_ph[12][0]='s';
vect_ph[3].poss_ph[12][1]='t';
vect_ph[3].lips=4;
//Fonema 5
vect_ph[4].poss_ph[0][0]='l';
vect_ph[4].poss_ph[1][0]='r';
vect_ph[4].lips=5;
//Fonema 6
vect_ph[5].poss_ph[0][0]='m';
vect_ph[5].poss_ph[1][0]='b';
vect_ph[5].poss_ph[2][0]='p';
vect_ph[5].lips=6;
//Fonema 7
vect_ph[6].poss_ph[0][0]='-';
vect_ph[6].poss_ph[1][0]='.';
vect_ph[6].lips=7;
return;
}
//Questa funzione a partire dalla stringa di ingresso genera un vettore con tutti gli indici delle immagini associate ai fonemi trovati
void control ()
{
int z=0;
bool ok3=false, ok2=false, ok1=false;
char temp[4]; //uso una stringa temporanea in cui salvo i caratteri prelevati dalla stringa in ingresso da confrontare con i fonemi della lingua scelta
for (int q=0; q<4; q++)
temp[q]='\0';
int index_seq=0;
while (stringa[z]!='\0') //fino a che non trovo il carattere di terminazione della stringa
{
if (ok3==false && z<197) //controllo sillabe da 3
{
for (int j=0; j<3; j++)
{
temp[j]=stringa[z+j];
}
for (int k=0; k<20 && ok3==false; k++)
{
for (int h=0; h<25 && ok3==false; h++)
{
if (temp[0]==vect_ph[k].poss_ph[h][0])
if (temp[1]==vect_ph[k].poss_ph[h][1])
if (temp[2]==vect_ph[k].poss_ph[h][2])
{
ok3=true; //se i 3 caratteri prelevati corrispondono ad un fonema
seq_ph[index_seq]=vect_ph[k].lips; //allora salvo l'indice dell'immagine associata al fonema nel vettore
pc.printf("%d",(seq_ph[index_seq]));
index_seq++; //mi sposto di una posizione avanti nel vettore
z=z+3; //mi sposto di 3 posizioni avanti nella stringa di ingresso
}
}
}
}
if (ok3==false && ok2==false && z<198) //controllo sillabe da 2 se non c'è corrispondenza con quelle da 3
{
for (int j=0; j<2; j++)
{
temp[j]=stringa[z+j];
}
for (int k=0; k<20 && ok2==false; k++)
{
for (int h=0; h<25 && ok2==false; h++)
{
if (temp[0]==vect_ph[k].poss_ph[h][0])
if (temp[1]==vect_ph[k].poss_ph[h][1])
{
ok2=true; //se i 2 caratteri prelevati corrispondono ad un fonema
seq_ph[index_seq]=vect_ph[k].lips; //allora salvo l'indice dell'immagine associata al fonema nel vettore
pc.printf("%d",(seq_ph[index_seq]));
index_seq++; //mi sposto di una posizione avanti nel vettore
z=z+2;
//mi sposto di 2 posizioni avanti nella stringa di ingresso
}
}
}
}
if (ok3==false && ok2==false && ok1==false && z<199) //controllo sillabe da 1
{
temp[0]=stringa[z];
for (int k=0; k<20 && ok1==false; k++)
{
for (int h=0; h<25 && ok1==false; h++)
{
if (temp[0]==vect_ph[k].poss_ph[h][0])
{
ok1=true; //se il carattere prelevato corrisponde ad un fonema
seq_ph[index_seq]=vect_ph[k].lips; //allora salvo l'indice dell'immagine associata al fonema nel vettore
pc.printf("%d",(seq_ph[index_seq]));
index_seq++; //mi sposto di una posizione avanti nel vettore
z=z+1;
//mi sposto di una posizione avanti nella stringa di ingresso
}
}
}
}
ok3=false;
ok2=false;
ok1=false;
}
return;
}
void insert() {
int i=0;
char ch=0;
do
{
if (pc.readable()) // if there is an character to read from the device
{
ch = pc.getc(); // read it
if (i<200) // just to avoid buffer overflow
stringa[i++]=ch; // put it into the value array and increment the index
}
} while (ch!='\n'); // loop until the '\n' character
stringa[i]=0;
pc.printf(stringa);
}
int main() {
pc.baud(115200);
italian_ph();
while(1){
insert();
control();
}
}