PDA

View Full Version : [C] Un aiuto sui puntatori, piccolo frammento di codice


e-commerce84
23-02-2011, 11:23
Ciao,
allora devo fare un picolo esercizietto in FLEX che è un analizzatore lessicale, il problema non riguarda tanto FLEX ma penso più che altro che non tocco C da qualche annetto e stò un po' arruginito con i puntatori...

Il frammento di codice C è il seguente:


char consonante = 0; /* Variabile che contiene la consonante corrente riconosciuta durante dall'analizzatore */

char *cursore; /* Puntatore usato per scorrere i caratteri della parola */

{CONSONANTE} { /* Regola definita per il pattern associato al token CONSONANTE */

consonante=tolower(*yytext); /* si usa la variabile carattere per memorizzare la consonante correntemente riconosciuta */

if(consonante == *yytext++) /* Se la consonante attuale è uguale al carattere succssivo siamo nel caso di una doppia

yytext++; /* Passa al carattere successivo

ECHO;

}


Sostanzialmente la parte non C (cioè {consonante} significa cosa deve fare quando trova una consonante in un file di testo)

Praticamente il mio programmino scorre un file di testo e deve eliminare le consonanti doppie consecutive, per esempio:

trova la parola appiattire e la trasforma in apiatire

yytext è un puntatore/b] al carattere corrente nel testo, quindi in pratica la mia logica è questa:

Se viene riconosciuta una lettera consonante nel testo (a fare il matching ci pensa FLEX ed è indicato da {CONSONANTE}, questo è sicuramente giusto), mette questa consonante corrente dentro la variabile [b]consonante facendola diventare minuscola.

A questo punto confronta il valore della consonante corrente con il PROSSIMO ELEMENTO ALL'INTERNO DEL TESTO che ho indicato con la riga: if(consonante == *yytext++)
consonante dovrebbe contenere un char e *yytext++ dovrebbe restituire il prossimo char nel testo (almeno credo ma ho dei dubbi in merito...).

Se questa condizione risulta essere TRUE significa che sono in presenza di due consonanti doppie consecutive, quindi per eliminare una doppia avanzo di 1 il puntatore all'interno dei caratteri del mio testo con l'istruzione: yytext++;

Infine il comando ECHO è un comando di Flex che dice di copiare il carattere corrente sullo standard output (monitor)

Le cose sono 2:

o ho sbagliato qualcosa con i puntatori o ho un problema "algoritmico" perchè non fà quello che deve fare ma se metto delle parole nel file mi riscrive solo le loro vocali, tipo:

nel file ho la parola almanacco ed invece di restituirmi almanaco mi dà aaao (solo le sue vocali)

Qualcuno sà aiutarmi?

Grazie mille

GByTe87
23-02-2011, 12:43
*yytext++ restituisce il carattere puntato da yytext e poi incrementa yytext.

Prova a sostituirlo con *(yytext + 1).

Edit: e aggiungi un tolower, altrimenti "AA" non ti viene riconosciuta come doppia. :p

e-commerce84
23-02-2011, 13:59
*yytext++ restituisce il carattere puntato da yytext e poi incrementa yytext.

Prova a sostituirlo con *(yytext + 1).

Edit: e aggiungi un tolower, altrimenti "AA" non ti viene riconosciuta come doppia. :p

Continua a dare lo stesso identico problema...mi viene da pensare che yytext continui ad essere incrementato...qualche idea?

Dove devo mettere il tolower? mi pare di averlo messo...

Tnx

-MiStO-
23-02-2011, 16:32
consonante=tolower(*yytext++); /* si usa la variabile carattere per memorizzare la consonante correntemente riconosciuta */
if(consonante == (*yytext)) /* Se la consonante attuale è uguale al carattere succssivo siamo nel caso di una doppia
yytext++;

così dovrebbe andare:
metti in consonante il char corrente e incrementi il puntatore
se il char puntato è = a consonante fai un ulteriore incremento

GByTe87
23-02-2011, 16:38
consonante=tolower(*yytext++); /* si usa la variabile carattere per memorizzare la consonante correntemente riconosciuta */
if(consonante == tolower(*yytext)) /* Se la consonante attuale è uguale al carattere succssivo siamo nel caso di una doppia
yytext++;

così dovrebbe andare:
metti in consonante il char corrente e incrementi il puntatore
se il char puntato è = a consonante fai un ulteriore incremento

Aggiunto il tolower che intendevo prima, altrimenti AA non è una doppia. :D

-MiStO-
23-02-2011, 16:44
Aggiunto il tolower che intendevo prima, altrimenti AA non è una doppia. :D
vero!