Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] Array di strutture

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    11

    [C] Array di strutture

    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.
    codice:
    #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);
            }
        }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    11
    Finalmente ne sono venuto a capo, stranamente la coercizione imposta dava problemi al compilatore(mai capitato..) infatti rimuovendola il programma è stato eseguito correttamente
    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

    codice:
    #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------------------------------------------------------------------------------------");
    
    		}
    	}
    }

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.