...is not a type. Help

di il
16 risposte

...is not a type. Help

Ciao a tutti ragazzi, stavo buttando giu un programma in c che utilizza strutture,questo dovrebbe consentire l'inserimento di un tot di rilievi altimetrici(Latitudine,longitudine,altitudine),modificare un dato selezionato ed eliminarne uno selezionato,a piacere dell'utente. Fino all'inserimento ci siamo,ma la modifica mi risulta abbastanza difficile,premetto che non ho ancora ben compreso i puntatori: vi allego il codice cosi potete dare un occhiata, in sede di compilazione mi dice : "A is not a type" e teoricamente sarebbe come dire che A,non è definito come variabile,giusto? ah,la funzione Elimina ancora non è stata stritta... Grazie mille in anticipo

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

typedef struct{
int lat;
int lon;
int alt;
} rilievi;

typedef struct{
rilievi arch [100];
int numrilievi;
} archiviorilievi;

typedef rilievi* archiviorilieviPtr[100];

archiviorilievi inserisci(int num);
archiviorilievi modifica(int num,archiviorilievi A);
archiviorilievi elimina();

int main(){

archiviorilievi A;
int num;
int contatore;
int i;

printf("Numero rilievi:\n");
scanf("%d",&num);

inserisci(num);
modifica(num,A);

system("pause");
}

archiviorilievi inserisci(int num){

int i;
int contatore;
archiviorilievi A;


contatore=1;
for(i=0; i<num; i++){

printf("\n\nRilievo numero: %d\n\n",contatore);

printf("\n\nLatitudine: ");
scanf("%d",&A.arch.lat);

printf("Longitudine: ");
scanf("%d",&A.arch.lon);

printf("Altitudine: ");
scanf("%d",&A.arch.alt);
contatore++;
}
printf("\n\nDati salvati!\n");
}

archiviorilievi modifica(int num,archiviorilievi A){

int x,y,i,j;
archiviorilieviPtr z[j];

printf("Scegli il rilievo su cui modificare L'ALTITUDINE\n");
printf("LATITUDINE: ");
scanf("%d",&x);
printf("LONGITUDINE ");
scanf("%d",&y);

for(i=0;i<num;i++){
if(A.arch.lat == x && A.arch.lon == y){
printf("Inserisci la nuova altitudine:\n");
scanf("%d",&z[j]);
}
else{printf("Errore");
}
z[j]->A.arch.alt;
}

}

16 Risposte

  • Re: ...is not a type. Help

    Umbe ha scritto:


    mi dice : "A is not a type" e teoricamente sarebbe come dire che A,non è definito come variabile,giusto?
    No, vuol proprio dire che A non è un tipo, come può esserlo int, char, float, ecc.
    Quindi vuol dire che cerchi di scrivere qualcosa come
    
    A var_name;
    
    ma A non definisce un tipo.

    Comunque l'errore che vedo io è diverso, e precisamente
    
    main.c:83:13: error: request for member ‘A’ in something not a structure or union
             z[j]->A.arch[i].alt;
    
    Perché utilizzi l'operatore freccia (i.e. ->)? Cosa vorresti fare?
  • Re: ...is not a type. Help

    Io vedo che la reference A punta ad una struct, invece il puntatore z[j] ne punta un'altra. z[j] punta la struct rilievi, invece A è una reference di ArchivioRilievi.
    Dovresti mettere A.arch.alt; se ho capito quello che vuoi fare
  • Re: ...is not a type. Help

    minomic ha scritto:


    Umbe ha scritto:


    mi dice : "A is not a type" e teoricamente sarebbe come dire che A,non è definito come variabile,giusto?
    No, vuol proprio dire che A non è un tipo, come può esserlo int, char, float, ecc.
    Quindi vuol dire che cerchi di scrivere qualcosa come
    
    A var_name;
    
    ma A non definisce un tipo.

    Comunque l'errore che vedo io è diverso, e precisamente
    
    main.c:83:13: error: request for member ‘A’ in something not a structure or union
             z[j]->A.arch[i].alt;
    
    Perché utilizzi l'operatore freccia (i.e. ->)? Cosa vorresti fare?
    Con z [j]-> A.arch.alt ,in teoria,molto in teoria per come sembra,intendo memorizzare il nuovo valore di altitudine,salvato in z [j], nell ' indirizzo A.arch .alt. Non ci ho capito moltissimo in verità. Aiutatemi a capire

    Inviato dal mio SM-G530FZ utilizzando Tapatalk
  • Re: ...is not a type. Help

    Ercules76 ha scritto:


    Io vedo che la reference A punta ad una struct, invece il puntatore z[j] ne punta un'altra. z[j] punta la struct rilievi, invece A è una reference di ArchivioRilievi.
    Dovresti mettere A.arch.alt; se ho capito quello che vuoi fare

    Io intendo semplicemente sostituire il valore di z [j] in alt...ma non capisco come indicare l' indirizzo della struct in cui inserirlo... tecnicamente A.arch .alt vuol.dire che il valore salvato in A sara' inserita nel vettore arch e come dato alt,dico male?

    Inviato dal mio SM-G530FZ utilizzando Tapatalk
  • Re: ...is not a type. Help

    Quel typedef sul puntatore non so perché lo hai fatto e se ti serve, non lo capisco.

    Io creerei direttamente il puntatore alla struct, quindi:

    rilievi* z[j];
    in modo che puoi leggere/inserire i dati nella reference, quindi un z[j]->(dato che ti serve)

    Poi se devi copiare il dato di A in z[j] fai questo:

    z[j]->alt = A.arch.alt; // Copia il dato della variabile alt della struct A in alt della struct z[j]

    Vedi se fa quello che volevi fare.

    Altra cosa, qui dichiari la variabile con un tipo di ritorno
    archiviorilievi inserisci(int num)

    devi mettere un return di archiviorilievi, altrimenti la dichiari void
    void inserisci(int num)

    Stessa cosa per la funzione modifica. Mettila void se non ritorni nulla
  • Re: ...is not a type. Help

    Scusate l'assenza.. Ho modificato il codice della funzione modifica : gira,ma non funziona esattamente,ovvero arrivato al IF non paragona x e y con i due dati di .lat e .lon. quindi salata direttamente al ElSE e poi stampa il risultato finale. ecco il codice:

    void modifica(int num,archiviorilievi A){

    int i,j,x,y;
    rilievi* z[j];
    printf("Scegli LATITUDINE E LONGITUDINE di cui modificare L'ALTITUDINE\n");
    scanf("%d""%d",&x,&y);
    for(i=0;i<num;i++){
    if(A.arch.lat==x && A.arch.lon==y){
    printf("Inserisci nuova altitudine\n");
    scanf("%d",&A);
    z[j]->alt;
    z[j]->alt= A.arch.alt;
    }
    else{ printf("No");
    }
    printf("Nuovi Dati:\n Latitudine:%d\nLongitudine:%d\n Altitudine:%d\n", &A.arch.lon, &A.arch.lat, &A.arch.alt);
    }
    }


    Tra l'altro,nell'ultima istruzione non stampa i dati che inserisco ma numeri a caso. Quali sono le n cose che ho sbagliato?
  • Re: ...is not a type. Help

    Questa linea

    z[j]->alt;

    è inutile, non fa nulla.

    Nell'ultima printf perché utilizzi & nei parametri ?
  • Re: ...is not a type. Help

    Giusto,ma comunque resta il problema che il ciclo if non funziona,salta le istruzioni e giunge direttamente al else..
  • Re: ...is not a type. Help

    La if non è un ciclo. E' un controllo e non viene saltato. Se viene eseguita la else è perché la if viene eseguita e risulta falsa.

    Quindi devi controllare i valori che confronti e cercare di capire perché non sono come ti aspetti. Visualizzali prima della if e ragiona sui valori che ottieni.
  • Re: ...is not a type. Help

    I valori che confronto sono x e y ovvero le coordinate che nella struct ho gia introdotto ma che a questo punto io registro in queste due nuove variabili per far si che si possano confrontare con A.arch.lat e A.arch.lon ovvero gli indirizzi in cui sono salvate le coordinate da modificare,se questi(x e y) sono uguali ai valori in cui sono salvati le coordinate messe nella struct rilievi,parte la funzione di modifica

    if(A.arch.lat==x && A.arch.lon==y)...

    ...

    else...

    ma credo di aver sbagliato nel collegamento dei valori a questo punto...
  • Re: ...is not a type. Help

    Ti avevo suggerito di utilizzare una printf prima della if per visualizzare i valori delle variabili coinvolte ma non l'hai fatto ...
  • Re: ...is not a type. Help

    Vedo solo che in fin dei conti il compilatore,giudica diversi i valori confrontati anche se sono uguali,forse perche non sa quali siano esattamente i valori da andare a pescare nella struct?

    void modifica(int num,archiviorilievi A){

    int i,x,y;
    rilievi* z;
    printf("\n\nScegli le coordinate X-Y di cui modificare L'ALTITUDINE\n");
    printf("\nLatitudine: ");
    scanf("%d",&x);
    printf("\nLongitudine:");
    scanf("%d",&y);
    printf("Coordinate x e y di cui cambiare l'altezza [%d][%d] ",x,y);
    for(i=0;i<num;i++){
    if(x==A.arch.lat && y==A.arch.lon){
    printf("Inserisci nuova altitudine di queste coordinate\n");
    scanf("%d",&z);
    z->alt= A.arch.alt;
    printf("Nuovi Dati:\n Latitudine:%d\nLongitudine:%d\n Altitudine:%d \n", A.arch.lon, A.arch.lat, A.arch.alt);

    }
    else{ printf("\n Errore\n");
    }

    }
    }
  • Re: ...is not a type. Help

    Umbe ha scritto:


    Vedo solo che in fin dei conti il compilatore,giudica diversi i valori confrontati anche se sono uguali,forse perche non sa quali siano esattamente i valori da andare a pescare nella struct?
    Ma che dici, scusa? Quelli che deve confrontare glieli dici tu, se non sono quelli da confrontare il compilatore che ne sa?

    Dovevi inserire i valori nella printf prima della if ... così

    for(i=0;i<num;i++){
    printf("x %d lat %d y %d lon %d\n",x,A.arch.lat,y,A.arch.lon);
    if(x==A.arch.lat && y==A.arch.lon){

    e vedere che risultati hai
  • Re: ...is not a type. Help

    Scusa l'ignoranza prima di tutto, i risultati comunque sono che stampa il valore x e .lat e y e .lon rispettivamente, il fatto è che .lat e . lon risultano 0..
Devi accedere o registrarti per scrivere nel forum
16 risposte