Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* Aiuto per liste e puntatori...
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 12 Lug 2007 12:35    Oggetto: * Aiuto per liste e puntatori... Rispondi citando

Salve a tutti,
premetto che sono agli inizi in C/C++ .

In pratica vorrei risolvere un problema con delle liste per farle diventare dinamiche.
Mi spiego meglio.
------------------------------------------------------------------------

#define maxobj 10

typedef struct {
s32 x,y;
u8 object;
u8 attivo;

} objtype;
objtype obj[maxobj];

------------------------------------------------

dopo aver creato gli oggetti in questione:
------------------------------------------------------------------------

obj_num++;
obj[obj_num].object =100 ;
obj[obj_num].attivo =1;
------------------------------------------------------------------------

devo scorrere la lista di oggetti

------------------------------------------------------------------------
for(i=0; i <= maxobj ; i++) {
if(obj[i].attivo!=false){

//codice da eseguire .....


}
}

------------------------------------------------------------------------

ora il problema sta qui, se io volessi avere una lista dinamica e non legata ai 10 oggetti definiti all?inizio (#define maxobj 10) , cioè cancellare un elemento e scorrere la lista per i soli elementi attivi cosi da velocizzare il codice, in pratica nel ciclo for se ho solo un oggetto creato lui mi esegue sempre 10 cicli per il controllo, oltretutto vorrei anche aggiungere altri oggetti superando il limite di 10 definito prima, come devo fare??????

So che in qualche modo devo usare i puntatori ma non ho ben capito come? Sigh


Grazie in anticipo per l?aiuto? ^_^
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 12 Lug 2007 14:54    Oggetto: Re: Help Rispondi citando

Diegs ha scritto:
se io volessi avere una lista dinamica e non legata ai 10 oggetti definiti all’inizio (#define maxobj 10) , cioè cancellare un elemento e scorrere la lista per i soli elementi attivi cosi da velocizzare il codice, in pratica nel ciclo for se ho solo un oggetto creato lui mi esegue sempre 10 cicli per il controllo, oltretutto vorrei anche aggiungere altri oggetti superando il limite di 10 definito prima, come devo fare??????
So che in qualche modo devo usare i puntatori ma non ho ben capito come…


nel modo più semplice possibile, all'interno della tua struct che stai definendo aggiungi ancora un 'campo' puntatore ad objtype.
Ora definisci un puntatore (head?) a objtype che valga NULL. Quando creerai un elemento allora prima copierai il valore di head dentro il campo puntatore del nuovo elemento e poi scriverai dentro head l'indirizzo dell'elemento stesso: ecco che avrai una lista con 1 elemento.
Fai lo stesso lavoro con gli elementi successivi. A quel punto avrai una lista (unidirezionale, non ordinata) di elementi.
Li puoi 'scorrere' partendo da head e continuando attraverso il puntatore che avrai messo all'interno della struct...

cosa non ti è chiaro? Smile
Top
Profilo Invia messaggio privato HomePage
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 12 Lug 2007 14:57    Oggetto: Rispondi citando

In linea teorica mi è chiaro ...

Ma potrei chiederti di farmi un esempio usando la struttura che ho usato io... Te ne sarei infinitamente grato ..... (un esempio vale 1000 parole) Very Happy


SverX grazie per l'aiuto .. ^_^
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 12 Lug 2007 15:19    Oggetto: Rispondi citando

Diegs ha scritto:
potrei chiederti di farmi un esempio usando la struttura che ho usato io...


sono molto fuori allenamento con il C/C++ quindi prendi con le molle Wink

Codice:
typedef struct {
s32 x,y;
u8 object;
u8 attivo;
objtype* prossimo;
} objtype;

objtype* testa;
Top
Profilo Invia messaggio privato HomePage
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 12 Lug 2007 16:00    Oggetto: Rispondi citando

Doing .... Doing .... ho preso le molle ... si parte... Very Happy

in pratica :
----------------------------------
void newobject(s32,s32, objtype*);
void deleteobject(objtype*);

typedef struct {
s32 x,y;
u8 oggetto;
u8 attivo;
objtype* prossimo;
} objtype;

objtype* testa;

void newobject(s32 x, s32 y, objtype* object){
object->x=x;
object->y=y;
object->attivo=1;
object->oggetto++;
}

void deleteobject(objtype* delete){
delete->attivo=false;
delete->oggetto=-1;
//lo rimuovo così dalla lista????????????????
}

--------------------------------
E' corretto ???????????
---------------------------------

prima scorrevo la lista con :
for(i=0; i <= maxobj ; i++) {}

adesso come la devo scorrere????

Shocked

Grazie per le risposte SverX e scusami se ti faccio esaurire.
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 12 Lug 2007 16:25    Oggetto: Rispondi citando

io direi qualcosa del tipo:

Codice:
void newobject(s32 x, s32 y, objtype* object){
   object->x=x;
   object->y=y;
   object->attivo=1;
   object->prossimo=testa;
   // e poi aggiorni testa
   testa=object;
}


e per rimuoverlo non è facile: devi cercarlo scorrendo la lista e quando lo localizzi lo devi togliere dalla 'catena', facendo puntare il 'prossimo' del precedente al valore del 'prossimo' dell'elenco che volevi togliere...


edit: qui una buona lezione sulle liste Smile A pagina 4 già spiega cosa serve a te Very Happy
Top
Profilo Invia messaggio privato HomePage
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 12 Lug 2007 17:21    Oggetto: Rispondi citando

Che casotto ...
Non so se è + facile a dirlo che a farlo o viceversa o peggio nessuno dei due.. Very Happy

Adesso guardo il PDF che mi hai Linkato, vediamo cosa riesco a capire ...

Intanto comunque ti ringrazio di cuore per l'aiuto e per aver sopportato i miei spippolamenti mentali ... ^_^

Cmq per far capire meglio il problema, in pratica stavo lavorando (per passatempo) ad un gioco per Nintendo DS ... Anche perchè trovo il mirare la programmazione a qualcosa di divertente un modo migliore per imparare.

ho la mia bella lista di nemici che vengono creati ... e poi ho gli spari del mio Player ...

in pratica quando su schermo creo 30 spari e deve fare un controllo collisioni su 10 nemici, creo un ciclo pari a 300 controlli, avendo dichiarato in precedenza:

#define maxenemy 10
#define maxsparo 30

Anche quando effettivamente ho un solo nemico e un solo sparo ... creando un crollo momentaneo di FPS (che su nintendo DS si traduce in un attimo di schermo nero ).

ho fatto un timer per il controllo collisioni tra sparo ed enemy (controlla la collisione ogni tot ms) e adesso gira tutto meglio (senza crollo FPS).

Ma trovo inutile gestire dei cicli così grossi quando effettivamente c'è solo un nemico e solo un proiettile su schermo.

Mah forse avrei dovuto trattare il tutto con astrazione dei dati in classi, ma ancora non sono (non mi sento) così esperto nel usarle.

Allego uno screen del gioco ...

[/img]
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 13 Lug 2007 09:53    Oggetto: Rispondi citando

Diegs ha scritto:
Cmq per far capire meglio il problema, in pratica stavo lavorando (per passatempo) ad un gioco per Nintendo DS ... Anche perchè trovo il mirare la programmazione a qualcosa di divertente un modo migliore per imparare.


giuro che ti aiuto in quello che vuoi se mi insegni come si programma il Nintendo DS... scrivere videogiochi (per DOS) è stata la cosa più bella che ho mai fatto nella mia vita e non so cosa darei per ricominciare a fare videogiochi... davvero...

dimmi tutto: da dove inizio? Surprised
Top
Profilo Invia messaggio privato HomePage
Crono
Semidio
Semidio


Registrato: 24/03/05 14:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 13 Lug 2007 11:30    Oggetto: Rispondi citando

Invece di costruire una lista partendo da zero usa le funzioni per la creazione di liste incluse nella Standard Template Library del C++, in questo modo ti risparmi tutti i tipici problemi che insorgono quando si ha a che fare con i puntatori, ecco un esempio:

Codice:
#include<iostream>
#include<list>
#include<string>

using namespace std;

struct NODO {
 int ID;
 string str;
 NODO() {ID=0;}
};

void inst(list<NODO> &lst);
void insc(list<NODO> &lst);
void canc(list<NODO> &lst);
void vedi(list<NODO> &lst);

void main() {
 char scelta;
 list<NODO> lst; //dichiara una lista di elementi NODO
 while(scelta!='5') {
  cout<<"1) Inserisci elemento in testa"<<endl
      <<"2) Inserisci elemento in coda"<<endl
      <<"3) Cancella elemento"<<endl
      <<"4) Visualizza lista"<<endl
      <<"5) Esci"<<endl;
  cin>>scelta;
  switch(scelta) {
   case '1': inst(lst);
             break;
   case '2': insc(lst);
             break;
   case '3': canc(lst);
             break;
   case '4': vedi(lst);
             break;
   default : break;
  }
 }
}

void inst(list<NODO> &lst) {
 NODO nd;
 cout<<"Inserisci ID e str: ";
 cin>>nd.ID>>nd.str;
 lst.push_front(nd); //inserisce un elemento in testa alla lista
 cout<<endl;
}

void insc(list<NODO> &lst) {
 NODO nd;
 cout<<"Inserisci ID e str: ";
 cin>>nd.ID>>nd.str;
 lst.push_back(nd); //inserisce un elemento in coda alla lista
 cout<<endl;
}

void canc(list<NODO> &lst) {
 char scelta;
 //dichiara un iteratore e lo inizializza al primo elemento della lista
 list<NODO>::iterator it=lst.begin();
 while(it!=lst.end()) {
  cout<<"ID: "<<it->ID<<", str: "<<it->str<<endl
      <<"Vuoi cancellare questo elemento ? (s/n) ";
  cin>>scelta;
  switch(scelta) {
   //cancella l'elemento puntato da ii e restituisce un puntatore
   //all'elemento sucessivo a quello cancellato
   case 's': it=lst.erase(it);
             cout<<endl;
             return;
   case 'n': it++;
             break;
   default : break;
  }
 }
 cout<<endl;
}

void vedi(list<NODO> &lst) {
 for(list<NODO>::iterator it=lst.begin(); it!=lst.end(); it++)
  cout<<"ID: "<<it->ID<<", str: "<<it->str<<endl;
 cout<<endl;
}


Questo semplice programmino crea una lista bidirezionale ed esegue alcune semplici operazioni su di essa, gli iteratori utilizzati sono simili ai puntatori ma più "intelligenti", la funzione begin() restituisce un iteratore al primo elemento della lista mentre end() restituisce un iteratore all'ultimo elemento della lista.
Se ti interessa saperne di più su internet si trova un sacco di documentazione sulla STL
Top
Profilo Invia messaggio privato
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 12:19    Oggetto: Rispondi citando

Certo che ti dico tutto e con vero piacere ...

Per Game Boy Advance puoi usare HAM - sito ufficiale:
http://www.ngine.de/

Tutorial di utilizzo:
http://www.aaronrogers.com/ham/

è totalmente gratis per l homebrew e pagando 30$ puoi levare lo screen di intro e puoi produrci giochi commerciali.

Per il Nintendo DS - sito ufficiale (mi soffermo a parlare di questo):
http://www.palib.info

Help e Tutorial:
http://www.palib.info/wiki/

Compilando esce un file .NDS che puoi usare su emulatore o tramite cartuccia R4 (o simili) direttamente su DS (molto appagante ^_^).

Palib è una libreria in aggiunta al Devkitpro (http://www.devkitpro.org/) Devkitpro è un compilatore per videogiochi homebrew su console. Permette di compilare per le principali macchine videoludiche, come Nintendo DS, Gameboy Advance, Nintendo Gamecube, Game Park e PSP.

Sul sito trovi le librerie da downloadare ultima Ver. (PAlib 070615 Beta)

Puoi usare C o C++ e se guardi nel forum trovi PAlibTemplate che serve per creare progetti direttamente su Visual Studio 2005 anche in versione Express (quindi gratuita - lo puoi scaricare dal sito Microsoft) in alternativa puoi usare l'Editor che rilasciano loro (è lo stesso che usa HAM)

Specifiche tecniche DS:
- 2 Display (quello in basso con il touch è lo 0 e quello in alto si chiama 1)

- i display sono di dimensione 255x191 in pratica 31 x 23 in 8x8 pixel

- puoi utilizzare 2 modalità per gli sprite - 8 bit (256 colori) e 16 bit (65.000 colori) la più utilizzata è la prima

- supporta fino 16 palette a 256 colori (il GBA ne supportava solo una)

- il Tile (blocco) degli sprite è (8X8 - 16x8 - 16 x16 fino ad un Max di 64x64 ) ne puoi utilizzare a video fino a 128 Sprite, se devi usare tile + grandi puoi semplicemente affincarli (tramite array) e quindi costruirti dei Set di dimensione diversa.

- Supporta fino 4 Background con parallasse in tutte le direzioni, la cosa bella è (lo vedrai seguendo i tutorial) che una volta dovevi costruirti un TILE EDITOR per creare mondi alla Super Mario con PALIB puoi esportare direttamente in PNG (tramite il converter PAGfx) una Mappa lunga ad esempio 191x2048 e lui automaticamente la tagliera in blocchi da 8X8

- Per le collisioni usa un sistema a colori se segui l'esempio di Supermario vedrai che ti sarà chiaro immediatamente e lo stesso sistema lo si usa anche per posizionare oggetti e nemici.

- Per l'audio supporta fino a 16 canali in stereo (il GBA solo 8 ) per i suoni si esportano RAW (meglio se a 8 bit con un sample rate a 11025 ) ti consiglio di scaricare Switch per convertirli - Mentre per le musiche sono largamente usati i file .mod

- Ovviamente le funzioni di Palib utilizzano: il Pennino (Stylus) , il microfono per la voce ecc ecc..

- Hanno da poco aggiunto il supporto per gli sprite 3D

- Ci sono anche esempi di rudimenti di 3D (essenzialmente Primitive) - se sei + interessato all'argomento 3D devi aggiungere una libreria che trovi nel sito: http//:www.coconnor.co.uk/nds3d ed è completa di editor (a mio parere un pò troppo primitivo)

Cmq oltre a PALIB esiste anche una versione in LUAScript sito ufficiale: http://www.dslua.com/

che sconsiglio per tantissimi motivi (non stabile - performance basse - mancanza di molte funzioni ecc ecc)

Cmq le specifiche Hardware le trovi su:
http://it.wikipedia.org/wiki/Nintendo_DS

Per qualsiesi domanda o delucidazione o aiuto sono a tua/vostra disposizione... Very Happy
Top
Profilo Invia messaggio privato
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 12:33    Oggetto: Rispondi citando

Grazie per l'aiuto Crono,

in realtà era la direzione in cui mi ero mosso anch'io, il fatto è, che nel creare cicli di controllo a runtime [for(list<NODO>::iterator it=lst.begin(); it!=lst.end(); it++)] mi fa perdere FPS.

Stò cercando un sistema diverso, vi tengo aggiornati se ci riesco.

Ma se qualkuno vuole esporre idee che ben vengano. Very Happy
Top
Profilo Invia messaggio privato
Crono
Semidio
Semidio


Registrato: 24/03/05 14:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 13 Lug 2007 14:25    Oggetto: Rispondi citando

Ho condotto un piccolo test e il seguente codice è risultato un pò più veloce rispetto al ciclo for

Codice:
unsigned int i=0;
list<NODO>::iterator it=lst.begin();
while(i<lst.size()) {
 //codice da eseguire
 i++;
 it++;
}
Top
Profilo Invia messaggio privato
Crono
Semidio
Semidio


Registrato: 24/03/05 14:12
Messaggi: 224
Residenza: Trieste

MessaggioInviato: 13 Lug 2007 14:37    Oggetto: Rispondi citando

Ora mi è venuto in mente che puoi creare una ulteriore lista contenente gli indirizzi dei soli membri attivi e fare il ciclo solo su quest'ultima
Top
Profilo Invia messaggio privato
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 14:46    Oggetto: Rispondi citando

Penso di aver risolto ... guarda e dimmi cosa te ne sembra ...

Codice:

#include <iostream>
#include <cstdlib>
using namespace std;


struct lista {
    int val;
    lista *next;
};

int conta_lista=0; //contatore

 

 
void stampa(lista *p) {
    if(p != NULL) {
          cout << p -> val << ' ';
          stampa(p -> next);
    }
}
 


void inserisci(lista *&p, int x) {
 if(p == NULL) {
      p = new lista;
      p -> val = x;
      p -> next = NULL;
      conta_lista++; //contatore
    }
  else inserisci(p -> next,x);
}


void cancella(lista *&p, int x) {
 if(p != NULL) {
    if(p -> val== x){
          p=NULL;
          conta_lista--; //contatore
     }else{
     cancella(p -> next, x);
      }
}

void main() {
    lista *p = NULL;
    for(int i = 0; i < 10; i++) inserisci(p,i);
stampa(p);
cancella (p,5);
stampa (p);

}
Top
Profilo Invia messaggio privato
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 15:16    Oggetto: Rispondi citando

Mmmmmm non ci siamo .... GRRRRRRRRRRRRRR Very Happy
Top
Profilo Invia messaggio privato
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 15:47    Oggetto: Rispondi citando

OK funziona Ufffff....

Codice:

#include <iostream>
#include <cstdlib>
using namespace std;
 
struct lista {
     int val;
     lista *next;
};
 
void inserisci(lista *&p, int x) {
     if(p == NULL) {
           p = new lista;
           p -> val = x;
           p -> next = NULL;
     }
     else inserisci(p -> next,x);
}
 
void stampa(lista *p) {
     if(p != NULL) {
           cout << p -> val << ' ';
           stampa(p -> next);
     }
}
 
void cancella(lista *&p, int x) {
     if(p != NULL) {
           if(p -> val == x) {
                 p = p -> next;
                 return;
           }
           else cancella(p -> next, x);
     }
}
 
int num_elem(lista *p) {
     if(p == NULL) return 0;
     return 1 + num_elem(p -> next);
}
 
void main() {
     int x;
     int n;
     lista *p = NULL;
 
     for(int i = 0; i < 10; i++) inserisci(p,i);
     n = num_elem(p);
     stampa(p);
     cout <<"\n Elements: " << n;
 
     cout <<"\n x = "; cin >> x;
     cancella(p,x);
     n = num_elem(p);
     stampa(p);
     cout <<"\n Elements: " << n;
 
     cout << '\n'; system("pause");
}
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 13 Lug 2007 15:56    Oggetto: Rispondi citando

Diegs ha scritto:
Certo che ti dico tutto e con vero piacere ...


fantastico... mi ci butto a capofitto Smile grazie Very Happy
Top
Profilo Invia messaggio privato HomePage
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 16:11    Oggetto: Rispondi citando

Se hai bisogno non esitare a chiedere ... Very Happy

Per iniziare ti consiglio un buon sito dove trovare sprite:

http://sdb.drshnaps.com/index.htm

Se ti interessano alte Info su altri engine 2D/3D chiedi pure. ^_^
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 13 Lug 2007 16:14    Oggetto: Rispondi citando

Diegs ha scritto:
Se hai bisogno non esitare a chiedere ...


ah non sai in che guaio rischi di metterti... Wink

Diegs ha scritto:
Per iniziare ti consiglio un buon sito dove trovare sprite


...credo invece che sentirò i miei storici collaboratori e vediamo che ne dicono Wink
Top
Profilo Invia messaggio privato HomePage
Diegs
Mortale devoto
Mortale devoto


Registrato: 12/07/07 12:17
Messaggi: 14

MessaggioInviato: 13 Lug 2007 17:43    Oggetto: Rispondi

Citazione:
ah non sai in che guaio rischi di metterti... Wink


No problem --- No problem ... Very Happy

Cmq il gioco che stò facendo su DS lo avevo fatto in 3D per PC ...

Ma non era un gioco adatto per PC e quindi ci siamo spostati su DS.

Se vuoi dare un occhiata al video del gioco nella versione 3D puoi scaricarlo da:
http://www.torabyte.com/videoreel/sb.rar

okkio che è 65 MB

e poi c'è la recensione apparsa questo mese sul num di TGM in TalentZone se vuoi dare un occhiata:

http://www.torabyte.com/videoreel/recensione.rar

[/quote]
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi