PDA

Visualizza la versione completa : [C] Array di strutture


jac
16-08-2017, 16:55
Buon pomeriggio ragazzi
Come da titolo sto provando a scrivere il codice di un'array di strutture che prende i dati generici riguardo a degli operai(il cui numero e' scelto dall'utente) li memorizza e quindi mi permette di fare una ricerca attraverso il nome dell'operaio visualizzando poi tutta la scheda relativa a quest'ultimo
Il problema qui e' che quando arrivo alla string compare per controllare se esiste un nome che corrisponde a quello che voglio cercare il programma da "errore di segmentazione"
Tutti gli errori scompaiono se invece dell'operatore freccia ( -> ) uso l'operatore punto ( . ) per accedere ai campi delle strutture (togliendo anche l'asterisco nella linea della typedef).
Immagino che sia un problema derivante dall'uso dei puntatori per non so piu cosa tentare...

Per compilare questo codice utilizzo il comando gcc -std=gnu99 c.c quindi la dichiarazione nel for di un valore non un problema.


#include<stdio.h>
#include<string.h>
#define NMAX 30


struct scheda
{
char nome[40];
char mansione[40];
int ore;
int salario;
};


typedef struct scheda *operaio;

int main(void)
{
operaio operaio[NMAX];
char cerca[20],nome[40],mansione[40];
int n,pos,trovato,ore,salario;


printf("Inserisci il numero di dipendenti: ");
scanf("%d", &n);
{
for(int i=0; i<n; i++)
{
printf("\nInserisci il nome dell'dipendente: ");
scanf("%s", nome);
strcpy(operaio[i]->nome, nome);
printf("\nInserisci il mansione: ");
scanf("%s", mansione);
strcpy(operaio[i]->mansione, mansione);
printf("\nInserisci ore di lavoro: ");
scanf("%d", &operaio[i]->ore);
printf("\nQuant'è la retribuzione di questo operaio? ");
scanf("%d", &operaio[i]->salario);
}
printf("\nInserisci il nome dell'operaio da cercare! ");
scanf("%s", cerca);


pos=0;
trovato=0;
while(pos<n && !trovato)
{
if(strcmp(operaio[pos]->nome, cerca)==0)
{
trovato=1;
}
else
{
pos++;
}
}


if(!trovato)
{
printf("\nOperaio non trovato!\n");
}
else
{
printf("\nTrovato in posizione %d.\nScheda:\nNome: %s\nMansione: %s\nOre lavorative: %d\nSalario: %d\n",
pos+1,operaio[pos]->nome,operaio[pos]->mansione,operaio[pos]->ore,operaio[pos]->salario);
}
}
}

oregon
16-08-2017, 22:46
A parte il fatto che chiamare il tipo e il vettore con lo stesso simbolo (operaio) non una buona idea, in ogni caso hai preparato un vettore di 30 puntatori a struttura ma non hai mai allocato lo spazio per tali strutture.

Prima di fare

strcpy(operaio[i]->nome, nome);

devi allocare l'elemento a cui punta operaio[i] con

operaio[i] = (struct operaio *)malloc(sizeof(struct operaio));

jac
17-08-2017, 00:07
Finalmente ne sono venuto a capo, stranamente la coercizione imposta dava problemi al compilatore(mai capitato..) infatti rimuovendola il programma stato eseguito correttamente:rolleyes:
Volevo farti qualche domanda visto che con le strutture sono un po' imbranato:
-quando le strutture sono dichiarate come puntatori devo TASSATIVAMENTE allocare della memoria per questi? Questa la ragione per cui quando usavo l'operatore punto per accedere ai campi delle strutture il compilatore non restituiva questo errore giusto?
-e' la prima volta che mi capita un errore dovuto alla presenza di coercizione nella malloc, come mai e' successo? Anche il mio(disastrato)manuale spiega che ci deve essere sempre...

Ad ogni modo grazie, di seguito posto il codice per chi possa averne bisogno



#include<stdio.h>#include<string.h>
#include<malloc.h>
#define NMAX 30


struct scheda
{
char nome[40];
char mansione[40];
int ore;
int salario;
};


typedef struct scheda *operaio;

int main(void)
{
operaio operaio[NMAX];
char cerca[20],nome[40],mansione[40];
int n,pos,trovato,ore,salario,l;


printf("Inserisci il numero di dipendenti: ");
scanf("%d", &n);
{
for(int i=0; i<n; i++)/*attivare switch gnu99 sul compilatore*/
{
operaio[i] = malloc(sizeof operaio);


printf("\nInserisci il nome dell'dipendente: ");
scanf("%s", nome);
strcpy(operaio[i]->nome, nome);
printf("\nInserisci il mansione: ");
scanf("%s", mansione);
strcpy(operaio[i]->mansione, mansione);
printf("\nInserisci ore di lavoro: ");
scanf("%d", &operaio[i]->ore);
printf("\nQuant'è la retribuzione di questo operaio? ");
scanf("%d", &operaio[i]->salario);
}
printf("\nInserisci il nome dell'operaio da cercare! ");
scanf("%s", cerca);


pos=0;
trovato=0;
l=strlen(cerca);
while(pos<n && !trovato)
{
if(memcmp(operaio[pos]->nome, cerca, l)==0)
{
trovato=1;
}
else
{
pos++;
}
}


if(!trovato)
{
printf("\nEsame non trovato!\n");
}
else
{
printf("\n------------------------------------------------------------------------------------");
printf("\nTrovato in posizione %d.\nScheda:\nNome: %s\nMansione: %s\nOre lavorative:%d\nSalario: %d\n",
pos+1,operaio[pos]->nome,operaio[pos]->mansione,operaio[pos]->ore,operaio[pos]->salario);
printf("\n------------------------------------------------------------------------------------");

}
}
}

Loading