Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-12-2005, 21:09   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
[C] Non riesco a capire alcune cose sulle code

Scusate ma non riesco proprio a capire questo codice sulle code.
Allora il codice seguente l'ha scritto il mio prof di programmazione.

Codice:
struct cella
{
    int valore;
    struct cella *next;
};

struct wrapperCoda
{
    struct cella *ptrTesta;
    struct cella *ptrCoda;
};

int creaElemento(struct wrapperCoda *c, int num);
void stampaCoda(struct wrapperCoda c);
int cercaInCoda(struct wrapperCoda c, int numero);
int eliminaElemento(struct wrapperCoda *c, int num);
void resetCoda(struct wrapperCoda *c);

int main()
{
    struct wrapperCoda coda ;
    coda.ptrTesta = NULL;
    coda.ptrCoda = NULL;
}

void resetCoda(struct wrapperCoda *c)
{
    struct cella *temp;
    
    while ((*c).ptrCoda != NULL)
    {
        temp = (*c).ptrCoda;
        (*c).ptrCoda = (*c).ptrCoda->next;
        free(temp);
    }
    c->ptrTesta = NULL;    
}

/*
restituisce 1 se l'elemento è stato eliminato, 0 altrimenti
*/
int eliminaElemento(struct wrapperCoda *c, int num)
{
    struct cella *prec, *temp;
    
    temp = (*c).ptrCoda;
    prec = NULL;
    
    while (temp != NULL)
    {
        if (temp->valore == num)
        {
            if (prec == NULL)
                (*c).ptrCoda = (*c).ptrCoda->next;
            else
            {
                prec->next = temp->next;
                if (prec->next == NULL)
                    (*c).ptrTesta = prec;
            }    
            free(temp);
            return 1;
        }
        prec = temp;
        temp = temp->next;
    } 
    
    return 0;
}

/*
viene restituito 1 se l'elemento è stato inserito, 0 se l'elemento è già presente in coda
*/
int creaElemento(struct wrapperCoda *c, int num)
{
    struct cella *nuovoElemento;
    
    if (cercaInCoda(*c,num) == 0)
    {
        nuovoElemento = (struct cella*)malloc(sizeof(struct cella));
        if (nuovoElemento == NULL)
        {
            printf("\n\n Errore nell\'allocazione della memoria.\n Il programma verra\' chiuso!\n ");
            system("pause");                    
            exit(1);
        }
        nuovoElemento->valore = num;
        nuovoElemento->next = NULL; 
        if ((*c).ptrTesta != NULL)
            (*c).ptrTesta->next = nuovoElemento;
        else
            (*c).ptrCoda = nuovoElemento;
        (*c).ptrTesta = nuovoElemento;
        return 1;
    }    
    else
        return 0;
}
Ho tagliato i pezzi che non mi interessavano, analizzando le funzioni non capisco le seguenti cose:

1) Quando viene creata la lista, diciamo una lista di 5 elementi
struct cella *ptrTesta e struct cella *ptrCoda che sono elementi del wrapper a cosa puntano? (dal nome direi testa al primo elemento e coda all'ultimo ma non capisco perchè).
2) Il ciclo che elimina la coda a guardare il codice mi sembra che cancelli gli elementi a partire dall'ultimo, invece quando uso il codice in un programma mi cancella dal primo.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2005, 21:25   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da -Ivan-
Scusate ma non riesco proprio a capire questo codice sulle code.
Allora il codice seguente l'ha scritto il mio prof di programmazione.
Ma il tuo prof è un genio se riesce a scrivere:

(*c).ptrCoda

invece di

c->ptrCoda

(io ce l'ho un pochino con i prof perché mi hanno rovinato la carriera... mica per altro)

P.S. adesso leggo bene il codice e ti dico.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2005, 21:47   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da -Ivan-
1) Quando viene creata la lista, diciamo una lista di 5 elementi
struct cella *ptrTesta e struct cella *ptrCoda che sono elementi del wrapper a cosa puntano? (dal nome direi testa al primo elemento e coda all'ultimo ma non capisco perchè).
2) Il ciclo che elimina la coda a guardare il codice mi sembra che cancelli gli elementi a partire dall'ultimo, invece quando uso il codice in un programma mi cancella dal primo.
Semplice ... le due variabili sono gestite al "contrario". ptrTesta punta sempre all'ultimo elemento inserito mentre ptrCoda punta al primo elemento inserito.

Piuttosto (non avendo tutto il sorgente completo):

if (cercaInCoda(*c,num) == 0)

così gli passa la struttura per valore. Che gli serve a fare?

Dai ... 10 e lode al prof e non ne parliamo più
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2005, 22:52   #4
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Quote:
Originariamente inviato da andbin
Semplice ... le due variabili sono gestite al "contrario". ptrTesta punta sempre all'ultimo elemento inserito mentre ptrCoda punta al primo elemento inserito.

Piuttosto (non avendo tutto il sorgente completo):

if (cercaInCoda(*c,num) == 0)

così gli passa la struttura per valore. Che gli serve a fare?

Dai ... 10 e lode al prof e non ne parliamo più
Porca pupazza ecco io davo quasi per scontato che testa puntasse al primo e code all'ultimo e questo mi faceva partire con i "pregiudizi" nella lettura del codice.
Dio sto schiattando non ci capisco più una mazza tra code pile e alberi qualcuno mi salvi.
Grazie come al solito delle risposte .
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2005, 08:14   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Come sempre andbin ha dato una risposta impeccabile.

Direi che quel codice e' davvero strano, e mi sembra impossibile che sia stato scritto da un professore. Oltretutto doveva essere codice con uno scopo didattico...

E' davvero difficile pensare che questo codice sia stato scritto per la gestione di una coda, non essendo nemmeno una lista bidirezionale. Il fatto che memorizzi l'elemento di coda non importa a nessuno. Inoltre l'inserimento non avviene ad un estremo, come d'altronde la cancellazione.

Proprio strano. Tienici informati

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2005, 10:06   #6
cj++
Member
 
L'Avatar di cj++
 
Iscritto dal: Sep 2005
Città: Barcelona
Messaggi: 200
Quote:
Originariamente inviato da andbin
Ma il tuo prof è un genio se riesce a scrivere:
(*c).ptrCoda invece di c->ptrCoda
Questo è niente. Io ho avuto chi scriveva
*((*((*(myArray+i))+j))+k)
invece di myArray[i][j][k]

__________________
Code without tests is broken by design.
cj++ è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2005, 11:07   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da cj++
Questo è niente. Io ho avuto chi scriveva
*((*((*(myArray+i))+j))+k)
invece di myArray[i][j][k]
Per carità!!! Se qualche mio collega facesse una cosa del genere in un sorgente C allora ...
uaaataaaa! lo spiezzo in due, compresa la tastiera
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2005, 14:50   #8
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Quote:
Originariamente inviato da sottovento
Come sempre andbin ha dato una risposta impeccabile.

Direi che quel codice e' davvero strano, e mi sembra impossibile che sia stato scritto da un professore. Oltretutto doveva essere codice con uno scopo didattico...

E' davvero difficile pensare che questo codice sia stato scritto per la gestione di una coda, non essendo nemmeno una lista bidirezionale. Il fatto che memorizzi l'elemento di coda non importa a nessuno. Inoltre l'inserimento non avviene ad un estremo, come d'altronde la cancellazione.

Proprio strano. Tienici informati

High Flying
Sottovento

E' stato scritto dal mio prof di programmazione, il problema è che io l'ho usato circa uguale nel mio progetto e adesso mi si stanno complicando le cose.
Non vi faccio vedere il codice per le pile ma anche quello mi sta dando dei bei problemi.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2005, 21:17   #9
leadergl
Senior Member
 
Iscritto dal: May 2003
Messaggi: 1113
io non capisco perchè per gestire la struttura delle code che è la più semplice al mondo il tuo prof. abbia usato i puntatori...

sono sempre stato abituato ad usare le code per un numero finito di elementi, altrimenti non sarebbe una coda...nel senso che una coda prima o poi si riempie quindi sappiamo a priori quanti elementi dovrebbe contenere, di conseguenza mi viene spontaneo pensarla come una "struttura" che non fa altro che gestire in maniera particolare un vettore; ovvero gestirlo in maniera circolare!
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC
leadergl è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2005, 12:23   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Ecco una bella gestione di una coda usando un array invece di una lista. Spero possa esservi utile.
Allegati
File Type: zip queue_arr.zip (1.6 KB, 6 visite)
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2005, 18:34   #11
nightfly
Senior Member
 
Iscritto dal: Jun 2005
Città: Reggio Calabria
Messaggi: 377
Il codice è macchinoso e poco chiaro... è evidente che lo scopo di tale esempio non è illustrativo o tantomeno didattico... l'unica cosa che risulta chiara sono l'inizializzazione della testa e delle coda (che identificano la pila) a null poichè originariamente la pila si suppone vuota... oltre alle diverse funzioni che implementano le varie operazioni da eseguire su di essa (cancellazione, inserimento ecc ecc). Peccato per i body di ciascuna di esse, praticamente incomprensibile. Dici al tuo prof di iniziare a leggere il significato degli operatori booleani e non, e dopo, eventualmente, di proporti un esempio del genere Saluti.
__________________
Here Comes The Music Ecstasy
nightfly è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2005, 18:19   #12
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Infatti io all'iti ricordo che le pile e le code non mi davano problemi però ora non ci capisco più niente.
Porca miseria visto che ci siamo:
una pila può essere stampata senza che venga svuotata?

questa è la funzione che la stampa fatta dal mio prof:
Codice:
void stampaPila(struct cella **t)
{
    struct cella *temp;
    
    printf("\n");
    if (t == NULL)
    {
        printf(" La pila e\' vuota!\n");
        return;
    }
    
    do
    {
        temp = pop(t);
        printf(" valore: %d\n",temp->valore);
        free(temp);
    } (*t != NULL); 
}
struct cella * pop(struct cella **t)
{
    struct cella *temp;

    if (*t == NULL)
        return NULL;
    temp = *t;
    *t = (*t)->next;
    temp->next = NULL; 
    return temp;
}
La pila contiene solo un campo int valore e il puntatore next.
t è una variabile di tipo cella.
Ho tre giorni per finire il progetto e sono messo veramente male.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2005, 21:56   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da -Ivan-
una pila può essere stampata senza che venga svuotata?
Beh, certo. È solo questione di studiare come accedere alla pila senza fare casini sul contenuto.

Quote:
Originariamente inviato da -Ivan-
questa è la funzione che la stampa fatta dal mio prof:
Codice:
...
A ridaje con il codice del prof ...
Non capisco la necessità del doppio puntatore struct cella **t (non ho il codice completo, comunque) e non capisco perché si debba eseguire una funzione pop() per stampare i dati in una pila se non la si vuole svuotare!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2005, 13:53   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da cj++
Questo è niente. Io ho avuto chi scriveva
*((*((*(myArray+i))+j))+k)
invece di myArray[i][j][k]

Coding HORROR!
Dovresti farlo partecipare all'OCCC.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2005, 14:50   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DanieleC88
Dovresti farlo partecipare all'OCCC.
IOCCC, "International Obfuscated C Code Contest", www.ioccc.org

Indubbiamente, uno che scrive *((*((*(myArray+i))+j))+k) ha molte buone possibilità di vincere, specialmente nella categoria "Abuse of the rules".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2005, 17:05   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da andbin
IOCCC, "International Obfuscated C Code Contest", www.ioccc.org
Ah, avevo dimenticato la I... e vabbe', tutti posso sbagliare.
Quote:
Originariamente inviato da andbin
Indubbiamente, uno che scrive *((*((*(myArray+i))+j))+k) ha molte buone possibilità di vincere, specialmente nella categoria "Abuse of the rules".
Appunto!
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2005, 17:21   #17
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Forse il mio prof ha intenzione di farci partecipare tutti e ci sta preparando in segreto.
Si spiega tutto adesso.
Tra poco metterò mano agli alberi...ho paura .
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Google riaccenderà una centrale n...
Crollo per Pornhub nel Regno Unito:-77% ...
La Germania accende il suo cannone laser...
Il meglio di Amazon in 2 minuti: tira ar...
ECOVACS risponde a Eureka e dimezza il p...
Durissimo colpo per Nintendo: l'ufficio ...
Scope elettriche al minimo storico su Am...
Blue Jay e Project Eluna: robotica e AI ...
Scede a 949€ il Samsung Galaxy S25 Ultra...
Blue Yeti Nano in super offerta su Amazo...
Netflix sta preparando un'offerta per Wa...
Prezzo impossibile, è sceso ancor...
Torna il migliore dei mini PC economici:...
USA, via libera all'uso di plutonio mili...
Tutte le tappe verso l'euro digitale sec...
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: 13:21.


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