Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    3

    Problema segmentation fault

    questo è un programma che dati da riga di comando 2 parametri:
    1) un numero di 7 cifre da 2 a 9 (come la tastiera del cellulare) genera tutte le parole che comincia per consonante efiniscono per vocale, non hanno una sequenza di 4 consonanti, non hanno una sequenza di 3 vocali e le salva in una lista.
    2) il nome di un file contenente una lista di parole.. se trova una parola dalla lista che è stata generata indica la sua posizione la parola e la codifica...

    veniamo ora al problema.. genera le parole ma poi mi va in segmentation fail... non riesco a capire dove sia l'errore e per lunedì devo portarlo per un esame.. vi prego di aiutarmi!

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct lista_s{
    	char* parola;
    	struct lista_s *next;
    } lista;
    
    char consonanti [21] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's' , 't', 'v', 'w', 'y', 'x', 'z'};//
    char vocali [5] = { 'a', 'e', 'i' ,'o', 'u'};//
    
    int vocale_f (char c);
    int consonante_f (char c);
    char** function_b (lista** Ptr,int* lung);
    void function_c (lista **Ptr);
    void function_d(FILE* pointer, char** vett, int index, char * string);
    void inserisci_lista ( lista ** Ptr, char *string);
    int verifica_parola (char* vett);
    
    int main (int argc, char* argv[])
    {
    	char Vc[8]; //
    	int vett[7];//
    	int i,k,k1,k2,k3,k4,k5,k6,L;//inserire inizializzazioni
    	char alfabeto [10][4] = { "0000","0000","abc" , "def" , "ghi", "jkl", "mno", "pqrs", "tuv" , "wxyz" };
    	char parola [8];//
    	FILE *fp;//
    	lista *elenco=NULL;
    	char** copia;
    	
    	if (argc != 3) 
    		printf("errore argomenti");
    	else
    	{
    		if((sscanf(argv[1], "%s", Vc)!= 1))
    			printf("errore argomento");
    		else
    		{*/
    			for (i=0; i<7; i++) {
    				//vett[i]=atoi(Vc[i]);
    				vett[i]=Vc[i]-'0';
    				if (vett[i]==0 || vett[i]==1){
    				    printf("errore");
    					return 0;
                    }
    			}
    			for (k=0; k<strlen(alfabeto[vett[0]]); k++){
    				parola[0]= alfabeto[vett[0]][k];
    				for (k1=0; k1<strlen(alfabeto[vett[1]]); k1++){
    					parola[1]= alfabeto[vett[1]][k1];
    					for (k2=0; k2<strlen(alfabeto[vett[2]]); k2++){
    						parola[2]= alfabeto[vett[2]][k2];
    						for (k3=0; k3<strlen(alfabeto[vett[3]]); k3++){
    							parola[3]= alfabeto[vett[3]][k3];
    							for (k4=0; k4<strlen(alfabeto[vett[4]]); k4++){
    								parola[4]= alfabeto[vett[4]][k4];
    								for (k5=0; k5<strlen(alfabeto[vett[5]]); k5++){
    									parola[5]= alfabeto[vett[5]][k5];
    									for (k6=0; k6<strlen(alfabeto[vett[6]]); k6++){
    										parola[6]= alfabeto[vett[6]][k6];
    										if (verifica_parola(parola)){//mancava l'argomento
    											//printf("%s\n",parola);
    											inserisci_lista(&elenco, parola);//mancavano gli argomenti
    										}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    			
    			copia=function_b(&elenco,&L);//mancavano parametri
    			if ((fp=fopen(argv[2], "r"))!=NULL) {
    				function_d(fp,copia,L,Vc);//mancavano argomenti
    			}
    			else 
    				printf("impossibile aprire file");
    			function_c(&elenco);//mancavano parametri
    			
    	//	}
    	//}
    	return 0;
    }
    
    int verifica_parola (char* vett)
    {
    	int trovato = 0,i, counter = 0;
    	
    	for (i=0;i<20 && !trovato;i++)
    		if (vett[0]==consonanti[i])
    			trovato = 1;
    	if (trovato==1)
    	{
    		for (i=0;i<5 && trovato; i++)
    			if (vett[6] == vocali [i])
    				trovato = -1;
    	}
    	if (trovato==-1) {
    		for ( i=1; i<7; i++)
    		{
    			if (consonante_f(vett[i-1]) && consonante_f(vett[i])) {
    				counter++;
    				if (counter==4)
    					return 0;
    			}
    			else 
    				counter = 0;
    		}
    		counter = 0;
    		for (i=1;i<6;i++)
    		{
    			if (vocale_f(vett[i]) && vocale_f(vett[i+1]))
    			{
    				counter++;
    				if (counter==3)
    					return 0;
    			}
    			else counter = 0;
    		}
    		return 1;
    	}
    	return 0;
    }
    
    int vocale_f (char c) //mancava
    {
    	int i;
    	
    	for (i=0;i<5 ; i++)
    		if (c == vocali [i])
    			return 1;
    	return 0;
    	
    }
    
    int consonante_f (char c)//mancava
    {
    	int i;
    	
    	for (i=0;i<20;i++)
    		if (c == consonanti[i])
    			return 1;
    	return 0;
    }
    
    void inserisci_lista ( lista ** Ptr, char *string)
    {
    	lista *n_pt, *p_pt, *c_pt;
    	
    	n_pt =(lista *) malloc(sizeof(lista));
    	if (n_pt != NULL)
    	{
    		strcpy ( n_pt->parola, string);
    		n_pt->next = NULL;
    		p_pt = NULL;
    		c_pt = * Ptr;
    		
    		while (c_pt != NULL && strcmp(string, c_pt->parola)>0) {//avevo sbagliato e scritto string > c_pt
    			p_pt = c_pt;
    			c_pt = c_pt->next;
    		}
    		if (p_pt == NULL) {
    			n_pt->next = *Ptr;
    			*Ptr = n_pt;
    		}
    		else {
    			p_pt->next =n_pt;
    			n_pt->next =c_pt;
    		}
    		
    	}
    	else {
    		printf("memoria non disponibile");
    	}
    	
    }
    
    void function_c (lista **Ptr)
    {
    	lista * c_pt;
    	while (*Ptr!=NULL) {
    		c_pt = *Ptr;
    		*Ptr = (*Ptr)->next;
    		free(c_pt);
    	}
    }
    
    char** function_b (lista** Ptr,int* lung)//non avevo messo l'ultimo parametro
    {
    	int index=0;
    	int i;//
    	char **vettd;
    	lista* temp;
    	
    	temp = *Ptr; //avevo scritto *temp
    	while (*Ptr != NULL) {
    		*Ptr= (*Ptr)->next;
    		index++;
    	}
    	*Ptr = temp; //
    	*lung= index;  //
    	vettd = malloc (index*sizeof(char*));
    	for (i=0; i<index; i++) {
    		vettd[i] = malloc(7*sizeof(char));
    	}
    	index=0;
    	while (temp != NULL) {//avevo messo *temp
    		strcpy(vettd[index],temp->parola);
    		temp=temp->next;//avevo scritto *temp=(*temp)->next
    		index++;
    	}
    	return vettd; //non avevo messo vettd
    }
    
    void function_d(FILE* pointer, char** vett, int index, char * string) //non avevo mess l'ultimo parametro
    {
    	char cercato[8];
    	int i;
    	
    	while ((fscanf(pointer, "%s", cercato))!= EOF){ //non avevo messo while
    		for (i=0; i<index; i++) {
    			if (strcmp(cercato, vett[i])==0)
    			{
    				printf("indice %d, parola %s, codifica %s\n", index, cercato, string);	
    		    }
    		}
    	}
    }

  2. #2
    Non ho guardato tutto il codice ma penso che nessuno si metterebbe a leggerlo.

    Solitamente accade quando sorpassi o scrivi in pezzi di memoria non allocati. Controlla se vai fuori da qualche array e utilizza lo strumento che pochi evidentemente ritengono utile... il debugger
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai eseguito passo passo il programma ?

    Hai trovato in quale linea c'è il segmentation fault ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    3
    ragazzi dopo ore perse a debuggare ho trovato il problema.. facevo una strcpy senza allocare prima la memoria risolto con una strdup.. nuovo problema la funzione verifica parola non fa il suo dovere -.-" se ci sono 4 consonanti va avanti lo stesso...

  5. #5
    omg però abituati a dare nomi significativi a variabili e funzioni
    cioè non so come sia il tuo esame, ma nel mio a ingegneria veniva valutato anche questo fatto. Cioè variabili monosillabiche o nomi di funzioni del tipo funzA funzB funzC pesavano nella valutazione complessiva (E giustamente direi, rendono il codice illeggibile )
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    3
    trovato anche questo! =) semplicemente verificando 2 lettere alla volta il counter doveva essere ridotto di un unità... comunque i vari funz_a ecc sono punti separati del compito! le altre funzioni sono circa esplicative.. grazie comunque!!!
    PS:lo so per i monosillabi, ma dovendo fare il programma su foglio, in 2 ore se mi metto a scrivere nomi completi non finisco più!!! -.-" non capisco perchè non possiamo farli a pc ma vabbè...
    ultimo dubbio.. chi sa come lanciare da riga di comando su mac?!? XD

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Tre quesiti completamente diversi nella stessa discussione.
    Senza nemmeno specificare il linguaggio usato (come espressamente richiesto dal regolamento interno).

    Non è il modo corretto di condurre una discussione.

    Devo chiduere.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.