Void in linux

di il
11 risposte

Void in linux

Ciao ragazzi ! ma linux ha qualche problema col void ? perche ho creato una struttura che gestisce degli atleti e li volevo stampare tutti facendo cosi
void stampa_atleti(lista list){
    int i;
    printf("STAMPA TUTTO\n");
    for(i=0;i<list.n_atleta;i++){
        printf("ATLETA %d",i+1);
        printf("nome: %s ",list.elemento[i].nome);
        printf("altezza: %f ",list.elemento[i].altezza);
        printf("distanza percorsa: %f ",list.elemento[i].distanza_percorsa);
        printf("\n");
    
}
}
ma al momento di compilazione spuntano un sacco di cose messe assieme e alla fine dice errore ecc ecc cosa che in windows non mi fa

11 Risposte

  • Re: Void in linux

    Peppus ha scritto:


    ....al momento di compilazione spuntano un sacco di cose messe assieme e alla fine dice errore ecc ecc


    Forse sarebbe opportuno che tu fornissi almeno queste informazioni imprescindibili:

    1) l'intero messaggio (o i messaggi se più di uno) di errore che viene sollevato;
    3) la parte di codice alla quale si riferisce l'errore.
  • Re: Void in linux

    Chiedo scusa, sicuramente sono OT, ma dato il titolo del thread volevo dare alcuni spunti costruttivi al nostro amico Peppus, visto che mi sembra stia incontrando tantissime difficoltà.

    Di sicuro rimangono valide le richieste di vuott, ma suggerisco a Peppus:

    1) Prima di tutto devi capire la differenza fra sistema operativo (Linux) e compilatore (gcc) in quanto "void in linux" o "ma linux ha qualche problema col void?" sono frasi che denotano una gran confusione, e non aiutano certo nella soluzione del problema. Qui il sistema operativo non c'entra niente.

    2) Sempre senza offesa, bisognerebbe fare un piccolo bagno di umiltà: è più probabile che gcc abbia un problema con void (non impossibile ma improbabile) oppure è più facile che tu abbia commesso un errore di sintassi? Considerando poi che gcc forse è più anziano di te? I programmatori sono persone umili e prima di accusare qualcuno verificano in maniera maniacale di non aver commesso errori.

    3) I compilatori C non sono famosi per la chiarezza delle segnalazioni di errore: di fronte a numerosi errori la tecnica è di partire dal primo, capirlo e risolverlo, quindi ricompilare; spesso un errore (esempio un ; dimenticato) genera inutilmente tonnellate di errori successivi.

    Buon lavoro e buono studio
  • Re: Void in linux

    Mi dispiace, non volevo assolutamente accusare nessuno ! Non era neanche lontanamente mia intenzione accusare i programmatori di Linux né tanto meno sottovalutare la complessità del gcc .
    È un mondo che sto iniziando a conoscere adesso. Come avete notato bene ho molte mancanze che spero di colmare al più presto. Probabilmente... anzi.. Sicuramente .. mi sono espresso in mal modo. Volevo solo capire perché non funzionava il codice . Pur avendo controllato e riscritto il codice di sana pianta continua a darmi un errore che non riesco a risolvere.

    Mi sono iscritto nel forum sperando di trovare persone di gran lunga più preparate di me che potessero darmi delle dritte ! È così è stato. Ho risolto un bel po di dubbi in merito a qualche argomento.

    Scusate ancora se quello che ho scritto ha urtato molti di voi.
  • Re: Void in linux

    Scusate ancora se quello che ho scritto ha urtato molti di voi.
    Tranquillo, non hai urtato nessuno! Volevo solo darti qualche spunto per migliorare: perchè oggi posti su un forum ma magari in futuro avrai a che fare con colleghi o clienti.
    Ora, tornando al problema corrente: prova a postare i primi errori che ti da il compilatore, indicaci le righe a cui fanno riferimento questi errori e posta eventuali strutture dati (ad esempio lista).
  • Re: Void in linux

    Condivido quanto scritto sin qui da candaluar, e sono anche convinto che se Peppus darà un attento sguardo al suo codice, potrà trovare e risolvere da sé gli errori sollevati.
  • Re: Void in linux

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define max 1000
    
    typedef struct{
        char nome[30];
        float altezza;
        float distanza_percorsa;
    }atleta;
    
    typedef struct {
        atleta elemento[max];
        int n_atleti;
    
    }lista;
    
    int menu();
    lista inserimento_atleta();
    
    void stampadati(lista list);
    
    int main(){
        lista L;
        int scelta;
        while(scelta=menu()){
            switch(scelta){
                case 1:
                     system("clear");
                     L=inserimento_atleta();
                     printf("premi un tasto per continuare...");
                     getchar();
                     break;
                case 2:
                     system("clear");
                     stampadati(L);
                     printf("premi un tasto per continuare...");
                     getchar();
                     break;
                case 3:
                     system("clear");
    
                     printf("premi un tasto per continuare...");
                     getchar();
                     break;
                case 4:
                     system("clear");
                     printf("premi un tasto per continuare...");
                     getchar();
                     break;
                case 5:
                     return 0;
    
            }
    
    
        }
    
    
    }
    
    int menu(){
    
        int scelta;
        printf("[1] inserisci atleta\n");
         printf("[2] stampa atleti\n");
          printf("[3] salva su file\n");
           printf("[4] stampa atleta col altezza massima\n");
            printf("[5]esci\n");
            printf("inserisci scelta : ");
            scanf("%d",&scelta);
            while(scelta<1 || scelta>5){
                printf("scelta errata ");
                return scelta;
            }
            return scelta;
    
    }
    
    lista inserimento_atleta(){
        lista list;
        int i;
        printf("quanti atleti vuoi inserire?");
        scanf("%d",&list.n_atleti);
        getchar();
        for(i=0;i<list.n_atleti;i++){
            printf("nome:");
            fgets(list.elemento[i].nome,30,stdin);
            printf("altezza:");
            scanf("%f",&list.elemento[i].altezza);
            printf("distanza percorsa:");
            scanf("%f",&list.elemento[i].distanza_percorsa);
            getchar();
    
    
        }
        return list;
    
    }
    
    stampadati(lista list){
    
        int i;
        for(i=0;i<list.n_atleti;i++){
            printf("nome: %s\n",list.elemento[i].nome);
            printf("altezza: %f\n",list.elemento[i].altezza);
            printf("distanza percorsa: %f\n",list.elemento[i].distanza_percorsa);
    
    
    
    
    
        }
    
    
    }
    
    il codice e' questo; e l'errore e' questo sul compilatore in linux ---
    bash-4.3$ gcc ciao.c
    ciao.c:101:1: warning: return type defaults to 'int' [-Wimplicit-int]
    stampadati(lista list){
    ^
    ciao.c:101:1: warning: conflicting types for 'stampadati'
    ciao.c:21:6: note: previous declaration of 'stampadati' was here
    void stampadati(lista list);
    ^

    problema che non ho se compilo con codeblock in windows.
  • Re: Void in linux

    Compilando il tuo intero codice in Terminale con questa riga:
    ~ $ gcc -o /tmp/Peppus /tmp/Peppus.c

    ottengo questo errore:
    /tmp/Peppus.c:101:1: warning: conflicting types for ‘stampadati’ [enabled by default]
    stampadati(lista list){
    ^
    /tmp/Peppus.c:21:6: note: previous declaration of ‘stampadati’ was here
    void stampadati(lista list);
    .......^


    Mi basta aggiungere la parola void, anteponendola, alla funzione stampadati(lista list), cioè così:
    void stampadati(lista list){
    
        int i;
        ......
        .....etc
    ed in compilazione non ottengo più alcun errore.
  • Re: Void in linux

    il codice e' questo; e l'errore e' questo sul compilatore in linux ---
    bash-4.3$ gcc ciao.c
    ciao.c:101:1: warning: return type defaults to 'int' [-Wimplicit-int]
    stampadati(lista list){
    ^
    ciao.c:101:1: warning: conflicting types for 'stampadati'
    ciao.c:21:6: note: previous declaration of 'stampadati' was here
    void stampadati(lista list);
    ^

    problema che non ho se compilo con codeblock in windows.
    Come vedi il compilatore ti segnala correttamente l'errore:

    a) ti dice che hai scritto una funzione senza specificare il valore di ritorno e che lui in questo caso considera sia int
    ciao.c:101:1: warning: return type defaults to 'int' [-Wimplicit-int]

    b) ti segnala che c'è un conflitto nel valore di ritorno di stampadati(), alla riga 101
    ciao.c:101:1: warning: conflicting types for 'stampadati'

    c) ti indica dove c'è la precedente dichiarazione con cui si genera il conflitto, alla riga 21
    ciao.c:21:6: note: previous declaration of 'stampadati' was here
    void stampadati(lista list);

    Il fatto che con codeblocks (il compilatore forse è mingw) non ti dia problemi non vuol dire che con un altro compilatore non ti possa segnalare dei warning o anche degli errori.

    Infine un'ultima nota: per passare una struttura ad una funzione di norma si passa attraverso un puntatore alla struttura, anche se poi i dati non verranno modificati (come nel tuo caso); in questo modo limiti l'utilizzo dello stack perchè nella chiamata alla funzione non viene copiata tutta la struttura sullo stack ma solo il puntatore.
    Quindi prova a riscrivere la funzione stampadati() con questo prototipo:
    void stampadati(lista *list);

    Buon lavoro e buono studio
  • Re: Void in linux

    Che sbadato grazie!
  • Re: Void in linux

    Sbadato, può essere ma devi leggere i messaggi d' errore ...
  • Re: Void in linux

    Sono sicuro che se in C::B su Windows apri le proprietà del progetto e attivi i flags -Wall e -Wextras ti appariranno innumerevoli errori anche li
Devi accedere o registrarti per scrivere nel forum
11 risposte