Sto provando a implementare un dizionario.
Questo è il main:
codice:
#include "prova.h"
int main(int argc, char **argv)
{
dizionario d=creaDizionario();
aggiungiChiave(d,"a");
aggiungiChiave(d,"b");
return 0;
}
Questo dizionario.c:
codice:
#include "prova.h"
dizionario creaDizionario(void)
{
dizionario d=(struct __dizionario*)malloc(sizeof(struct __dizionario));
d->vettore=(chiave*)malloc(MAXLUNG*sizeof(chiave));
d->ultimo=-1;
return d;
}
void scambiaChiavi(chiave a, chiave b)
{
char *t1,*t2;
t1=(char*)malloc(strlen(a)*sizeof(char));
t2=(char*)malloc(strlen(b)*sizeof(char));
strcpy(t1,a);
strcpy(t2,b);
free(a);
free(b);
a=t2;
b=t1;
}
void copiaChiave(chiave a, chiave b)
{
char *temp;
temp=(char*)malloc(strlen(b)*sizeof(char));
free(a);
strcpy(temp,b);
a=temp;
}
void aggiungiChiave(dizionario d, chiave elem)
{
int i;
bool out=false,error=false;
for(i=0; i<= d->ultimo && !out && !error; i++)
{
if(strcmp(d->vettore[i],elem)>0)
out=true;
else if(strcmp(d->vettore[i],elem)==0)
error=true;
}
if(!error)
{
d->ultimo++;
for(int j=i+1 ;j<=d->ultimo;j++)
copiaChiave(d->vettore[j],d->vettore[j-1]);
copiaChiave(d->vettore[i],elem);
}
else
fprintf(stderr,"La chiave non è stata aggiunta perchè era già presente\n");
}
void stampaDizionario(dizionario d)
{
printf("Elenco parole:\n");
for(int i=0;i<=d->ultimo;i++)
printf("%s\t",d->vettore[i]);
printf("\n");
}
Questo dizionario.h :
codice:
#ifndef PROVA_H
#define PROVA_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#define MAXLUNG 1000
typedef char *chiave;
typedef struct __dizionario
{
chiave *vettore;
int ultimo;
}*dizionario;
dizionario creaDizionario(void);
void scambiaChiavi(chiave a, chiave b);
void copiaChiave(chiave a, chiave b);
void aggiungiChiave(dizionario d, chiave elem);
void stampaDizionario(dizionario d);
#endif
Va in segmentation fault appena aggiungo la seconda chiave.
Ma non so in che riga, penso comunque sia nella procedura aggiungiChiave o copiaChiave.
Non so proprio dov'è l' errore
E comunque come si fa con gcc a sapere qual'è la rigna in cui va in segmentation fault, io sto compilando con un makefile:
codice:
default:
gcc -std=c99 -Wall -o prova prova.c
dizionario:
gcc -std=c99 -Wall -o prova prova.c dizionario.c
clean:
rm prova
cleanall:
rm prova prova.o
Ma quando lo eseguo mi dice solo "segmentation fault" da terminale, senza dire la riga.