2 years, 3 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();
    }
}

1 Answer

2 years, 3 months ago.

Hi Thomas!

Without understanding the purpose of this program and the goal you want to accomplish with it, it is difficult for me to assist you with just the pasted code. However, the documentation for Mbed OS provides some helpful tips and tricks for debugging your Mbed programs:

Please let me know if you have any further questions!

- Jenny, team Mbed