|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[C] Un aiuto sui puntatori, piccolo frammento di codice
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: Codice:
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;
}
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 [b]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 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: Codice:
if(consonante == *yytext++) 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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
*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.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
Dove devo mettere il tolower? mi pare di averlo messo... Tnx |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
Codice:
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++;
metti in consonante il char corrente e incrementi il puntatore se il char puntato è = a consonante fai un ulteriore incremento
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
vero!
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:06.




















