Newsgroup: it.comp.lang.c
Titolo: Come ricercare sillabe in file di testo con posixthreads?

Devo realizzare un piccolo programmino in C sotto linux utilizzando le 
posixthreads, queste sono le specifiche:
"Un processo costituito da un numero di threads variabile durante 
l'esecuzione deve analizzare il contenuto di un file, il cui nome viene 
passato come parametro all'attivazione del processo stesso. L'utente che 
interagisce  con il processo deve poter immettere parole (sequenze di 
caratteri  alfanumeriche che non comprendano separatori di stringa in input) 
da ricercare all'interno del testo del file. Per ogni sequenza di caratteri 
introdotta, viene lanciato un nuovo thread che conta in quante parole del 
file ricorre la suddetta sequenza di caratteri (notare che la sequenza di 
caratteri 'ma' e' presente due volte nella parola
'mamma', ma la parola in cui 'ma' e'presente deve essere contata una sola 
volta).
Se la sequenza era gia' stata introdotta dall'utente in precedenza, allora 
il relative thread non deve rieffettuare l'analisi del contenuto del file 
perche' il numero di parole in cui la sequenza di caratteri ricorre viene 
calcolato daun thread lanciato in precedenza. La stringa "." deve 
identificare la terminazione dell 'input da parte dell'utente.
Quando questa viene digitata, il risultato dell 'analisi del file testuale 
deve venire comunicato all 'utente. Notare che il thread che gestisce 
l'input ed il thread di ricerca all'interno del file devono essere eseguiti 
in concorrenza. "
 io ho pensato di utilizzare strtok  in questo modo:
#include <stdio.h>
#include <string.h>
int main()
{
         char s[] = "aaa,bbb,ccc,ddd,eee";
         char* p;
         printf("Stringa completa: \n %s\nStringa spezzata:\n",s);
         p = strtok(s, ",");
         while (p != NULL) {
                  printf("%s\n", p);
                  p = strtok(NULL, ",");
         }
         return 0;
}
ma poi non riesco ad andare avanti, qualcuno pu� darmi qualche suggerimento 
o aiutarmi a completare il programmino?
Grazie anticipatamente!
Mario

   
Come dire, partire dal tetto a fare una casa.... ;-)
Ovvio che l' esercizio mira a esercitare sulla programmazione parallela, 
ma il tuo l' approccio
e' un poco riduttivo. Prima devi scomporre il problema, vedere quali 
'oggetti' ti servono
e poi codificare.
Io direi che ti serve almeno un vocabolario dei termini introdotti, 
magari implementato con
una bella lista linkata, che serve sempre!
Poi il resto puoi implementarlo in 1000 modi: ad esempio, il main sara' 
il gestore dell' input
da consolle, controlla se nel vocabolario e' gia' presente il temine 
introdotto e se no
lo appende nella lista ed attiva il tread di ricerca del termine 
relativo passandogli come
parametro il nuovo membro della lista.
A fine ricerca, stampi il contenuto della lista.....
Puoi anche ottimizzare la ricerca leggendo prima in memoria tutto il 
file, se non e'
eccessivamente grande oppure, apri il file da main e passi al thread l' 
handle
come membro della struttura o come variabile globale.
Se leggi il file in memoria pero' non *devi* usare la strtok, se no ti 
distruggi la memoria
che non potra' essere riutilizzata dagli altri thread !
D'altra parte, la strtok non e' l'unica maniera per ricercare 
stringhe... la librearia
e' piuttosto ricca e basta un poco di fantasia....
Nota che anche l' ottimizzazione delle risorse (memoria in questo caso) 
permette
anche di velocizzare la ricerca consentendo a molti piu' threads di 
lavorare sulla
stessa area: altrimenti saresti vincolato dallo spazio di memoria 
utilizzabile, e dovresti
limitare il numero dei thread. D'altra parte, se ti riduci a un thread 
per vota, non si
vede l' ultilita' dell' esercizio.....
Ogni membro della lista e' una struttura che contiene tutti i parametri 
che ti servono,
che so:
typedef  struct word_obj{
    struct word_obj* pNext;         /* Pointer al prossimo membro della 
lista */
    struct word_obj* pBack;         /* Pointer al precedente membro 
della lista */
    FILE*                 pFd;            /* Handle del file da 
scansire,se != NULL */
    char*                  pBuf;            /* Oppure buffer in memoria 
da scansire, se != NULL */
    char nome[MAX_STRING_LEN];      /*  spazio stringa da ricercare */
    int         numeroOccorrenze;                 /* Numero delle 
occcorenze trovate */
    bool       abortRicerca;                           /* Flag di abort 
della ricerca (impostato da main, se seve) */
    bool       fineRicerca;                             /* Flag di fine 
ricerca impostato dal thread */
    ..................................                          /* Ogni 
altro parametro utile....*/
}WORD_OBJ_T;
il pFd e pBuf possono sembrere ridondanti, ma cosi' e' piu' generale....
/*
 *  Vocabolario (primo membro)
 */
static WORD_OBJ_T list={
    .pNext=NULL,
    .pBack=NULL;
}
Ogni nuovo oggetto viene creato dinamicamente ed aggiunto alla lista ....
Volendo, potrebbe essere aggiunto ordinato alfabeticamente, per
ottimizzare un po' il controllo delle nuove parole ;-)
riassumendo:
main:
   - attende input
   - controlla nella lista se il temine e' gia' inserito
   - se no, crea la struttura e la aggiunge al vocabolario e
   - crea il thread passando il puntatore al nuovo oggetto.
Thread:
   - cerca nel file (o in memoria) le occorrenze della stringa
   - aggiorna la propria struttura e termina l' esecuzione
bye,
brix

Grazie Brix per i tuoi preziosi consigli, il tuo ragionamento non fa una 
piega....ora è tutto più chiaro ...,
se trovo qualche altra difficoltà proverò a postare un nuovo messaggio.
Ciao!
"brix99luftballons" <brix99lu...@hotmail.invalid> ha scritto nel 
messaggio news:2cXNj.14742$o06....@tornado.fastwebnet.it...
