nene896 (Normal User)
Rookie
Messaggi: 21
Iscritto: 25/06/2009
|
Ciao a tutti...
sono alle prese con la sistemazione di un programma ma nn riesco a capire come far sparire 2 warning e 1 errore.
I warning sono di tipo:Suspicious pointer conversion in function main,
l'errore è :Type mismatch in redeclaration of function ordina.
mi spiego meglio nel main la funzione coi warning deve caricare una lista semplice in 2 vettori dinamici;
nella ordina ho fatto un pò di pasticci per modificare menopossibile il resto del programma.
Praticamente ho copiato in 2vettori d'appoggio i vettori dinamici del main e li ho ordinati.
Poi sempre in questa funzione dovevo controllare se gli elementi della lista sono compresi in quelli ordinati.. secondo voi è salvabile???
posto il codice qui sotto:
1) il main
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #define MAX 25 typedef enum {FALSE,TRUE}boolean; typedef struct coord { float x[2];/*coordinate x e y di 2 punti di 1 rettangolo*/ float y[2]; struct coord *prox; }punto; FILE *pfile; void inserisci_coord(punto **pttesta,int *numpt); void carica_in_vett(punto **pttesta,int numpt,float *vettorex, float *vettorey); void ordina__vett(float vettorex[],float vettorey[],int numpt,punto **pttesta); float calcola_area(float vettorex[],float vettorey[],int numpt); int main() { int numeropt; punto *punt_testa; float *vettx, *vetty; float area; punt_testa=NULL; inserisci_coord(&punt_testa,&numeropt); carica_in_vett(&punt_testa,numeropt,&vettx,&vetty); ordina_vett(&vettx,&vetty,numeropt,&punt_testa); area=calcola_area(vettx,vetty,numeropt); printf("L'area totale è %f",area); }
|
2)La carica dove ci sono i 2 warning:
Codice sorgente - presumibilmente C++ |
void carica_in_vett(punto**pttesta,int numpt,float*vettorex,float *vettorey) { punto* ptcorr; int indice; ptcorr= *pttesta; vettorex=(float*)malloc((numpt/2)*(sizeof(float))); vettorey=(float*)malloc((numpt/2)*(sizeof(float))); for(indice=0;indice<(numpt/2);indice++) { vettorex[indice]=(*ptcorr).x[0]; vettorey[indice]=(*ptcorr).y[0]; vettorex[indice+1]=(*ptcorr).x[1]; vettorey[indice+1]=(*ptcorr).y[1]; ptcorr=(*ptcorr).prox; } return; }
|
3)la ordina dove mi segnala l'errore:
Codice sorgente - presumibilmente Java |
void ordina_vett(float vettorex[],float vettorey[],int numpt,punto **ptesta) { int indice,ind; boolean ordinato1,ordinato2; punto *ptcorr; float appoggiox[MAX],appoggioy[MAX],provv; ptcorr=*ptesta; for(indice=0;indice<numpt;indice++) { appoggiox[indice]=vettorex[indice]; appoggioy[indice]=vettorey[indice]; } ordinato1=ordinato2=FALSE; while((!ordinato1)&&(!ordinato2)) { ordinato1=ordinato2=TRUE; for(indice=0;indice<(numpt);indice++) { if( appoggiox[indice]>appoggiox[indice+1]) {provv=appoggiox[indice]; appoggiox[indice]=appoggiox[indice+1]; appoggiox[indice+1]=provv; ordinato1=FALSE; } if(appoggioy[indice]> appoggioy[indice+1]) {provv=appoggioy[indice]; appoggioy[indice]=appoggioy[indice+1]; appoggioy[indice+1]=provv; ordinato2=FALSE; } } ind=1; for(indice=0;indice<(numpt);indice++) { while(ptcorr!=NULL) { if(((*ptcorr).x[0]<appoggiox[indice])&&((*ptcorr).x[1]>appoggiox[indice+1]) &&((*ptcorr).y[0]<appoggioy[indice])&&((*ptcorr).y[1]>appoggioy[indice+1])) { vettorex[indice]=(*ptcorr).x[0]; vettorex[indice+ind]=(*ptcorr).x[1]; vettorey[indice]=(*ptcorr).y[0]; vettorey[indice+ind]=(*ptcorr).y[1]; ind++; } else ptcorr=(*ptcorr).prox; } } return; }
|
GRAZIE A CHIUNQUE RISPONDERA? |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da nene896:
Ciao a tutti...
sono alle prese con la sistemazione di un programma ma nn riesco a capire come far sparire 2 warning e 1 errore.
I warning sono di tipo:Suspicious pointer conversion in function main,
l'errore è :Type mismatch in redeclaration of function ordina.
[...]
Riguardo all'errore, e' probabile che sia dovuto al fatto che tu hai dichiarato un tipo
Codice sorgente - presumibilmente C++ |
typedef enum {false,true}boolean; // false e true tutto minuscolo
|
poi pero' quando lo usi
Codice sorgente - presumibilmente C/C++ |
boolean ordinato1,ordinato2;
[...]
ordinato1=ordinato2=FALSE; // FALSE tutto maiuscolo
[...]
ordinato1=ordinato2=TRUE; // TRUE tutto maiuscolo
|
probabilmente riconosce FALSE ( dichiarato chissa' dove ) ma e' diverso da false, da qui' l'errore di tipo.
Per i Warning non so...
Ciao.
LUigi |
|
nene896 (Normal User)
Rookie
Messaggi: 21
Iscritto: 25/06/2009
|
in realta quando ho inserito il codice ha formattato in minuscolo.. mentre nel programma è tutto maiuscolo...Ci deve essere altro..
ho provato a compilare su dev-c e li invece sostiene che (non so in quale vita ) avrei dichiarato"implicitamente la ordina_vett di tipo int.
ma il prototipo èdi tipo void , nel main la chiamo solo e non l'assegno a nulla, e infina la funzione vera e propria è di tipo void...
ho anche provato ad allocare dinamicamente i vettori d'appoggio..ma gli errori restano gli stessi...
secondo te i passaggi di parametri alle funzioni che allocano dinamicamente sono giusti?
ps. hai visto questa volta i codici li ho messi come si deve!!
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Scusa una curiosita', ma ho visto bene o nel prototipo di ordina_vett ci sono due underscore?
Inoltre sei sicuro che non ci sia un'altra ordina_vett di tipo int dichiarata altrove? ( magari non da te, in uno dei file inclusi )
|
|
nene896 (Normal User)
Rookie
Messaggi: 21
Iscritto: 25/06/2009
|
Avevi ragione erano sul serio i due underscore Ma si può???
gira anche con i warning nella carica e nei vettori c'è quello che dovrebbe esserci!!!
fin qui tutto bene..
però...nella ordina ho trovato un baco(o meglio nn fa quello k voglio )
non mi assegna gli elementi del vettore (vettorex e vettorey) ai vettori di appoggio.
sia nel caso in cui sovradimensiono i appoggiox si se gli alloco dinamicamente
Praticamente in vettorex e vettorey ci sono i valori giusti..ma in appoggio ci sn valori strani(nn so forse di default perkè nn mi sembrano indirizzi)
Codice sorgente - presumibilmente Java |
void ordina_vett(float vettorex[],float vettorey[],int numpt,punto **ptesta) { int indice,ind; boolean ordinato1,ordinato2; punto *ptcorr; float *appoggiox,*appoggioy,provv; ptcorr=*ptesta; appoggiox=(float*)malloc((numpt/2)*sizeof(float)); appoggioy=(float*)malloc((numpt/2)*sizeof(float)); for(indice=0;indice<numpt;indice++) { appoggiox[indice]=vettorex[indice]; appoggioy[indice]=vettorey[indice]; }
|
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Salve, stavo ricontrollando il codice di ordina_vett, ma facendo il conto delle parentesi Graffe mi sembra che la { siano una in piu' delle }, controlla, una cosa del genere potrebbe provocare effetti imprevedibili.
|
|
nene896 (Normal User)
Rookie
Messaggi: 21
Iscritto: 25/06/2009
|
Il problema non è la parentesi... perchè non ho postato tutta la funzione...
cmq ho scoperto che nel vettorex che passo dal main ci sono solo zeri e non i valori caricati... Idee ???
se ne accettano di tutti i tipi
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Perchè non hai assegnato l'indirizzo dei valori.
ps. Quando ci sono i warnings o errori, dicci ancora più preciso in quale riga.
Ultima modifica effettuata da Lawliet il 01/07/2009 alle 14:53 |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da nene896:
Il problema non è la parentesi... perchè non ho postato tutta la funzione...
cmq ho scoperto che nel vettorex che passo dal main ci sono solo zeri e non i valori caricati... Idee ???
se ne accettano di tutti i tipi |
Vedi bene... perche' mi riferivo al primo codice di ordina_vett che hai postato. |
|