Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-01-2009, 14:30   #1
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
[c] Problema con i puntatori

Salve a tutti del forum.

Ragazzi sto facendo un programma per l'università sulle strutture dinamiche e più precisamente sulle code.

Ho fatto diciamo il programma però non mi funziona bene.Facendo il debug con il dev-c mi sono accorto di una cosa.Dopo aver inizializzato i puntatori nel main con NULL quando li vado a passare nelle funzioni per inserire ed eliminare un elemento i puntatori cambiao valore passando da null ad due indirizzi separati.Quando la funzione termina e ritorno al main i puntatori perdono il valore acquisito e ritornano a NULL.

Sono disperato vi prego aiutatemi.

Di seguito vi posto il sorgente.

P.S. La versione di dev utilizzata e l'ultima cioè la 5.



Codice:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#define max 50
//tipi di dati astratti utilizzati
typedef char stringa[50];
//struttura
struct utente{
        int numero;
        stringa nome;
        struct utente *next;
};
typedef struct utente UTENTE;
typedef UTENTE *nuovoutente;

void pusha(int numero,nuovoutente *testa,nuovoutente *coda);
int poppa(int numero,nuovoutente *testa,nuovoutente *coda);


int main(){
int scelta=0,errore=0;
UTENTE ute;
nuovoutente testa;
nuovoutente coda;
testa=NULL;
coda=NULL;
    do{
        printf("DIGITA 1 per inserire");
        printf("\n");
        printf("DIGITA 2 per estrarre");
        printf("\n");
        printf("DIGITA 3 per uscire");
        printf("\n");
        scanf("%d",&scelta);
        switch(scelta){
              case 1:{
                      printf("Inserisci il numero");
                      printf("\n");
                      scanf("%i",&ute.numero);
                      printf("Inserisci il nome");
                      printf("\n");
                      scanf("%s",ute.nome);
                      printf("\n");
                      pusha(ute.numero,&testa,&coda);
                     }break;
              case 2:{
                     errore=poppa(&ute.numero,&testa,&coda);
                     if(errore==1){
                                   printf("%d",ute.numero);
                                   printf("\n");
                                   }
                     else printf("La coda e\' vuota\n");
                     }break;
        }
 }while(scelta!=3);
 system("PAUSE");
 return 0;   
}

void pusha(int numero,nuovoutente *testa,nuovoutente *coda){
      UTENTE *nuovoutente;
      nuovoutente=(UTENTE*)malloc(sizeof(UTENTE));    
      nuovoutente->numero=numero;
      nuovoutente->next=NULL;
     if(testa==NULL){
                     *testa=nuovoutente;
                     *coda=nuovoutente;
                     }
                     else{
                          (*coda)->next=nuovoutente;
                          *coda=nuovoutente;
                          }     
     }
     

int poppa(int numero,nuovoutente *testa,nuovoutente *coda){
    if(testa==NULL){
                    numero=(*testa)->numero;
                    (*testa)=(*testa)->next;
                    return 1;
                    }    
    else return 0;
    }

Ultima modifica di ioshi : 16-01-2009 alle 17:41.
ioshi è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 15:50   #2
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
La prossima volta usa il tag [code] però

Comunque il problema è che il c passa i parametri per valore, che vuol dire che non passa la variabile ma passa solo una copia che poi verrà distrutta alla fine della chiama alla funzione.
Per risolvere devi cambiare la funzione in modo che prenda in ingresso il puntatore al puntatore e poi gestirlo di conseguenza.
Ah, chiaramente quando chiami la funzione poi dovrai passare il puntatore al puntatore, non più il puntatore direttamente.

EDIT: Scusa, dando una rapida letta al codice vedo che lo hai già fatto. Se per favore usi il tag code e re-incolli il codice lo guardo meglio. ^^

Ultima modifica di Kenger : 16-01-2009 alle 15:52.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 16:30   #3
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
Ecco l'ho modificato....Non riesco a venirne a capo ci sto da ieri su questo codice l'ho riscritto 3 volte da capo....ma nada....commetto sempre lo stesso errore che non riesco a capire dove sta...
Ma....l'ho fatto alle superiori usando anche quaiche cosa del c++ e l'ho sempre fatto bene....ora usando solo c sto andando in crisi....
Mi sono arruginito....
ioshi è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 17:31   #4
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7261
ovviamente stai assumendo che passando un puntatore stai passando la variabile per riferimento, ma in realtà stai passando l'indirizzo della variabile per valore.
quindi quando assegni un puntatore all'interno della funzione lo cambi solo localmente alla funzione.
la soluzione è passare un puntatore a puntatore quando serve (cioè quando vuoi cambiare riferimento al puntatore)

Ultima modifica di k0nt3 : 16-01-2009 alle 17:37.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 17:38   #5
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
se non sbaglio l'ho passato un puntatore di puntatore come argomento no?
ioshi è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 17:49   #6
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7261
gli ho dato una lettura veloce al codice, ho risposto in base al tipo di errore che hai segnalato
comunque magari ci dò un'occhiata più approfondita appena ho tempo
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 18:06   #7
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7261
siccome non mi oriento molto con troppe definizioni di tipi.. ho provato così e ora funziona :
Codice:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#define max 50

//struttura
typedef struct struct_utente {
  int numero;
  char nome[50];
  struct struct_utente *next;
} utente;

void pusha(int numero, utente **testa, utente **coda);
int poppa(int numero, utente **testa, utente **coda);


int main(){
  int scelta=0,errore=0;
  utente ute;
  utente *testa;
  utente *coda;
  testa=NULL;
  coda=NULL;
  do{
    printf("DIGITA 1 per inserire");
    printf("\n");
    printf("DIGITA 2 per estrarre");
    printf("\n");
    printf("DIGITA 3 per uscire");
    printf("\n");
    scanf("%d",&scelta);
    switch(scelta){
      case 1:{
        printf("Inserisci il numero");
        printf("\n");
        scanf("%i",&ute.numero);
        printf("Inserisci il nome");
        printf("\n");
        scanf("%s",ute.nome);
        printf("\n");
        pusha(ute.numero,&testa,&coda);
      }break;
      case 2:{
        errore=poppa(ute.numero,&testa,&coda);
        if(errore==1){
          printf("%d",ute.numero);
          printf("\n");
        }
        else printf("La coda e\' vuota\n");
      }break;
    }
  }while(scelta!=3);
  getchar();
  return 0;   
}

void pusha(int numero, utente **testa, utente **coda){
  utente *new;
  new=(utente*)malloc(sizeof(utente));    
  new->numero=numero;
  new->next=NULL;
  if(*testa==NULL){
    *testa=*coda=new;
    printf("inserito %d\n",(*testa)->numero);
  }
  else{
    *coda=new;
  }     
}


int poppa(int numero, utente **testa, utente **coda){
  if(*testa==NULL){
    return 0;
  }    
  else {
    numero=(*testa)->numero;
    (*testa)=(*testa)->next;
    return 1;
  }    
}
avevi anche invertito l'if in poppa
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 18:37   #8
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
bhe non so perchè ma non mi va...quando lo compilo mi da molti errori....
poi non posso usare new(perchè se non erro è una funzione di c++ ed il prof vuole puramente c)
comunque puoi spiegarmi dove ho sbagliato?e se nel caso farmi un esempio?
ioshi è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 18:46   #9
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7261
Quote:
Originariamente inviato da ioshi Guarda i messaggi
bhe non so perchè ma non mi va...quando lo compilo mi da molti errori....
poi non posso usare new(perchè se non erro è una funzione di c++ ed il prof vuole puramente c)
comunque puoi spiegarmi dove ho sbagliato?e se nel caso farmi un esempio?
new l'ho usato come nome per la variabile, essendo codice C non è una keyword.
sinceramente non lo so esattamente dove hai sbagliato perchè quando ci sono troppe definizioni faccio confusione
sicuramente l'if in poppa era invertito
mi sembra strano che ti da errori perchè devcpp dovrebbe usare lo stesso compilatore che uso io (cioè gcc). puoi postare gli errori che ti da?
tra l'altro ti consiglierei di usare codeblocks che è molto meglio di dev-cpp

ps. forse ho capito... dev-cpp è un compilatore c++ quindi ti da errore sulla new! prova a cambiargli nome (ad esempio nuovo)

Ultima modifica di k0nt3 : 16-01-2009 alle 18:48.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 18:57   #10
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7261
ok ho confrontato il codice..
avevi sbagliato nell'if in pusha quando controllavi se testa era NULL
Codice:
if(testa==NULL){
il codice giusto era:
Codice:
if(*testa==NULL){
lo stesso errore c'è in poppa
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 19:05   #11
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
ok grazie mille
Comunque anche io non uso molto le definizioni ma il prof le vuole per la solita cosa del software più leggibile e vuole che usiamo come compilatore il dev 5...
Anche se io preferisco la versione precedente che ha un debugger comodissimo rispetto all'attuale versione(che odio anche perchè errori che non mi da nella 4 me li da nella 5).
Io come compilatore editor ho sempre usato il turbo c(la versione che va in finestra dos) la adoro.
Ora provo e mi riscrivo tutto il codice da capo cercando di risolvere il tutto e poi riposterò la nuova versione di codice pulita.Grazie ancora!
ioshi è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 19:10   #12
ioshi
Junior Member
 
Iscritto dal: Jan 2009
Messaggi: 17
Dopo un controllo del codice ed un debbugata ho trovato ma non risolto il problema prima esposto,cioè quando vado ad estrarre un elemento mi estra sempre l'ultimo fino a darmi coda vuota.
La funzione svolge correttamente il suo lavoro ma nel momento in cui ritorna al main nella variabile ute.numero rimane sempre l'ultimo valore salvato(nonostante lo passi per indirizzo) e quindi stampa sempre lo stesso...
Perchè????

Ultima modifica di ioshi : 16-01-2009 alle 19:53.
ioshi è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Overwatch: inizia una nuova era per il t...
Monitor gaming in super offerta su Amazo...
Nuove conferme sui prezzi dei Galaxy S26...
LG OLED 48'' in super offerta su Amazon:...
I MacBook Pro con M5 Pro/Max sono quasi ...
3 Scope elettriche top in offerta su Ama...
ARC Raiders chiude un mese da record: &e...
Droni DJI in offerta su Amazon: Mini 4K ...
La metà degli utenti di Steam usa...
Meta Quest 3S scende di prezzo su Amazon...
Handheld Android con display OLED a 144 ...
Il chip a 2 nm di Samsung tiene testa al...
1,13€ al mese a testa, meno di un caff&e...
Dreame L10s Ultra Gen 2 a prezzo bomba s...
Arm batte i record, ma il titolo crolla:...
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: 10:04.


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