PDA

View Full Version : [c]Problema con programma in c con strutture


Gogeta ss4
15-09-2004, 19:02
Ecco il codice:



#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct prodotto //Struttura del prodotto
{
char nome_prodotto[50];
char descrizione_prodotto[1000];
int quantita_vendute;
int prezzo_vendita;
int prezzo_acquisto;
int guadagno_struttura;
};

struct guadagno_totale //Struttura che conta il guadagno totale
{
float guadagno_tot;
};

typedef struct guadagno_totale tot;

typedef struct prodotto articolo; /*Ridefinizione di struct prodotto in
articolo*/

//Prototipi di funzione

int insert (articolo [],int); //Funzione che carica i dati in struttura.
float guadagno (articolo [],int,tot); //Funzione che calcola il guadagno.

void main()
{
int scelta,controllo,totale,x;
articolo vettore[1000];
tot total;
do
{
printf("\n MENU' PRINCIPALE");
printf("\n 1)Inserisci Prodotto");
printf("\n 2)Controlla Il Guadagno Totale Della Giornata");
printf("\n 0)Uscita dal programma");
printf("\n Scelta: ");
scanf ("%d", &scelta);
switch(scelta)
{
case 1: controllo=insert(vettore,x);
break;
case 2: totale=guadagno(vettore,controllo,total);
printf("\nFinora hai guadagnato %d Euro", controllo);
break;
case 0: exit(EXIT_SUCCESS);
default: printf("\nOpzione non valida!");
}
} while(scelta!=0);
}

//DEFINIZIONE DELLE FUNZIONI

int insert(articolo vettore[],int x)
{
int i;
printf("\nQuanti Prodotti hai venduto?(MAX 1000): ");
scanf ("%d", &x);
for(i=0;i<x;i++)
{
printf("\nInserisci il nome del prodotto venduto (MAX 50 PAROLE): ");
fflush(stdin);
gets (vettore[i].nome_prodotto);
printf("\nDescrivi Il Prodotto (MAX 1000 PAROLE): ");
fflush(stdin);
gets (vettore[i].descrizione_prodotto);
printf("\nQuanti prodotti hai venduto?: ");
scanf ("%d", &vettore[i].quantita_vendute);
printf("\nInserisci il prezzo di acquisto del prodotto: ");
scanf ("%d", &vettore[i].prezzo_acquisto);
printf("\nA quanto hai venduto il prodotto?: ");
scanf ("%d", &vettore[i].prezzo_vendita);
}
return x;
}

float guadagno (articolo vettore[],int controllo,tot total)
{
int prezzo_vend,prezzo_acqu,quantita_vend,i,totale;
for(i=0;i<controllo;i++)
{
prezzo_vend=vettore[i].prezzo_vendita;
prezzo_acqu=vettore[i].prezzo_acquisto;
quantita_vend=vettore[i].quantita_vendute;
totale=(prezzo_vend-prezzo_acqu)*quantita_vend;
vettore[i].guadagno_struttura=totale;
}
for(i=0;i<controllo;i++)
total.guadagno_tot=total.guadagno_tot+vettore[i].guadagno_struttura;
return total.guadagno_tot;
}



Appena avvio il programma al VOID MAIN () (neanche entra nel corspo del programma), mi da un errore e mi dice:

"Thread stopped: c:\Document ad settings\games\desktop\struct.exe Fault: access violition 0x40108b: write of address 0x30f88"

Ma che è??

RaouL_BennetH
15-09-2004, 19:13
Posso chiederti che compilatore stai usando? perchè se non erro <conio.h> non è una funzione standard.

Potrebbe essere? :confused:

Poi, un'altra cosa ma che non è chiara a me, anche perchè pure io sono proprio agli inizi, ma nella tua struttura "prodotto", l'istanziazione dov'è?

Gogeta ss4
15-09-2004, 19:23
borland c++
Nella struttura al posto di 500 al posto di 1000, e funzia come mai??
Non riesce ad allocare lo spazio necessario??

Maverick82^
16-09-2004, 15:47
la struttura prodotto occupa un ampio intervallo di memoria. Nel main dichiari una array di 1000 prodotti e sommato allo spazio che viene dedicato a ogni prodotto sicuramente si avrà un violazione di accesso in memoria. Qui scatta il meccanismo di protezione degli spazi di indirizzi di memoria messo a disposizione dal sistema operativo. Cmq dipende anche dal compilatore. Prova a dichiarare un array di 50 elementi e vedrai che riuscirai ad allocare la struttura anche con escrizione_prodotto da 1000 elementi.

cionci
16-09-2004, 16:19
Usa una lista ;)
Non funziona perchè esauisce lo stack...