Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-12-2009, 17:48   #1
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
[C] Strutture dati : sclero. (aggiornato nuovo programma, nuovo problema)

Scusate ragazzi, questa è la mia unica spiaggia non so a cui rivolgermi. L'incubo finirà a gennaio, intanto vi dovete sorbire i miei 3d a decine, perchè purtroppo ho un prof incompetente e non so a chi chiedere. Dopo aver perso ore a capire le strutture dati, sono riuscito a fare un programma basato sulle strutture dati che "su carta", coi disegnini dei mattonici ecc, funziona, ma nel programma no.
Mi sapete dire dove sbaglio?
Questo è il codice :
Codice:
#include<stdio.h>
#include<stdlib.h>
struct lis {
       int inf;
       struct lis *pun;
       };
       
struct lis *genLista();
void stampaLista(struct lis *);
struct lis *cancNum(struct lis *);

int main(){
    struct lis lista;
    struct lis *puntalista;
    puntalista=genLista();
    stampaLista(puntalista);
    puntalista=cancNum(puntalista);
    stampaLista(puntalista);
    system("PAUSE");
    return(0);
}

struct lis *genLista(){
       struct lis *p,*paus;
       int n;
       p=(struct lis *)malloc(sizeof(struct lis));
       printf("\nInserisci numero elementi lista : ");
       scanf("%d",&n);
       printf("\nInserisci 1o elemento : ");
       scanf("%d",&p->inf);
       paus=p;
       for(int i=2;i<=n;i++){
               paus->pun=(struct lis *)malloc(sizeof(struct lis));
               paus=paus->pun;
               printf("\nInserisci %do elemento: ",i);
               scanf("%d",&paus->inf);
               }
               paus->pun=NULL;
               return(p);
               }
               
void stampaLista(struct lis *p){
     printf("\nLA LISTA E' :\n");
     while(p!=NULL){
     printf("%d",p->inf);
     printf("-->");
     p=p->pun;
     }
     printf("FINE LISTA");
     printf("\n\n");
     }
     
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL))p=p->pun;
        paus=p;
        while(paus!=NULL){
        if(((paus->inf)%2==0)){
        paus2=paus->pun;
        paus->pun=NULL;
        paus=paus2;
        continue;
        }
        paus=paus->pun;
        }
    return(p);
                    }
piccolo commento sul codice, vabbè sulla generazione e stampa nulla da dire, il compito della funzione cancNum è di cancellare i numeri pari della lista.
Quello che ho fatto è dividire la cancellazione se il numero è il primo della lista, o se è successivo al primo della lista.
Se è il primo della lista, la cancellazione mi riesce bene. Non posso mettere tutto in uno altrimenti perdere il puntatore alla testa della lista, e perderei di conseguenza la possibilità di stampa.
Comunque, il rpoblema viene quando devo trovare i successivi elementi pari da eliminare; uso 2 puntatori ausiliari, che scorrono la lista e eliminano il numero pari se c'è, se non c'è l'if non viene fatto e il primo puntatore ausiliario viene spostato di 1 mattoncino, mentre se l'if viene fatto avviene la cancellazione, ma il continue evita che il primo puntatore ausiliario si sposti di un mattoncino.
Dove sbaglio?
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one

Ultima modifica di The-Revenge : 16-12-2009 alle 13:12.
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 18:48   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Gli errori sono sostanzialmente due:
immagina la lista come una catena: quando cancelli un nodo è come se eliminassi un anello della catena, per far sì che la catena resti insieme devi legare tra loro l'anello che precedeva l'anello eliminato e il successivo. Quello che fai qui:
Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL))p=p->pun;
        paus=p;
        while(paus!=NULL){
        if(((paus->inf)%2==0)){
        paus2=paus->pun;
        paus->pun=NULL;
        paus=paus2;
        continue;
        }
        paus=paus->pun;
        }
    return(p);
                    }
è cancellare un nodo, senza legare i due che gli stavano intorno.
Il secondo errore è che non deallochi la memoria allocata.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 18:56   #3
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Gli errori sono sostanzialmente due:
immagina la lista come una catena: quando cancelli un nodo è come se eliminassi un anello della catena, per far sì che la catena resti insieme devi legare tra loro l'anello che precedeva l'anello eliminato e il successivo. Quello che fai qui:
Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL))p=p->pun;
        paus=p;
        while(paus!=NULL){
        if(((paus->inf)%2==0)){
        paus2=paus->pun;
        paus->pun=NULL;
        paus=paus2;
        continue;
        }
        paus=paus->pun;
        }
    return(p);
                    }
è cancellare un nodo, senza legare i due che gli stavano intorno.
Il secondo errore è che non deallochi la memoria allocata.
bhè, entrambe le cose che mi hai detto mi erano note : deallocare la memoria (penso tu intenda con free) lo volevo fare ma sl in un secondo momento, dato che era solo per ottimizzare il programma, e non mi interessa più di tanto visto che è ad uso didattico...per quanto riguarda le catene, è propio ciò che ho tentato di fare usando paus2...per non lasciare nessun nodo fluttante e per ricollegare il nodo precedente a quello distrutto...
mi potresti dire cosa ho sbagliato esattamente?
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:02   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
mi potresti dire cosa ho sbagliato esattamente?
Il problema è che al passo generico stai confrontando un nodo ma non hai memoria del precedente e quindi non ti è possibile risanare la catena
Codice:
while(paus!=NULL){
        if(((paus->inf)%2==0)){
        paus2=paus->pun;
        paus->pun=NULL;
        paus=paus2;
        continue;
        }
Vedi, qui controlli se paus è uno dei nodi da cancellare ma se è effettivamente così come fai a collegare il suo precedente (di cui il tuo algoritmo non ha memoria) con il successivo (paus->pun)?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:07   #5
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
l'ho corretto e sembra funzionare. Capito dove sbagliavo : andavo di pari passo ad una cella, senza poter ritornare alla precedente, invece ora lascio idnietro paus1, porto avanti paus2 e poi creo il ponte tra paus1 e il successivo e scollego paus2.
Per la deallocazione, dealloco paus1 e 2 alla fine del while? cosi?


Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL))p=p->pun;
        paus=p;
        while(paus!=NULL){
                          paus2=paus->pun;
                          if(((paus2->inf)%2==0)){
        paus->pun=paus2->pun;
        paus2->pun=NULL;
        }
        paus=paus->pun;
        }
        free(paus);
        free(paus2);
    return(p);
                    }
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:07   #6
BlackAuron
Member
 
Iscritto dal: May 2006
Messaggi: 86
Codice PHP:
#include<stdio.h>
#include<stdlib.h>

struct lis {
    
int inf;
    
struct lis *pun;
};

struct lis *genLista();
void stampaLista(struct lis *);
struct lis *cancNum(struct lis *);

int main() {
    
struct lis *puntalista;
    
puntalista genLista();
    
stampaLista(puntalista);
    
puntalista cancNum(puntalista);
    
stampaLista(puntalista);
    return (
0);
}

struct lis *genLista() {
    
struct lis *p, *paus;
    
int ni;
    
// Allochi lo spazio di struct lis e lo casti come puntatore ... le due
    // dimensioni sono differenti. Tra l'altro, il cast nel C non è necessario
    
malloc(sizeof (struct lis));
    
printf("\nInserisci numero elementi lista : ");
    
scanf("%d", &n);
    
printf("\nInserisci 1o elemento : ");
    
scanf("%d", &p->inf);
    
paus p;
    for (
2<= ni++) {
        
//stesso discorso di prima. Allochi patate e casti pere.
        
paus->pun malloc(sizeof (struct lis));
        
paus paus->pun;
        
printf("\nInserisci %do elemento: "i);
        
scanf("%d", &paus->inf);
    }
    
paus->pun NULL;
    return (
p);
}

void stampaLista(struct lis *p) {
    
printf("\nLA LISTA E' :\n");
    while (
p) {
        
printf("%d"p->inf);
        
printf("-->");
        
p->pun;
    }
    
printf("FINE LISTA");
    
printf("\n\n");
}

struct lis *cancNum(struct lis *p) {
    
struct lis *paus NULL,*tmp,*head NULL;
    while(
p){
        if(!(
p->inf 2)){
            
tmp p->pun;
            
free(p);
            
tmp;
        }
        else{
            if(!
head )
                
head p;
            else
                
paus->pun p;
            
paus p;
            
p->pun;
        }

    }
    if(
paus)
        
paus->pun NULL;
    return (
head);

Non è la soluzione ottima, ma funziona teoricamente si potrebbe fare a meno della variabile paus, e andare direttamente ad eliminare i successori di p.
BlackAuron è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:12   #7
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
l'ho corretto e sembra funzionare. Capito dove sbagliavo : andavo di pari passo ad una cella, senza poter ritornare alla precedente, invece ora lascio idnietro paus1, porto avanti paus2 e poi creo il ponte tra paus1 e il successivo e scollego paus2.
Per la deallocazione, dealloco paus1 e 2 alla fine del while? cosi?


Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL))p=p->pun;
        paus=p;
        while(paus!=NULL){
                          paus2=paus->pun;
                          if(((paus2->inf)%2==0)){
        paus->pun=paus2->pun;
        paus2->pun=NULL;
        }
        paus=paus->pun;
        }
        free(paus);
        free(paus2);
    return(p);
                    }
No, dovresti deallocare di volta in volta il nodo che scolleghi, così invece deallochi solo l'ultimo che hai scollegato
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:14   #8
BlackAuron
Member
 
Iscritto dal: May 2006
Messaggi: 86
Codice PHP:
struct lis *cancNum(struct lis *p) {
    
struct lis *tmp,*head p;
    while(
p->pun){
        if(!((
p->pun)->inf 2)){
            
tmp = (p->pun)->pun;
            
free(p->pun);
            
p->pun tmp;
        }
        else{
            if(!(
head->inf 2))
                
head p;
            
p->pun;
        }
    }
    if(
p)
        
p->pun NULL;
    return (
head);

Ecco la versione dove risparmi una variabile... vedi tu quale preferisci, questa concettualmente è relativamente più incasinata, ma è più efficente.
BlackAuron è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:16   #9
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da BlackAuron Guarda i messaggi
Codice PHP:
#include<stdio.h>
#include<stdlib.h>

struct lis {
    
int inf;
    
struct lis *pun;
};

struct lis *genLista();
void stampaLista(struct lis *);
struct lis *cancNum(struct lis *);

int main() {
    
struct lis *puntalista;
    
puntalista genLista();
    
stampaLista(puntalista);
    
puntalista cancNum(puntalista);
    
stampaLista(puntalista);
    return (
0);
}

struct lis *genLista() {
    
struct lis *p, *paus;
    
int ni;
    
// Allochi lo spazio di struct lis e lo casti come puntatore ... le due
    // dimensioni sono differenti. Tra l'altro, il cast nel C non è necessario
    
malloc(sizeof (struct lis));
    
printf("\nInserisci numero elementi lista : ");
    
scanf("%d", &n);
    
printf("\nInserisci 1o elemento : ");
    
scanf("%d", &p->inf);
    
paus p;
    for (
2<= ni++) {
        
//stesso discorso di prima. Allochi patate e casti pere.
        
paus->pun malloc(sizeof (struct lis));
        
paus paus->pun;
        
printf("\nInserisci %do elemento: "i);
        
scanf("%d", &paus->inf);
    }
    
paus->pun NULL;
    return (
p);
}

void stampaLista(struct lis *p) {
    
printf("\nLA LISTA E' :\n");
    while (
p) {
        
printf("%d"p->inf);
        
printf("-->");
        
p->pun;
    }
    
printf("FINE LISTA");
    
printf("\n\n");
}

struct lis *cancNum(struct lis *p) {
    
struct lis *paus NULL,*tmp,*head NULL;
    while(
p){
        if(!(
p->inf 2)){
            
tmp p->pun;
            
free(p);
            
tmp;
        }
        else{
            if(!
head )
                
head p;
            else
                
paus->pun p;
            
paus p;
            
p->pun;
        }

    }
    if(
paus)
        
paus->pun NULL;
    return (
head);

Non è la soluzione ottima, ma funziona teoricamente si potrebbe fare a meno della variabile paus, e andare direttamente ad eliminare i successori di p.
si bhè ma il mio prof credo gli basti come l'ho fatto io, d'altronde non voglio diventare programmatore è solo un esame...mi diresti come fare il free giusto per il mio programma? grazie
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:18   #10
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da BlackAuron Guarda i messaggi
Codice PHP:
struct lis *cancNum(struct lis *p) {
    
struct lis *tmp,*head p;
    while(
p->pun){
        if(!((
p->pun)->inf 2)){
            
tmp = (p->pun)->pun;
            
free(p->pun);
            
p->pun tmp;
        }
        else{
            if(!(
head->inf 2))
                
head p;
            
p->pun;
        }
    }
    if(
p)
        
p->pun NULL;
    return (
head);

Ecco la versione dove risparmi una variabile... vedi tu quale preferisci, questa concettualmente è relativamente più incasinata, ma è più efficente.
eh si...preferisco quelle concettualmente più semplici, per ora, che è i primo esercizio che faccio sulle strutture dati.
Comunque per il fatto del casting che mi hai fatto notare, c'è scritto sul libro di fare cosi..nn so.
Comunque ho qualche problema a capire la deallocazione
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:21   #11
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
è deallocato bene cosi? ho usato la deallocazione sia sul puntalista che sul secondo puntatore ausliario. Credo di aver capito il concetto.

Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL)){paus=p;
                                          p=p->pun;
                                          p->pun=NULL;
                                          free(paus);
                                          }
        paus=p;
        while(paus!=NULL){
                          paus2=paus->pun;
                          if(((paus2->inf)%2==0)){
        paus->pun=paus2->pun;
        paus2->pun=NULL;
        free(paus2);
        }
        paus=paus->pun;
        }

    return(p);
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:25   #12
BlackAuron
Member
 
Iscritto dal: May 2006
Messaggi: 86
Se deallochi, cancelli dalla faccia della terra quello che passi come argomento, devi solo ricordarti che quando lo fai non hai più niente di ciò che era presente nella struttura.
per quanto riguarda l'allocazione..
Codice PHP:
p=(struct lis *)malloc(sizeof(struct lis)); 
resto convinto che sia un errore concettuale. Se dai un sizeof su "struct lis*" e "struct lis", vedrai che le dimensioni sono differenti, presumibilmente struct lis sarà più grande del relativo puntatore.
E' come comprare un garagage dimensione limousine quando hai una smart... non è che non funzioni, è solo uno spreco, concettualmente cannato (oltre che economicamente ) Magari senti il tuo professore a riguardo, o vedi che ti dicono gli altri utenti del forum ...
Ah, come nota trasversale, compilando con gcc -Wall, a me il cast lo segnala pure come warning, visto che in c i cast pare non siano necessari...
BlackAuron è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:30   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Quote:
Originariamente inviato da The-Revenge Guarda i messaggi
Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while(((p->inf)%2==0)&&(p!=NULL)){paus=p;
                                          p=p->pun;
                                          p->pun=NULL;
                                          free(paus);
                                          }
        paus=p;
        while(paus!=NULL){
                          paus2=paus->pun;
                          if(((paus2->inf)%2==0)){
        paus->pun=paus2->pun;
        paus2->pun=NULL;
        free(paus2);
        }
        paus=paus->pun;
        }

    return(p);
E' quasi tutto giusto, nella condizione del primo while bisogna scambiare le due condizioni, in modo che se p è NULL non viene fatto il controllo p->inf%2==0 che darebbe errore.
La prima assegnazione a NULL è un errore, perché nella istruzione precedente hai assegnato a p il nodo successivo, quindi stai agendo su un nodo che non hai ancora esaminato.
La seconda assegnazione a NULL è inutile perché tanto agisce su memoria che subito dopo deallochi con free.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 19:57   #14
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
E' quasi tutto giusto, nella condizione del primo while bisogna scambiare le due condizioni, in modo che se p è NULL non viene fatto il controllo p->inf%2==0 che darebbe errore.
La prima assegnazione a NULL è un errore, perché nella istruzione precedente hai assegnato a p il nodo successivo, quindi stai agendo su un nodo che non hai ancora esaminato.
La seconda assegnazione a NULL è inutile perché tanto agisce su memoria che subito dopo deallochi con free.
1)ok
2)si, ho fatto un errore in realtà volevo scrivere paus->pun=NULL. Questo porta allo stesso problema che hai esaminato nel 3 punto
3)qui c'è un problema che hai sollevato e che ho chiesto stamane anche io al mio prof quando spiegava, e mi ès tato risposto in un certo modo ecco xke ho scritto null anche sapendo che dopo deallocavo con free. In pratica paus2->pun punta a un area che ha 2 puntatori quindi posso scollegare paus2. Il mio prof stamattina scollegava sempre paus2->pun prima di deallocare paus2. Io gli ho chiesto se non fosse possibile deallocare direttamente paus2 senza scollegarlo, dato che comunque la parte restante della catena era collegata ad un altro puntatore, e lui mi ha detto che non era sicuro ma che pensava che deallocando direttamente si sarebbe persa anche la restante parte della catena, nonostante fosse collegata ad un altro puntatore. Ecco perchè scollego prima di deallocare, nonostante ero consapevole che avrei deallocato. Quindi mi dite che non c'è bisogno di scollegarlo? Il prof , ripeto, non era sicuro. Stessa cosa nel punto 2, corretto l'errore porterebbe a questo problema.

X blackauron : guarda, sicuramente avrai ragione ma il libro e il prof dicono in quella maniera e, siccome non devo fare nulla di professionale ma solo cose didattiche, preferisco attenermi. Comunque con quel cast io stavo solo dichirando un puntatore che punta a una struttura di tipo lis, e questo puntatore punta a un area di memoria che alloco con malloc , usando sizeof per ricavare la grandezza della struttura di tipo lis. Non vedo dove è l'errore che tu dici

Comunque vi ringrazio per l'aiuto e per li speigazione, mi siete stati di grande aiuto

Alla fine dovrebbe essere cosi
Codice:
struct lis *cancNum(struct lis *p){
        struct lis *paus,*paus2;
        while((p!=NULL)&&((p->inf)%2==0)){paus=p;
                                          p=p->pun;
                                          paus->pun=NULL;
                                          free(paus);
                                          }
        paus=p;
        while(paus!=NULL){
                          paus2=paus->pun;
                          if(((paus2->inf)%2==0)){
        paus->pun=paus2->pun;
        paus2->pun=NULL;
        free(paus2);
        }
        paus=paus->pun;
        }

    return(p);
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one

Ultima modifica di The-Revenge : 15-12-2009 alle 19:59.
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 20:09   #15
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Riguardo l'assegnazione a NULL confermo che è inutile, la free semplicemente dealloca un blocco di memoria precedentemente allocato, se facesse quello che dice il prof dovrebbe inferire i campi della struttura puntata dal puntatore passato come parametro (cosa impossibile) e a quel punto deallocare a cascata i vari puntatori.

Non ho invece capito la questione del cast, cioè, non ho capito di cosa state parlando.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 20:17   #16
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Riguardo l'assegnazione a NULL confermo che è inutile, la free semplicemente dealloca un blocco di memoria precedentemente allocato, se facesse quello che dice il prof dovrebbe inferire i campi della struttura puntata dal puntatore passato come parametro (cosa impossibile) e a quel punto deallocare a cascata i vari puntatori.

Non ho invece capito la questione del cast, cioè, non ho capito di cosa state parlando.
ok, capisco. Allora la mia domanda al prof era stata lecita , e la sua riasposta, anche se comunque con riserva, non corretta
Per quanto riguarda la questione del cast lui intende questo :

Codice:
p=(struct lis *)malloc(sizeof(struct lis));
sinceramente questa dichirazione l'ha usata il prof, è scritta cosi come è scritta qui sul libro di C, ed è anche spiegata come l'ho detto io sopra....non ho capito bene l'errore logico che l'utente mi voleva fare notare...
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 20:29   #17
BlackAuron
Member
 
Iscritto dal: May 2006
Messaggi: 86
con il cast fai in modo che in p ci stia un puntatore a struct lis, mentre allochi uno spazio di dimensione struct lis.
In parole povere, faccio un esempio

1) sizeof(struct lis) = 10 bytes
2) sizeof(sruct lis *) = 4 bytes

( ricordiamoci che struct lis* contiene solo un indirizzo di memoria, quindi lo spazio di cui necessita è esiguo)

3) malloc(sizeof(struct lis)) creo uno spazio in memoria di dimensione 10 bytes
4) ( struct lis*)malloc(sizeof(struct lis)) do ai 10 bytes la forma di un puntatore a struct lis, che richiede solo 4 bytes. I restanti 6 bytes sono memoria sprecata.

PS: i valori li ho sparati a caso, giusto per far capire il concetto
BlackAuron è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2009, 20:43   #18
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Quote:
Originariamente inviato da BlackAuron Guarda i messaggi
4) ( struct lis*)malloc(sizeof(struct lis)) do ai 10 bytes la forma di un puntatore a struct lis, che richiede solo 4 bytes. I restanti 6 bytes sono memoria sprecata.
Non funziona così: malloc alloca un'area di memoria della dimensione desiderata (quella passata come parametro) e restituisce un puntatore a quell'area di memoria. Dovendo il valore restituito essere generico viene restituito un puntatore a void. Il cast esplicito serve ad evitare un warning del compilatore (non so se ci siano anche compilatori che danno errore) che avvertirebbe del fatto che si sta assegnando un valore "void*" a una variabile di tipo diverso, in questo caso "struct lis*"
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2009, 10:00   #19
The-Revenge
Senior Member
 
Iscritto dal: Feb 2007
Messaggi: 1352
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Non funziona così: malloc alloca un'area di memoria della dimensione desiderata (quella passata come parametro) e restituisce un puntatore a quell'area di memoria. Dovendo il valore restituito essere generico viene restituito un puntatore a void. Il cast esplicito serve ad evitare un warning del compilatore (non so se ci siano anche compilatori che danno errore) che avvertirebbe del fatto che si sta assegnando un valore "void*" a una variabile di tipo diverso, in questo caso "struct lis*"
esatto, è la stessa indentica cosa che c'è scritta sul libro...
__________________
Ho venduto a : truedocman2004,ragen-fio
Ho acquistato da :shinakuma, britt-one
The-Revenge è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2009, 10:47   #20
BlackAuron
Member
 
Iscritto dal: May 2006
Messaggi: 86
eh si, mi sa che ieri ero particolarmente in aria:leggevo *p e nella mia testa pensavo a **p ... pazienza
Resta il fatto che a me il warning lo da solo se il cast lo metto...
BlackAuron è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
2 minuti: il tempo per scorrere le 25 of...
Mini LED TCL: confronto tra le migliori ...
Robot aspirapolvere: questi sono i più a...
Portatile tuttofare Lenovo Core i5/16GB ...
Scende a 99€ il tablet 11" 2,4K con...
Amiga: quali erano i 10 giochi più belli
Driver più sicuri: Microsoft alza...
Ego Power+ ha la giusta accoppiata per l...
Scompiglio nei listini Amazon: prezzi im...
Sotto i 105€ il robot Lefant che lava, a...
Mini proiettori smart in offerta: uno co...
Smartwatch Amazfit in offerta: Balance o...
Windows XP ritorna: ecco come usarlo sub...
Arrow Lake in saldo: Intel taglia i prez...
LG C4 da 55'' a 899€ è il top per...
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: 20:09.


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