Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-06-2007, 16:36   #1
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Array di struct

Ciao, devo fare questo esercizio, ma il programma mi crasha e non capisco dov'è l'errore, per ora sono alla parte statica.

Codice:
Simulare i C la gestione di 1 pila (stack) tramite array (array di struct) statico
e dinamico [che differenza c'è?]
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 10
struct pila
{
       char nome[30];
       char cognome[30];
       int matricola;
       struct pila *p;
} *head;



void InserisceTesta(struct pila elenco[], short *n);
main()
{
      struct pila elenco[MAX_SIZE];
      short what,n_persone=0;

      head=NULL;
      while (1)
      {
        puts("\nScegli l'operazione:");
		puts("[1] Inserisci un elemento in testa");
		puts("[2] Esci");
		printf("Inserisci Scelta: ");
		scanf("%hd", &what);   
            
        switch(what)
		{

		case 1: 
            InserisceTesta(elenco,&n_persone);			
			break;
		case 2:
            exit(0);
			break;

		default:
		puts("\nScelta sbagliata! Ripeti!\n\n");
		}        
      }
}

void InserisceTesta(struct pila elenco[], short *n)
{
     
     if (*n==MAX_SIZE)
     puts("Spazio finito");
     else
     {
     puts("Scrivi 1 nome");
     gets(elenco->nome);
     puts("Scrivi 1 cognome");
     gets(elenco->cognome);
     puts("Digita la matricola");
     scanf("%d", elenco->matricola);
     head=head->p;
     head->p=NULL;
     *n+=1;
     }
}
Mi fà leggere il cognome (non il nome), la matricola e poi crasha

Grazie 1000 per l'aiuto
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2007, 22:01   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
Ciao, devo fare questo esercizio, ma il programma mi crasha e non capisco dov'è l'errore, per ora sono alla parte statica.

Codice:
head=NULL;

....
head=head->p;
head->p=NULL;
La prima volta (inserimento del primo elemento) head vale NULL, quindi non puoi fare head->p. Inoltre 'p' cosa conterrebbe? Non si sa ...

La questione è tutta lì, c'è da fare un caso specifico per il primo inserimento.

Quote:
Originariamente inviato da k_mishima Guarda i messaggi
Codice:
Simulare i C la gestione di 1 pila (stack) tramite array (array di struct) statico
e dinamico [che differenza c'è?]
Una pila stack si può realizzare appunto in due modi:
- Tramite un array e in questo caso la lista di elementi non serve che sia "linkata" (cioè non c'è bisogno di un puntatore all'elemento seguente). Ci si basa solo su un indice che indica il 'top'.
- Tramite una lista linkata e in questo caso è necessario che ogni elemento abbia un puntatore al seguente. In genere in questi casi ogni elemento viene allocato in modo dinamico con malloc ecc...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2007, 22:36   #3
turibbio
Junior Member
 
Iscritto dal: Apr 2007
Messaggi: 9
CONCORDO!!

Vorrei inoltre farti notare che una pila è una struttura dati di tipo LIFO (last in- first out), il che significa che gli elementi vengono inseriti sempre in testa. Come hai implementato il codice non penso che l'elemento venga sempre messo in testa. Anzi mi pare che venga sempre aggiunto dopo, e non è il modo corretto per implementarlo!
Inoltre ti do un consiglio: inizializza la struct head nel main, e non in modo globale, perché poi la devi passare alla function di inserimento. Ma adesso cmq riguardando il codice mi sono accorto che c'è un errore di fondo. Tu stai forzando nella funzione di inserimento la creazione di una lista e non un array di struct. Quindi ancora una volta head = head -> p_next deve puntare ad un elemento di un array e non come hai fatto tu. Datti una riguardata al progetto e vedi bene quello che richiede, perché implementato così, a parte che da errore, ma non è neanche ciò che è stato richiesto!
La differenza tra statico e dinamico e' la seguente:
-statica: array di struct dichiarato in modo statico: array[MIOSIZE]
-dinamica: uso di un array dinamico, ovvero si modificano runtime il numero di componenti dell'array con l'uso dell'allocazione dinamica.

Ultima modifica di turibbio : 06-06-2007 alle 22:41.
turibbio è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 13:02   #4
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Innanzitutto grazie per le risposte
Quote:
Originariamente inviato da andbin
Una pila stack si può realizzare appunto in due modi:
- Tramite un array e in questo caso la lista di elementi non serve che sia "linkata" (cioè non c'è bisogno di un puntatore all'elemento seguente). Ci si basa solo su un indice che indica il 'top'.
Mi sa che hai ragione, l'esercizio chiede proprio questo, ora modifico il codice e lo posto.

Quote:
Originariamente inviato da andbin
- Tramite una lista linkata e in questo caso è necessario che ogni elemento abbia un puntatore al seguente. In genere in questi casi ogni elemento viene allocato in modo dinamico con malloc ecc...
Non mi richiede questo, ma cmq ha senso fare l'allocazione statica non ha senso vero? Perchè ho letto che tra i prossimi dovro' fare una pila linkata soltanto dinamica.

Quote:
Originariamente inviato da turibbio
La differenza tra statico e dinamico e' la seguente:
-statica: array di struct dichiarato in modo statico: array[MIOSIZE]
-dinamica: uso di un array dinamico, ovvero si modificano runtime il numero di componenti dell'array con l'uso dell'allocazione dinamica.
Tnx
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 15:00   #5
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Ho modificato cosi', mi da lo stesso problema di prima: non mi fa leggere il nome, ma solo cognome e matricola (tra l'altro è una lettura fittizia perchè nelle stampe mi da caratteri a casaccio).

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 10
struct pila
{
       char nome[30];
       char cognome[30];
       int matricola;
};



void InserisceTesta(struct pila elenco[], short *n);
void Elimina_pila(struct pila elenco[],short *n);
void CancellaTesta(struct pila elenco[],short *n);
void StampaTesta(struct pila elenco[], short *n);
void StampaPila(struct pila elenco[], short *n);
main()
{
      struct pila elenco[MAX_SIZE];
      short what,n_persone=0;

      while (1)
      {
        puts("\nScegli l'operazione:");
		puts("[1] Inserisci un elemento in testa");
		puts("[2] Cancella Pila");
		puts("[3] Stampa numero elementi nella pila");
		puts("[4] Elimina elemento in testa");
		puts("[5] Stampa testa");
		puts("[6] Stampa pila");
		puts("[7] Esci");
		printf("Inserisci Scelta: ");
		scanf("%hd", &what);   
            
        switch(what)
		{

		case 1: 
            InserisceTesta(elenco,&n_persone);			
			break;
		case 2:
           	Elimina_pila(elenco,&n_persone);			
			break;
		case 3:	
		     if (n_persone!=1)
            printf("\nCi sono %d elementi nella pila\n",n_persone);
			else
            puts("\nC'è 1 elemento nella pila");
			break;
		case 4:	
			CancellaTesta(elenco,&n_persone);
			break;
		case 5: StampaTesta(elenco,&n_persone);			
			break;
		case 6: StampaPila(elenco,&n_persone);
		    break;
		case 7:
            exit(0);
			break;

		default:
		puts("\nScelta sbagliata! Ripeti!\n\n");
		}        
      }
}

void InserisceTesta(struct pila elenco[], short *n)
{
     short i=(*n)-1;
     if (*n==MAX_SIZE)
     puts("Spazio finito");
     else
     {
     puts("Scrivi 1 nome");
     gets(elenco[i].nome);
     puts("Scrivi 1 cognome");
     gets(elenco[i].cognome);
     puts("Digita la matricola");
     scanf("%d", elenco[i].matricola);
     *n+=1;
     }
}

void Elimina_pila(struct pila elenco[],short *n)
{
     short i;
     if (n==NULL)
     puts("La pila non contiene nodi");
     else
     {
         for (i=0;i<(*n);i++)
         {
         elenco[i].nome==NULL;
         elenco[i].cognome==NULL;
         elenco[i].matricola=0;
         }
     }
     *n=0;
}

void CancellaTesta(struct pila elenco[],short *n)
{
     short i=(*n)-1;
     if (n==NULL)
     puts("La pila non contiene nodi");
     else
     {
         elenco[i].nome==NULL;
         elenco[i].cognome==NULL;
         elenco[i].matricola=0;
     }
     *n=i;
}

void StampaTesta(struct pila elenco[], short *n)
{
     short i=(*n)-1;
     if (i>=0)
     printf("\nStudente %s %s, matr. %d",elenco[i].nome, elenco[i].cognome, elenco[i].matricola);
	 else
     puts("\nNon ci sono persone nella pila");
}

void StampaPila(struct pila elenco[], short *n)
{
     short i;
     if (n=NULL)
     puts("La pila non conviene nodi");
     else
     {
         for (i=0;i<(*n);i++)
         printf("Studente %s %s, matr. %d",elenco[i].nome, elenco[i].cognome, elenco[i].matricola);
     }
}
C'è qualcosa che non va nella function della lettura credo, ma cosa?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 15:05   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Se mi permetti, ti consiglio di gestire la pila in modo un pochino diverso:
Codice:
struct elem_pila
{
    char nome[30];
    char cognome[30];
    int matricola;
};

struct pila
{
    struct elem_pila elementi[MAX_SIZE];
    int size;
};
Eviti di dover passare alle varie funzioni l'array e l'altro parametro e rendi il codice più semplice e pulito.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 16:31   #7
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Ho fatto come mi hai detto, pero' ho sbagliato qualcosa, ora crasha addirittura il prog alla prima lettura

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 10
struct elem_pila
{
       char nome[30];
       char cognome[30];
       int matricola;
};

struct pila
{
       struct elem_pila elenco[MAX_SIZE];
       int n;
}stack;


void InserisceTesta();
void Elimina_pila();
void Lunghezza();
void CancellaTesta();
void StampaTesta();
void StampaPila();
main()
{

      short what;

      while (1)
      {
        puts("\nScegli l'operazione:");
		puts("[1] Inserisci un elemento in testa");
		puts("[2] Cancella Pila");
		puts("[3] Stampa numero elementi nella pila");
		puts("[4] Elimina elemento in testa");
		puts("[5] Stampa testa");
		puts("[6] Stampa pila");
		puts("[7] Esci");
		printf("Inserisci Scelta: ");
		scanf("%hd", &what);   
            
        switch(what)
		{

		case 1: 
            InserisceTesta();			
			break;
		case 2:
           	Elimina_pila();			
			break;
		case 3:	
            Lunghezza();
			break;
		case 4:	
			CancellaTesta();
			break;
		case 5: StampaTesta();			
			break;
		case 6: StampaPila();
		    break;
		case 7:
            exit(0);
			break;

		default:
		puts("\nScelta sbagliata! Ripeti!\n\n");
		}        
      }
}

void InserisceTesta()
{
     short i=(stack.n)-1;
     if (stack.n==MAX_SIZE)
     puts("Spazio finito");
     else
     {
     puts("Scrivi 1 nome");
     gets(stack.elenco[i].nome);
     puts("Scrivi 1 cognome");
     gets(stack.elenco[i].cognome);
     puts("Digita la matricola");
     scanf("%d", stack.elenco[i].matricola);
     stack.n+=1;
     }
}

void Elimina_pila()
{
     short i;
     if (&stack.n==NULL)
     puts("\nLa pila non contiene nodi");
     else
     {
         for (i=0;i<(stack.n);i++)
         {
         stack.elenco[i].nome==NULL;
         stack.elenco[i].cognome==NULL;
         stack.elenco[i].matricola=0;
         }
     }
     stack.n=0;
}

void CancellaTesta()
{
     short i=(stack.n)-1;
     if (&stack.n==NULL)
     puts("\nLa pila non contiene nodi");
     else
     {
         stack.elenco[i].nome==NULL;
         stack.elenco[i].cognome==NULL;
         stack.elenco[i].matricola=0;
     }
     stack.n=i;
}

void StampaTesta()
{
     short i=(stack.n)-1;
     if (i>=0)
     printf("\nStudente %s %s, matr. %d",stack.elenco[i].nome, stack.elenco[i].cognome, stack.elenco[i].matricola);
	 else
     puts("\nNon ci sono persone nella pila");
}

void Lunghezza()
{
     if (stack.n!=1)
     printf("\nCi sono %d elementi nella pila\n",stack.n);
	 else
     puts("\nC'è 1 elemento nella pila");
}
     
void StampaPila()
{
     short i;
     if (&stack.n==NULL)
     puts("La pila non conviene nodi");
     else
     printf("Studente %s %s, matr. %d\n",stack.elenco[i].nome, stack.elenco[i].cognome, stack.elenco[i].matricola);
     {
         for (i=0;i<(stack.n);i++)
         printf("Studente %s %s, matr. %d\n",stack.elenco[i].nome, stack.elenco[i].cognome, stack.elenco[i].matricola);
     }
}
Potreste provarlo e vedere cosa non va'? Ci sto impazzendo.
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 16:42   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
Ho fatto come mi hai detto, pero' ho sbagliato qualcosa, ora crasha addirittura il prog alla prima lettura
Avendo definito 'stack' con la dichiarazione della struttura, stack è una variabile globale, pertanto inizializzata a zero, fin qui ok.

In InserisceTesta fai short i=(stack.n)-1;, all'inizio quindi i è -1 ...... vai un po' fuori dall'array!

Poi perché in StampaPila fai if (&stack.n==NULL)?? L'indirizzo di stack.n non può essere NULL!

Credo che debba rivedere bene un po' tutta la gestione della pila.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 17:29   #9
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
Iscritto dal: Sep 2005
Città: Opinions are like assholes: anybody has one...
Messaggi: 34290
e metti un controllino sul what (tipo un isnum)

lo switch non accetta altro che interi
__________________
Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 17:57   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Stev-O Guarda i messaggi
lo switch non accetta altro che interi
Secondo lo standard ANSI C, l'espressione nello switch può essere di tipo char, short, int o long
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 18:05   #11
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Quote:
Originariamente inviato da andbin

In InserisceTesta fai short i=(stack.n)-1;, all'inizio quindi i è -1 ...... vai un po' fuori dall'array!
ok ho tolto il meno 1, non serviva.

Quote:
Originariamente inviato da andbin
Poi perché in StampaPila fai if (&stack.n==NULL)?? L'indirizzo di stack.n non può essere NULL!
io veramente vorrei fare stack.n==NULL ma mi da errore, mi dice comperazione tra puntatore e un intero
Quote:
Originariamente inviato da andbin
Credo che debba rivedere bene un po' tutta la gestione della pila.
Il codice l'ho guardato molte volte ma ancora non ho capito perchè non funzioni la function sull'inserimento della testa, crasha pure togliendo il meno 1.
Sono troppo poco esperto, mi serve il vostro aiuto

Quote:
Originariamente inviato da Stev-O
e metti un controllino sul what (tipo un isnum)

lo switch non accetta altro che interi
Non ho capito cosa non và nello swich, cmq mi sembra l'ultimo dei miei problemi al momento lol

Ultima modifica di k_mishima : 07-06-2007 alle 18:05. Motivo: errori di scrittura
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 18:11   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
io veramente vorrei fare stack.n==NULL ma mi da errore, mi dice comperazione tra puntatore e un intero
'n' è un intero non un puntatore, no? È vero che NULL tecnicamente vale 0, però se si sta compilando in C e non C++ in genere il NULL è definito come ((void *)0), pertanto un puntatore.

Quindi puoi fare stack.n == 0
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2007, 18:24   #13
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Quote:
Originariamente inviato da andbin Guarda i messaggi
'n' è un intero non un puntatore, no? È vero che NULL tecnicamente vale 0, però se si sta compilando in C e non C++ in genere il NULL è definito come ((void *)0), pertanto un puntatore.

Quindi puoi fare stack.n == 0
ok, messo uguale 0 e non ho problemi.

Per il crash non sai dirmi che ho sbagliato?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2007, 12:31   #14
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
up
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2007, 23:45   #15
turibbio
Junior Member
 
Iscritto dal: Apr 2007
Messaggi: 9
Quote:
struct elem_pila
{
char nome[30];
char cognome[30];
int matricola;
};

struct pila
{
struct elem_pila elementi[MAX_SIZE];
int size;
};
K_mishima, questa è una ottima soluzione, ma non quella richiesta dall'esercizio.
Dovresti implementare la stack utilizzando qualcosa di questo tipo:

Quote:
//Singolo elemento
struct info{
char nome[10];
char cognome[10];
};
poi crei nel main un array di struct :

info pila[MAXSIZE];


Il controllo degli elementi massimi li fai con una variabile int cnt, che utilizzi incrementandola (push) e decrementadola (pop);

Puoi magari utilizzare cnt per mantenere la posizione dove inserire il prossimo elemento, posizionando così gli elementi nell'array in maniera sequenziale.
turibbio è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2007, 04:15   #16
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
io cosi' avevo fatto, poi ho cambiato su consiglio di andbin per fare il codice piu' elengante e evitare di passare ogni volta le stesse cose alle function, cmq guarda, mi è indifferente, vorrei piuttosto sapere perchè mi crasha sto cavolo di prog
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2007, 13:24   #17
turibbio
Junior Member
 
Iscritto dal: Apr 2007
Messaggi: 9
Ho provato il tuo codice e ti posso dire che ci sono un casino di errori e di incongruenze. Innanzitutto riprendendo il codice originale una cosa del tipo:


Quote:
stack.elenco[i].nome==NULL;
stack.elenco[i].cognome==NULL;
stack.elenco[i].matricola=0;
non va assolutamente bene. Non stai usando puntatori, stai usando array, quindi il NULL non va prorio bene. E poi hai fatto il più comune errore di programmazione in C: hai confuso '==' con '='. BE careful!
Se il tuo obiettivo è di inizializzare l'elemento a zero lo puoi fare in questo modo:

Quote:
stack.elenco[i].nome[0] = '\0';
stack.elenco[i].cognome[0] = '\0';
stack.elenco[i].matricola=0;
così facendo inizializzi la prima componente dell'array nome[0] a '\0', evitando di accedere alle altre componenti.

Nella funzione di inserimento ci sono due errori importanti:

Quote:
void InserisceTesta()
{
short i=(stack.n)-1;
if (stack.n==MAX_SIZE)
puts("Spazio finito");
else
{
puts("Scrivi 1 nome");
gets(stack.elenco[i].nome);
puts("Scrivi 1 cognome");
gets(stack.elenco[i].cognome);
puts("Digita la matricola");
scanf("%d", stack.elenco[i].matricola);
stack.n+=1;
}
}
Innanzitutto non ti usciva il nome perché devi utilizzare una chiamata del tipo
fflush(stdin); per pulire lo standard di input a cui è associato il programma, altrimenti la gets ti prende valori di tabulazione come il newline che non dovrebbe ricevere.

Quote:
puts("Scrivi 1 nome");
fflush(stdin);
gets(stack.elenco[i].nome);
puts("Scrivi 1 cognome");
fflush(stdin);
gets(stack.elenco[i].cognome);
puts("Digita la matricola");
scanf("%d", stack.elenco[i].matricola);
stack.n+=1;
Il secondo errore è connesso alla scanf. Se vedi la documentazione sulla scanf noterai che il parametro e' un indirizzo -> &mia_variabile.

Quote:
scanf("%d", stack.elenco[i].matricola);
Una istruzione di questo tipo invece non riceve l'indirizzo della variabile dove memorizzare il valore, pertanto va in crash perchè si verifica una unhandled exception (tenta di accedere a qualcosa a cui non può accedere). Stai attento perchè è un errore molto comune!

pertanto lo risolvi in questo modo:

Quote:
scanf("%d", &(stack.elenco[i].matricola));
utilizzando cioè l'operatore di riferimento.
turibbio è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2007, 13:55   #18
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
grazie 1000, pian piano stavo scoprendo tutti questi errori, mi mancava solo quello sulla scanf (&) che mi faceva ancora crashare

ammetto di essermela dimenticata
purtroppo il programma non mi dava errore

oggi lo faccio dinamicamente allora, se ho problemi posto
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2007, 15:19   #19
turibbio
Junior Member
 
Iscritto dal: Apr 2007
Messaggi: 9
Si infatti non ti segnala né errori né warnign in base al fatto che i compilatori non sono previsti per segnalarlo. In realtà è lo standard del C stesso che non dice nulla al riguardo. Pertanto è compito del programmatore fare attenzione a passare un indirizzo.
Quando fai la versione dinamica abbi presente che l'array deve essere di tipo dinamico e pertanto devi aumentare o diminuire il suo size a seconda dell'inserimento o dell'eliminazione.
turibbio è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2007, 15:23   #20
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
ecco, sono già nei guai. Voglio allocare dinamicamente la struct, ma come si fa?

Per ora ho scritto
Codice:
struct elem_pila
{
       char nome[30];
       char cognome[30];
       int matricola;
}*elenco;
Codice:
elenco=(struct elem_pila*)calloc((1,sizeof(struct elem_pila));
e mi dice syntax error before ';' token
k_mishima è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Lo compri una volta, lo giochi dove vuoi...
Qiantinuum annuncia Helios, "il com...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
TVS non è solo moto e scooter: ec...
Alexa+ arriva su BMW: gli automobilisti ...
Gemini Deep Research arriva su Google Fi...
Rinvii a catena, Marvel 1943: Rise of Hy...
Xiaomi inaugura uno spazio dedicato ai f...
Rilasciate le specifiche di Bluetooth 6....
L'obiettivo che mette tutto a fuoco: la ...
Meta avrebbe raccolto fino al 10% dei ri...
NVIDIA DGX Spark e videogiochi? Una pess...
Serie Oppo Reno15 confermata: arriva il ...
UPDF 2025: l'editor PDF che fa (quasi) t...
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: 04:27.


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