Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502

    [C]interprete di comandi

    Ciao!
    Dovrei realizzare una funzione in C che preso un file contenente dei comandi (uno per riga)li interpreti invocando le giuste funzioni con relativi parametri.
    Inoltre questi comandi possono essere scritti in ordine sparso, l'ordine viene ricostruito da un numero all'inizio di ogni riga.

    Qualcuno saprebbe darmi un'idea?
    Non tanto sulla gestione dell'ordine dei comandi, quanto sull'interpretazione.
    Possibilmente senza ricorrere ad alberi o strutture complesse.

  2. #2
    Il problema dell'interpetrazione dei comandi è senz'altro un campo esteso e complesso per comprimerlo in un post di un forum , comunque cerchero' di darti almeno uno spunto .

    Supposto che il tuo file sia formato nel modo seguente:
    codice:
    comando1 var1,..,varm
    comando2 var1,..,varl
    .....................
    comandon var1,..,varp
    mediante un linguaggio C-like il cuore dell'interprete avrà un aspetto simile al seguente:

    codice:
     while ((!EOF) && (!Error))	// leggi tutto il file
     {
      leggi_riga()			// leggi la riga del file
      estrai_comando()		// estrai il comando dalla riga
      switch (comando)		// attiva la procedura specifica adatta
      {
      	case 'comando1' 
    	 com1_proc();
    	 break;
      	case 'comando2'
    	 com2_proc();
    	 break;
            .................
      	case 'comandon'
    	 comn_proc();
    	 break;
      	default
    	 error();
    	 break;
      }
     }
    dove EOF è un flag di fine file ed Error è una variabile d'errore .
    Ogni procedura comx _proc() si incaricherà di leggere i parametri dello specifico comando , ossia , sapra' quanti parametri il comando accetta in ingresso , ne verifichera' la correttezza , e nel caso corretto lo eseguirà oppure attiverà una procedura di errore .

    codice:
     int comx_proc();
     {
      	int npar,i;
    
    	npar=get_num_par();		// legge da una tabella il numero dei parametri
    	while ((i<npar) && (!Error))
    	{
    		read_par()		// legge i parametri del comando
    		if verify_par()		// ne verifica la correttezza 
    		 return error();	// skip dal ciclo e ritorna l'errore
    		i++;				
    	}
    	execute_com()			// esegue lo specifico comando
    	return 0;
     }
    Dovrai quindi crearti un bel po di strutture , quali la tabella dei comandi con i relativi campi , quella degli errori e altre , che in questa sede , lungi dall'essere esaustiva per quanto riguarda la complessità del discorso , non sono chiaramente emerse , ed inoltre scriverti per ogni comando la particolare procedura di esecuzione .
    Spero di averti fatto un po di chiarezza riguardo l'argomento . Buon lavoro

  3. #3
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502
    Dunque l'idea dello switch sembrava anche a me quella più elegante.
    Ma come faccio a mettere in uno switch come guardia una stringa?
    Soprattutto dovrei estrapolare solo il comando!

  4. #4
    Originariamente inviato da matrics
    Ma come faccio a mettere in uno switch come guardia una stringa?
    Fai una funzione ad es. get_comm(..) che accetta come parametro il comando e tramite l'uso di una tabella di conversione , ti restituisce un intero che puoi utilizzare come indice dello switch .
    Originariamente inviato da matrics
    Soprattutto dovrei estrapolare solo il comando!
    Devi fare il parsing della riga . Questo dipende in larga misura da come intendi strutturare la riga comando ; ad es se il comando compare come primo elemento della riga , se puoi raggruppare più comandi su una sola riga , etc.

  5. #5
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502
    Credo di aver capito!


    grazie

  6. #6
    Originariamente inviato da matrics
    Dunque l'idea dello switch sembrava anche a me quella più elegante.
    Ma come faccio a mettere in uno switch come guardia una stringa?
    Soprattutto dovrei estrapolare solo il comando!
    Alternativamente una cascata di istruzione
    codice:
    if (cond1)
      blocco_istruz1
    else if(cond2)
      blocco_istruz2
    .......
    else if(cond_n)
     blocco_istruz_n
    else
     isruzioni di default
    E' equivalente allo switch senza la limitazione di cui sopra, perchè le condizioni possono essere date da qualsiasi espressione valida.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Anche se la cascata di if..else if..else è logicamente equivalente allo switch propendo per quest'ultimo per 2 motivi:
    il primo puramente estetico : produce codice piu' leggibile . Il secondo per motivi di efficienza . Infatti si è visto che un buon compilatore , non necessariamente ottimizzato , produrra' codice piu' efficiente , in termini di velocità , per il costrutto switch rispetto al costrutto con molti if innestati . E visto che nel caso di un interprete i comandi da manipolare , e quindi gli if da testare , sono nell'ordine della decine , meglio allora affidarsi allo switch .

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    L'unico problema è che, sostanzialmente, se non mette la cascata di if...else if...else nel programma principale, dovrà comunque metterla nella funzione che converte la stringa in un numero (oppure, meglio, un for con un if, ma la velocità di è quella lì), quindi il guadagno è fondamentalmente di eleganza, anzi in velocità si perde.

  9. #9
    Originariamente inviato da pprllo
    L'unico problema è che, sostanzialmente, se non mette la cascata di if...else if...else nel programma principale, dovrà comunque metterla nella funzione che converte la stringa in un numero (oppure, meglio, un for con un if, ma la velocità di è quella lì), quindi il guadagno è fondamentalmente di eleganza, anzi in velocità si perde.
    Non posso che quotare...Anche l'eleganza che si guadegnerebbe non la vedo comunque non sottilizzerei, diciamo che è a sua scelta.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  10. #10
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502
    ho optato per uno switch perchè lo ritengo il metodo più elegante e di conseguenza un codice più leggibile.


    Grazie a tutti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.