Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-07-2011, 16:37   #1
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Lettura da file con allocazione in una lista

Salve a tutti,
ho un problema con un programma che gestisce un magazino di ricambi. Io per adesso lo sto provando solo con interi, perchè ancora non ho assimilato bene la funzione che permette di scrivere dentro un'allocazione di memoria, una stringa. Se non sbaglio si chiama strcpy questa funzione.
Il problema per adesso sta nella lettura degli interi. Per la scrittura, ecc. ci siamo perfettamente, ma per la lettura mi da sempre un errore riguardante la segmentazione.
Potreste aiutarmi???

Io sto usando il linguaggio C su piattaforma UNIX (Linux Ubuntu).
Vi ringrazio anticipatamente.


Ecco il codice che ho scritto:
Codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct articolo{ int num;
           struct articolo *next;      };   
    typedef struct articolo nodo;
    nodo *cons(nodo *start, nodo *p);
    char menu();
    void stampa(nodo *start, nodo *p);
    nodo *delete(nodo *start, nodo *p);
    nodo *leggi(nodo *start, nodo *p);
    void scrivi(nodo *start, nodo *p);

    main(int argc, char **argv)
    {
       char sc;
       nodo *start, *p, *punt;

       start=(nodo *)malloc(sizeof(nodo));

       p=start;
       p->next=NULL;
    do{
    sc=menu();
    switch(sc){
       case 'a': start=cons(start, p);       break;
       case 'd': start=delete(start, p);    break;
       case 's': stampa(start, p);       break;
       case 'l': start=leggi(start, p);         break;
       case 'w': scrivi(start, p);         break;
       case 'q': exit (0); }

    }while(sc!='q');
    }



    void stampa(nodo *start, nodo *p){
       while(start!=NULL)
       {printf("%d--> ", start->num);
        start=start->next;
                } 
       printf("\n");
                }


    nodo *cons(nodo *start, nodo *p)
       { nodo *start2;  int numero;
         start2=(nodo *)malloc(sizeof(nodo));
         printf("Inserisci numero: "); scanf("%d", &numero);
         p=start2;   
         p->num=numero;
         p->next=start ;
        return (start2);
       }


    char menu()

       {char sc; printf("A)dd, D)elete, S)tampa, L)oad, W)rite, Q)uit\n");
        scanf("%c", &sc); return (sc);   }

    nodo *delete(nodo *start, nodo *p)
       {int num_del; nodo *p2;
        printf("Inserisci il numero che vuoi eliminare:");
        scanf("%d", &num_del);
        p2=start;
           while(p2->next->num!=num_del)
           {p2=p2->next;}
           p2->next=p2->next->next;   
       return (start); 
                         }
    nodo *leggi(nodo *start, nodo *p)
       {FILE *pf;
        pf=fopen("numeri.txt", "r");
        nodo *start3;
        start3=(nodo *)malloc(sizeof(nodo));
        p=start3;

        if(pf)
          {while(!feof(pf))
             {fscanf(pf, "%d\t", &p->num); p=p->next;}
           fclose(pf);
          }else{printf("Errore nella lettura del file\n");}
       p->next=start;
       return(start3);   }

    void scrivi(nodo *start, nodo *p)
       {FILE *pf;
        pf=fopen("numeri.txt", "w");
        if(pf)
          {while(start!=NULL)
             {fprintf(pf, "%d\t", start->num); start=start->next;}
          fclose(pf);
          }else{printf("Non è stato possibile scrivere il file\n");}
       }
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2011, 20:36   #2
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
In nodo *leggi(nodo *start, nodo *p) leggi tutto il file, ma allochi una sola struttura nodo.
Già il primo p=p->next ti porta un un punto qualsiasi della memoria (p->next non è inizializzato, dovrebbe puntare ad una nuova struttura allocata).

Anche nel delete vedo vari problemi:
  • salti il test sul primo elemento
  • non liberi la memoria (con free) -> memory leak
  • pronto al botto se il numero non c'è!

Mi sfugge cosa vuoi fare con gli argomenti che passi alle funzioni, visto che spesso li sovrascrivi ed altre volte non li usi.

Per finire ti consiglio vivamente di scegliere uno stile di indentazione e di mantenerlo per tutto il codice: quelle graffe buttate a caso sono fonte di errore e terribili da rintracciare nella lettura.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 00:11   #3
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
In nodo *leggi(nodo *start, nodo *p) leggi tutto il file, ma allochi una sola struttura nodo.
Già il primo p=p->next ti porta un un punto qualsiasi della memoria (p->next non è inizializzato, dovrebbe puntare ad una nuova struttura allocata).

Anche nel delete vedo vari problemi:
  • salti il test sul primo elemento
  • non liberi la memoria (con free) -> memory leak
  • pronto al botto se il numero non c'è!

Mi sfugge cosa vuoi fare con gli argomenti che passi alle funzioni, visto che spesso li sovrascrivi ed altre volte non li usi.

Per finire ti consiglio vivamente di scegliere uno stile di indentazione e di mantenerlo per tutto il codice: quelle graffe buttate a caso sono fonte di errore e terribili da rintracciare nella lettura.
Ciao, perdonami ma è da poco che programmo con il C.
Adesso ti spiego meglio cosa devo fare. Si lo so che non ci sono controlli, ma momentaneamente non mi preoccupo, perchè il mio problema è altro e quindi quello è l'ultimo pensiero.

Ecco il codice più fluido, ma con sempre i problemi.
I problemi sono:
1) non so come si fa ad inserire un nome\stringa in un'allocazione di memoria;
2) non riesco a far leggere da file;
3) quando stampo, mi stampa sempre lo zero alla fine.
4) nella funzione delete mi elimina tutto tranne l'ultimo numero inserito.

Il testo di tutto l'esercizio vuole che io gestica un magazzino, la struttura deve contenere solo una stringa di char che indica il nome, e un int che indica la quantità dei pezzi. Ci devono essere le funzioni aggiungi pezzo, aggiorna le quantità del pezzo(preleva o aggiungi pezzo), cerca, elimina, stampa, rimuovi tutto, carica da file, salva su file. Dopo ogni operazione che faccio deve aggiornare i valori relativi al numero di tipi di ricambi e al numero complessivo di pezzi presenti.


Esempio:
A)ggiungi, C)erca, E)limina, R)imuovi tutto, P)releva, D)eposita, C)arica, S)crivi, E)sci.
p
Quale tipo di ricambio vuoi prelevare? Ruota
numero dei pezzi disponibili: 15
quanti pezzi vuoi prelevare? 3

Codice:
#include <stdio.h>
#include <stdlib.h>
struct articolo{ char nome[20];
                 int q;
                 struct articolo *next;};
typedef struct articolo nodo;
char menu();
nodo *cons(nodo *start);
void stampa(nodo *start);
nodo *trova(nodo *start);
nodo *delete(nodo *start);
nodo *inserisci(nodo *start);

main(int argc, char **argv)
{char sc;

nodo *start;
start=(nodo *)malloc(sizeof(nodo));

 /*
start->next=NULL;
*/

while(sc!='q')
{sc=menu();
switch(sc){
        case 'a': start=cons(start);    break;
        case 'd': delete(start);        break;
        case 's': stampa(start);        break;
        case 't': trova(start);         break;
        case 'p': break;
        case 'i': start=inserisci(start); break;
        case 'l': break;
        case 'w': break;
        case 'q': exit (0); break;
        }}
}



char menu()
        {char sc;
         printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n"); scanf("%c", &sc); return (sc);
        }

nodo *cons(nodo *start)
        {char *nom_prod; int quant;  nodo *start2;
         start2=(nodo *)malloc(sizeof(nodo));
         start2->next=start;
/*      printf("Inserisci Nome prodotto: ");
        scanf("%s", nom_prod);                   */
        printf("Inserisci la quantità: ");
        scanf("%d", &quant);
         start2->q=quant;

/*       strcpy(start2->nome, nom_prod);  */

         return (start2);
        }

void stampa(nodo *start)
        {while(start!=NULL)
                {/* printf("%s", start->nome); */
                 printf("%d ", start->q); start=start->next;}
        printf("\n");
        }

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q=start->q+pezzi_add;
         return (start);
        }
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 00:12   #4
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
PS: Le parti inserite tra /* */ sono le parti che secondo il mio raggionamento sono esatte, ma purtroppo mi creano errori e non funzionano.
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 01:04   #5
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
Non la prendere a male ma mi sa che hai qualche problema con i puntatori, o con il C in generale. Ti consiglio vivamente di dare una ripassata al C e ai puntatori.
Al di la della indentazione il tuo codice ha errori un po ovunque, controlli non fatti, valori non ritornati, parametri di ingresso ed uscita passati "a casaccio".
L'unica funzione che non ha errori è la funzione di stampa.
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 01:15   #6
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*memset e funzioni stringhe*/

struct articolo{
	char nome[20];
	int q;
	struct articolo *next;
};
typedef struct articolo nodo;

char menu();
nodo* cons(nodo *start);
void stampa(nodo *start);
nodo* trova(nodo *start);
nodo* delete(nodo *start);
nodo* inserisci(nodo *start);

main(int argc, char **argv)
{
	char sc = 'z'; /*inizializza SEMPRE*/

	nodo *start = (nodo *)malloc(sizeof(nodo));
	memset((void *)start, 0x00, sizeof(nodo)); /*tutto il contenuto della struttura azzerato*/
	/*Ah, a causa di questa allocazione iniziale avrai sempre un elemento*/
	/*vuoto in coda alla lista; non credo sia ciò che desideri...*/

	while( sc != 'q' )
	{
		sc = menu();
		switch( sc )
		{
		case 'a':
			start = cons(start);
			break;
		case 'd':
			delete(start);
			break;
		case 's':
			stampa(start);
			break;
		case 't':
			trova(start);
			break;
		case 'p':

			break;
		case 'i':
			start=inserisci(start);
			break;
		case 'l':

			break;
		case 'w':

			break;
		case 'q':
			exit(0);
			break;
		}
	}
}


char menu()
{
	char sc;
	printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n");
	scanf("%c", &sc);
	return sc;
}

nodo *cons(nodo *start)
{
	nodo *nuovo = (nodo*)malloc(sizeof(nodo));
	memset((void*)nuovo, 0x00, sizeof(nodo)); /*pulizie di primavera, come sopra*/
	nuovo->next = start;
	printf("Inserisci Nome prodotto: ");
	scanf("%s", nuovo->nome); /*scanf di stringa: puoi usare direttamente la struttura*/
	printf("Inserisci la quantità: ");
	scanf("%d", &(nuovo->q)); /*idem per l'int, avendo l'accortezza di riferirsi all'elemento desiderato*/
	return nuovo;
}

void stampa(nodo *start)
{
	while(start!=NULL)
	{
		printf("%s: qty ", start->nome); /*questa immagino schiantasse a causa della mancata inizializzazione delle strutture (stringhe non terminate)*/
		printf("%d\n", start->q);
		start=start->next;
	}
	printf("\n");
}

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


/*come ti ho scritto prima, questo delete non controlla il primo elemento*/
/*della lista, cioè l'ultimo inserito. Devi controllare start->q, non saltare*/
/*subito al next. Devi anche fare il delete del nodo.*/
nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q += pezzi_add;
         return (start);
        }
Tra commenti e correzioni dirette dovrei aver risposto a tutte le tue domande (più una porzione indentata a modo mio).
Ah, giusto, ho tralasciato il leggi da file: quello lo hai abbozzato, quando avrai ben capito come navigare nella lista e leggere i dati ti verrà molto più semplice: lascialo per ultimo, prima completa le funzioni interattive.
La scrittura su file dovrebbe essere ancora più semplice.

Trattandosi di un esercizio non posso andare oltre, devi capire ed applicare i suggerimenti, ma vedo che hai fatto varie prove, quindi confido che sarai in grado di procedere.
Visto che sei in Ubuntu ricordati che esistono anche le man per le funzioni C, che son comode, solitamente ben scritte e, soprattutto, indicano comodamente quali header occorre includere per utilizzare tal funzione.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 12:44   #7
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*memset e funzioni stringhe*/

struct articolo{
	char nome[20];
	int q;
	struct articolo *next;
};
typedef struct articolo nodo;

char menu();
nodo* cons(nodo *start);
void stampa(nodo *start);
nodo* trova(nodo *start);
nodo* delete(nodo *start);
nodo* inserisci(nodo *start);

main(int argc, char **argv)
{
	char sc = 'z'; /*inizializza SEMPRE*/

	nodo *start = (nodo *)malloc(sizeof(nodo));
	memset((void *)start, 0x00, sizeof(nodo)); /*tutto il contenuto della struttura azzerato*/
	/*Ah, a causa di questa allocazione iniziale avrai sempre un elemento*/
	/*vuoto in coda alla lista; non credo sia ciò che desideri...*/

	while( sc != 'q' )
	{
		sc = menu();
		switch( sc )
		{
		case 'a':
			start = cons(start);
			break;
		case 'd':
			delete(start);
			break;
		case 's':
			stampa(start);
			break;
		case 't':
			trova(start);
			break;
		case 'p':

			break;
		case 'i':
			start=inserisci(start);
			break;
		case 'l':

			break;
		case 'w':

			break;
		case 'q':
			exit(0);
			break;
		}
	}
}


char menu()
{
	char sc;
	printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n");
	scanf("%c", &sc);
	return sc;
}

nodo *cons(nodo *start)
{
	nodo *nuovo = (nodo*)malloc(sizeof(nodo));
	memset((void*)nuovo, 0x00, sizeof(nodo)); /*pulizie di primavera, come sopra*/
	nuovo->next = start;
	printf("Inserisci Nome prodotto: ");
	scanf("%s", nuovo->nome); /*scanf di stringa: puoi usare direttamente la struttura*/
	printf("Inserisci la quantità: ");
	scanf("%d", &(nuovo->q)); /*idem per l'int, avendo l'accortezza di riferirsi all'elemento desiderato*/
	return nuovo;
}

void stampa(nodo *start)
{
	while(start!=NULL)
	{
		printf("%s: qty ", start->nome); /*questa immagino schiantasse a causa della mancata inizializzazione delle strutture (stringhe non terminate)*/
		printf("%d\n", start->q);
		start=start->next;
	}
	printf("\n");
}

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


/*come ti ho scritto prima, questo delete non controlla il primo elemento*/
/*della lista, cioè l'ultimo inserito. Devi controllare start->q, non saltare*/
/*subito al next. Devi anche fare il delete del nodo.*/
nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q += pezzi_add;
         return (start);
        }
Tra commenti e correzioni dirette dovrei aver risposto a tutte le tue domande (più una porzione indentata a modo mio).
Ah, giusto, ho tralasciato il leggi da file: quello lo hai abbozzato, quando avrai ben capito come navigare nella lista e leggere i dati ti verrà molto più semplice: lascialo per ultimo, prima completa le funzioni interattive.
La scrittura su file dovrebbe essere ancora più semplice.

Trattandosi di un esercizio non posso andare oltre, devi capire ed applicare i suggerimenti, ma vedo che hai fatto varie prove, quindi confido che sarai in grado di procedere.
Visto che sei in Ubuntu ricordati che esistono anche le man per le funzioni C, che son comode, solitamente ben scritte e, soprattutto, indicano comodamente quali header occorre includere per utilizzare tal funzione.

Il problema è che tra 3 giorni ho un esame e devo almeno avere una copia esatta di questo programmma.


Ho riscritto tutto.
Potresti correggerlo?
E' pieno di errori e in questo momento, dato che sono sotto esami, ho la testa che non mi funziona più, non riesco a raggionare bene!
Aiutami!!!!!!!!!!!
Grazie!

Ecco il codice:
Codice:
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 struct articolo{ char nome[20];
		  int q;
		  struct articolo *next;};  

 typedef struct articolo nodo; 
 char menu();
 nodo *cons(nodo *start);
 void stampa(nodo *start);
 nodo *trova(nodo *start);
 nodo *delete(nodo *start);
 nodo *inserisci_preleva(nodo *start);
 nodo *prod_work(nodo *start);
 void scrivi(nodo *start);
 nodo *leggi(nodo *start);


 main(int argc, char **argv) 
 { char sc='\0'; 
   char prod='\0';

   nodo *start=NULL;

  while(sc!='q')
  	{sc=menu();
  	switch(sc){
		case 'a': start=cons(start);			break;
		case 'd': delete(start);			break;
		case 's': stampa(start); 			break;
		case 't': trova(start);				break;
		case 'p': start=inserisci_preleva(start);	break;
		case 'l': start=leggi(start);			break;
		case 'w': scrivi(start);			break;
		case 'q': exit (0); 				break;
		}
	}
 return 0;
 }



 char menu()
	{char sc='\0';
	 printf("A)dd, D)elete, S)tampa, T)rova, P)releva o inserisci, L)oad, W)rite, Q)uit.\n"); scanf("%c", &sc); 
	 return  sc; 
	}

 nodo *cons(nodo *start) 
	{char nom_prod[20];
	 int quant;
	 nodo *start2; 
	
	printf("Inserisci nome prodotto:\t");
	scanf(" %s", nom_prod);

	start2=(nodo *)malloc(sizeof(nodo));
	
	if(start2!=NULL)
		{ start2->next=start; 
		  printf("Inserisci la quantità:\t");
		  scanf(" %d", &quant); 
		  
		  start2->q=quant;
		  strcpy(start2->nome, nom_prod);   
	
		  return (start2);
		}
	 return (start); 
	}

 void stampa(nodo *start)
	{while(start!=NULL)
		{ printf("%s\t%d\n ", start->nome, start->q);
		  start=start->next;
		}  
		  printf("\n");
	}

 nodo *trova(nodo *start)
	{char prod[20];
	 printf("Inserisci il nome dell'articolo che cerchi:\t");
	 scanf(" %s", prod);
 		if(start->nome!=NULL)
					{while(start->nome!=prod)
							{start=start->next;
							}
					return start;
					}

	printf("L'articolo da te cercato è: %s %d\n", start->nome, start->q);
	return start;
	} 


 nodo *prod_work(nodo *start)
	{ char prod='\0';
	  printf("Inserisci il nome dell'articolo:");
	  scanf("%s", prod);
	  return prod;
	}
 
 nodo *delete(nodo *start)
	{int num_del;
	 char prod='\0';
	 
	 prod=prod_work(start);
 	 while(start->next->nome!=prod)
		{start=start->next;
		}	 
	 start->next=start->next->next; 
	 printf("Il numero è stato correttamente eliminato\n"); 
	}	

 nodo *inserisci_preleva(nodo *start)
	{int pezzi_add, pezzi_sub;
	 char sc='\0';
	 char prod='\0';

	 prod=prod_work(start);
	 while(start->nome!=prod)
				{start=start->next;
				}  
	 printf("vuoi A)ggiungere o E)liminare pezzi? ");
	 scanf("%c", &sc);	
		switch(sc)
			{case 'a': printf("QUanti pezzi vuoi aggiungere?");
			scanf("%d", &pezzi_add); start->q=start->q+pezzi_add; 		 break; 

			 case 'e': if(start->q >0)
						{printf("Quanti pezzi vuoi sottrarre?");
						 scanf("%d", &pezzi_sub); start->q=start->q-pezzi_sub;
						}
						else{printf("Non ci sono pezzi disponibili\n"); break;
						    }

	 return (start);
	}
	
 void scrivi(nodo *start)
	{FILE *pf; 
	pf=fopen("numeri.txt", "w");
	if(pf)
		{while(start!=NULL)
				{fprintf(pf, "%s\t %d\n", start->nome, start->q);
				 start=start->next;
				}
		fclose(pf);
		}	
	else{printf("Non è stato possibile scrivere il file");
	    }
 	}

 nodo *leggi (nodo *start)
	{char nom_prod2[20];
	 int quant2;
	 nodo *tmp;

	 tmp=(nodo *)malloc(sizeof(nodo));
 	
	 FILE *pf;
	 pf=fopen("numeri.txt", "r");
	 if(pf)
		{ while(!feof(pf))
				{fscanf(pf, "%s\t %d", nom_prod2, &quant2);
				 tmp->q=quant2;
				 strcpy(tmp->nome, nom_prod2);
				 tmp=tmp->next;
				}
		 fclose(pf);
	  	 return tmp;

		} 
	 else{
		printf("Errore lettura file\n");
	     }
	return tmp;
	}
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 19:59   #8
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Grazie alle vostre direttive sono riuscito a scrivere tutto il codice tranne due funzioni fondamentali:
1)la funzione cancella funziona con tutti trannne con il primo elemento della lista(infatti ho creato un nuovo nodo, ma non funziona lo stesso);
2)la funzione leggi.


Ecco il codice:

Codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    struct articolo
    {
       char nome[20];
        int q;
       struct articolo *next;
    };

    typedef struct articolo nodo;


    char menu();
    nodo *cons(nodo *start);
    void stampa(nodo *start);
    void trova(nodo *start);
    void deposita(nodo *start);
    void prelieva(nodo *start);
    nodo *cancella(nodo *start);
    void scrivi(nodo *start);

    int main(int argc, char **argv)
    {
       char sc = '\0';

       nodo *start = NULL;

       while(sc!='q')
       {
          sc=menu();
          switch(sc)
          {
             case 'a': start=cons(start);   break;
             case 'd': cancella(start);	break;
             case 's': stampa(start);    break;
             case 't': trova(start);	break;
             case 'p': prelieva(start);	break;
             case 'i': deposita(start);	break;
             case 'l': break;
             case 'w': scrivi(start);	break;
          }
       }
       return 0;
    }



    char menu()
    {
       char sc = '\0';
        printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n");
       scanf(" %c", &sc);
       return sc;
    }

    nodo *cons(nodo *start)
    {
       char nom_prod[20];
       int quant; 
       nodo *nuovo;
       
       printf("Inserisci nome articolo:\t");
       scanf(" %s", nom_prod);


       nuovo=(nodo *)malloc(sizeof(nodo));
       if(nuovo != NULL)
       {
          nuovo->next=start;

          printf("Inserisci la quantità: ");
          scanf(" %d", &quant);

          strcpy(nuovo->nome,nom_prod);
          nuovo->q=quant;
          return nuovo;
       }
       return start;
    }

    void stampa(nodo *start)
    {
       while(start!=NULL)
        {
           printf("%s - %d\n", start->nome, start->q);
          start=start->next;
       }
	printf("\n");
    }


    void trova(nodo *start)
    {
	char parola[20];
	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }

         printf("%s\t %d\n", start->nome, start->q); printf("\n");
    }

 void deposita(nodo *start)
    {
	char parola[20];
	int pezzi;

	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
	printf("Quanti pezzi devo aggiungere?\t");
	scanf("%d", &pezzi);
	start->q=start->q + pezzi;
         printf("%s\t %d\n", start->nome, start->q); printf("\n");
    }


 void prelieva(nodo *start)
    {
	char parola[20];
	int pezzi;

	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
	printf("Quanti pezzi devo prelevare?\t");
	scanf("%d", &pezzi);
	if((start->q - pezzi) >= 0)
	  {
	start->q=start->q - pezzi;
        printf("%s\t %d\n", start->nome, start->q); printf("\n");
	   }else{
	         printf("Non puoi sottrarre %d pezzi, perchè in magazzino sono presenti solo %d pezzi\n", pezzi, start->q);
		 printf("\n");
	        }
    }


 nodo *cancella(nodo *start)
    {
	char parola[20]; nodo *nuovo2;
	printf("Quale oggetto vuoi eliminare?\t");
	scanf("%s", parola);

	nuovo2=(nodo *)malloc(sizeof(nodo));        
	nuovo2->next=start;

        while( strcmp (parola, nuovo2->next->nome) !=0)
	 {
		nuovo2=nuovo2->next;
	 }
	nuovo2->next=nuovo2->next->next;
	printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
	printf("\n");

	return start;
    }


 void scrivi(nodo *start)
    {
	FILE *pf;
	pf=fopen("numeri.txt", "w");
	 
	if(pf)
	   {
		while(start!=NULL)
		   {
			fprintf(pf, "%s\t %d\n", start->nome, start->q);
			start=start->next;
		   }
	fclose(pf);
	printf("Il file è stato scritto correttamente\n"); printf("\n");
	   }else
	    {
		printf("Non è stato possibile scrivere il file\n");} 
	}
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 26-07-2011, 11:12   #9
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
Lo dico per te, secondo me devi studiarti meglio i puntatori, dal tuo codice vedo che hai le idee pochi chiare.

Codice:
    nodo *cancella(nodo *start)
    {
	char parola[20]; nodo *nuovo2,*tmp;
	printf("Quale oggetto vuoi eliminare?\t");
	scanf("%s", parola);
	nuovo2=start;
	if(!strcmp(nuovo2->nome,parola)) // se l'elemento si trova in prima posizione
	{
		start=start->next;
		free(nuovo2);
		printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
		printf("\n");
		return start;
	}
	else
	{
			while (nuovo2->next!=NULL&&strcmp(nuovo2->next->nome,parola))
			 {
				nuovo2=nuovo2->next;
			 }
			 if(nuovo2->next!=NULL) //elemento trovato!
			 {
				 tmp=nuovo2->next;
				nuovo2->next=nuovo2->next->next;
				 free(tmp);
				printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
				printf("\n");

				return start;
			 }
			 else // elemento non trovato
			 {
				 printf("L'oggetto da te richiesto (%s) non è stato trovato \n", parola);
				 printf("\n");
				return start;
			 }
    }
Questa è la funzione delete per come dovrebbe essere scritta. Comunque ci sono diversi errori nel tuo sorgente. In pratica quasi sempre non consideri mai l'eventualità che la parola non venga trovata.
Ad esempio nella funzione trova dovresti aggiungere la riga:

Codice:
void trova(nodo *start)
    {
	char parola[20];
	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 11:43   #10
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Ok,
adesso spero di aver ben capito.
Mi manca solo la funzione LEGGI da file, che non capisco il perchè ma continua a non funzionare!

Potreste scrivermela???


Grazie, davvero non so come ringraziarvi!
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 11:54   #11
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da darkito85 Guarda i messaggi
Lo dico per te, secondo me devi studiarti meglio i puntatori, dal tuo codice vedo che hai le idee pochi chiare.

Codice:
    nodo *cancella(nodo *start)
    {
	char parola[20]; nodo *nuovo2,*tmp;
	printf("Quale oggetto vuoi eliminare?\t");
	scanf("%s", parola);
	nuovo2=start;
	if(!strcmp(nuovo2->nome,parola)) // se l'elemento si trova in prima posizione
	{
		start=start->next;
		free(nuovo2);
		printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
		printf("\n");
		return start;
	}
	else
	{
			while (nuovo2->next!=NULL&&strcmp(nuovo2->next->nome,parola))
			 {
				nuovo2=nuovo2->next;
			 }
			 if(nuovo2->next!=NULL) //elemento trovato!
			 {
				 tmp=nuovo2->next;
				nuovo2->next=nuovo2->next->next;
				 free(tmp);
				printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
				printf("\n");

				return start;
			 }
			 else // elemento non trovato
			 {
				 printf("L'oggetto da te richiesto (%s) non è stato trovato \n", parola);
				 printf("\n");
				return start;
			 }
    }
Questa è la funzione delete per come dovrebbe essere scritta. Comunque ci sono diversi errori nel tuo sorgente. In pratica quasi sempre non consideri mai l'eventualità che la parola non venga trovata.
Ad esempio nella funzione trova dovresti aggiungere la riga:

Codice:
void trova(nodo *start)
    {
	char parola[20];
	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }

Nella funzione cancella non mi elimina il primo elemento.
Nella funzione trova, se scrivo un elemento diverso va in errore.

L'ho appena provato incollando queste due tue funzioni.
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 13:23   #12
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
la funzione cancella devi chiamarla dal menù così:

start=cancella(start);

Per quanto riguarda la funzione trova il problema credo stia nella condizione del ciclo while. Prova ad usare questa.

Codice:
void trova(nodo *start)
    {
	char parola[20];
	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( start!=NULL&&strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
Xiaomi 17: ecco il prezzo europeo del to...
Google fa tremare l'industria dei videog...
Gli sviluppatori 'abbandonano' Xbox: il ...
Galaxy S27 Ultra, è già te...
PlayStation Portal con display OLED: Son...
POCO X8 Pro e Pro Max sono quasi pronti:...
OpenAI ha bisogno di nuovi fondi: NVIDIA...
Mese nuovo, rinnovo delle offerte Amazon...
Accessori auto imperdibili su Amazon: pu...
Gli utenti iPhone possono ridurre la pr...
Come fare affari con l'usato garantito d...
Il miglior tablet di tutta Amazon, DOOGE...
Gli smartphone in super offerta su Amazo...
Produttori di memoria più severi ...
WhatsApp Business, Meta introduce costi ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:41.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v