freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Αλλαγή τρόπου ταξινόμησης


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [9 Μηνύματα]       Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
santi mavropoulou


Μέλος από: 28 Μαη 2008
Μηνύματα: 5

View users profile Send email to user
ΜήνυμαΣτις: 28 Μαη 2008 06:30    Θέμα: Αλλαγή τρόπου ταξινόμησης Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σας,με αυτόν τον κώδικα η λίστα ταξινομείται βάση διεύθυνσης
κώδικας:

/*===========================================================================* 
 *                       free_mem                            * 
 *===========================================================================*/
PUBLIC void free_mem(base, clicks)                                  
phys_clicks base;            /* base address of block to free */         
phys_clicks clicks;          /* number of clicks to free */             
{                                                            
/* Return a block of free memory to the hole list.  The parameters tell where   
 * the block starts in physical memory and how big it is.  The block is added   
 * to the hole list.  If it is continuous with an existing hole on either end, 
 * it is merged with the hole or holes.                              
 */                                                         
                                                            
  register struct hole *hp, *new_ptr, *prev_ptr;                        
                                                            
  if (clicks == 0) return;                                        
  if ( (new_ptr = free_slots) == NIL_HOLE) panic("Hole table full", NO_NUM);   
  new_ptr->h_base = base;                                          
  new_ptr->h_len = clicks;                                        
  free_slots = new_ptr->h_next;                                    
  hp = hole_head;                                                
                                                            
  /* If this block's address is numerically less than the lowest hole currently
   * available, or if no holes are currently available, put this hole on the   
   * front of the hole list.                                       
   */                                                         
  if (hp == NIL_HOLE || base <= hp->h_base)
  {                           
      /* Block to be freed goes on front of the hole list. */            
      new_ptr->h_next = hp;                                       
      hole_head = new_ptr;                                       
      merge(new_ptr);                                          
      return;                                                
  }                                                         
                                                            
  /* Block to be returned does not go on front of hole list. */            
  while (hp != NIL_HOLE && base > hp->h_base)
  {                        
      prev_ptr = hp;                                           
      hp = hp->h_next;                                          
  }                                                         
                                                            
  /* We found where it goes.  Insert block after 'prev_ptr'. */            
  new_ptr->h_next = prev_ptr->h_next;                                 
  prev_ptr->h_next = new_ptr;                                       
  merge(prev_ptr);           /* sequence is 'prev_ptr', 'new_ptr', 'hp' */   
}                                                            

/*===========================================================================* 
 *                       merge                              * 
 *===========================================================================*/
PRIVATE void merge(hp)                                           
register struct hole *hp;      /* ptr to hole to merge with its successors */ 
{                                                            
 /* Check for continuous holes and merge any found.  Continuous holes can occur 
 * when a block of memory is freed, and it happens to abut another hole on    
 * either or both ends.  The pointer 'hp' points to the first of a series of   
 * three holes that can potentially all be merged together.               
 */                                                         
                                                            
  register struct hole *next_ptr;                                    
                                                            
  /* If 'hp' points to the last hole, no merging is possible.  If it does not, 
   * try to absorb its successor into it and free the successor's table entry. 
   */                                                         
  if ( (next_ptr = hp->h_next) == NIL_HOLE) return;                     
  if (hp->h_base + hp->h_len == next_ptr->h_base)
  {                     
      hp->h_len += next_ptr->h_len;   /* first one gets second one's mem */   
      del_slot(hp, next_ptr);                                    
  } else
  {                                                    
      hp = next_ptr;                                           
  } 
                                                         
  /* If 'hp' now points to the last hole, return; otherwise, try to absorb its 
   * successor into it.                                          
   */                                                         
  if ( (next_ptr = hp->h_next) == NIL_HOLE) return;                     
  if (hp->h_base + hp->h_len == next_ptr->h_base)
  {                     
      hp->h_len += next_ptr->h_len;                                 
      del_slot(hp, next_ptr);                                    
  }                                                         
}                                        

Αυτό που προσπάθησα παρακάτω είναι να αλλάξω τον τρόπο ταξινόμησης ώστε η λίστα να ταξινομείται με βάση το μέγεθος.Είναι αρκετό;
κώδικας:

/*===========================================================================* 
 *                       free_mem                            * 
 *===========================================================================*/
PUBLIC void free_mem(base, clicks)                                  
phys_clicks base;            /* base address of block to free */         
phys_clicks clicks;          /* number of clicks to free */             
{                                                            
/* Return a block of free memory to the hole list.  The parameters tell where   
 * the block starts in physical memory and how big it is.  The block is added   
 * to the hole list.  If it is continuous with an existing hole on either end, 
 * it is merged with the hole or holes.                              
 */                                                         
                                                            
  register struct hole *hp, *new_ptr, *prev_ptr;                        
                                                            
  if (clicks == 0) return;                                        
  if ( (new_ptr = free_slots) == NIL_HOLE) panic("Hole table full", NO_NUM);   
  new_ptr->h_base = base;                                          
  new_ptr->h_len = clicks;                                        
  free_slots = new_ptr->h_next;                                    
  hp = hole_head;                                                
                                                            
  /* If this block's address is numerically less than the lowest hole currently
   * available, or if no holes are currently available, put this hole on the   
   * front of the hole list.                                       
   */                                                         
  if (hp == NIL_HOLE || clicks <= hp->h_len)
  {                           
      /* Block to be freed goes on front of the hole list. */            
      new_ptr->h_next = hp;                                       
      hole_head = new_ptr;                                       
      merge(new_ptr);                                          
      return;                                                
  }                                                         
                                                            
  /* Block to be returned does not go on front of hole list. */            
  while (hp != NIL_HOLE && clicks > hp->h_len)
  {                        
      prev_ptr = hp;                                           
      hp = hp->h_next;                                          
  }                                                         
                                                            
  /* We found where it goes.  Insert block after 'prev_ptr'. */            
  new_ptr->h_next = prev_ptr->h_next;                                 
  prev_ptr->h_next = new_ptr;                                       
  merge(prev_ptr);           /* sequence is 'prev_ptr', 'new_ptr', 'hp' */   
}                                                            

/*===========================================================================* 
 *                       merge                              * 
 *===========================================================================*/
PRIVATE void merge(hp)                                           
register struct hole *hp;      /* ptr to hole to merge with its successors */ 
{                                                            
 /* Check for continuous holes and merge any found.  Continuous holes can occur 
 * when a block of memory is freed, and it happens to abut another hole on    
 * either or both ends.  The pointer 'hp' points to the first of a series of   
 * three holes that can potentially all be merged together.               
 */                                                         
                                                            
  register struct hole *next_ptr;                                    
                                                            
  /* If 'hp' points to the last hole, no merging is possible.  If it does not, 
   * try to absorb its successor into it and free the successor's table entry. 
   */                                                         
  if ( (next_ptr = hp->h_next) == NIL_HOLE) return;                     
  if (hp->h_base + hp->h_len == next_ptr->h_len)
  {                     
      hp->h_len += next_ptr->h_len;   /* first one gets second one's mem */   
      del_slot(hp, next_ptr);                                    
  }
  else
  {                                                    
      hp = next_ptr;                                           
  } 
                                                         
  /* If 'hp' now points to the last hole, return; otherwise, try to absorb its 
   * successor into it.                                          
   */                                                         
  if ( (next_ptr = hp->h_next) == NIL_HOLE) return;                     
  if (hp->h_base + hp->h_len == next_ptr->h_len)
  {                     
      hp->h_len += next_ptr->h_len;                                 
      del_slot(hp, next_ptr);                                    
  }                                                         
}                              
NIKOS NAXOS


Μέλος από: 31 Μαη 2008
Μηνύματα: 2

View users profile
ΜήνυμαΣτις: 31 Μαη 2008 16:01    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σου Σαντη

Πιστευω οτι η αλλαγη που εχεις κανει στην free_mem ειναι σωστη ομως στη merge δεν ειναι σωστη καθοσον στην merge οι νεοι κομβοι(ελευθερες μνημες) της λιστας που προκυπτουν απο τη συνγχωνευση παραμενουν στη σωστη θεση ταξινομημενοι με κλειδι το h_base και αρα ο ηδη υπαρχων κωδικας δεν ενδιαφερεται καθολου για την ταξινομηση τους οπως γινεται στη free_mem.Αρα εδω πρεπει να προσθεσοθμε κωδικα και οχι ναλλαξουμε.
Εγω νομιζω οτι πρεπει να γινει μια διδικασια sort(hp) στη νεα λιστα που εφτiαξε η merge με κλειδι το h_len την οποια να καλω μετα την del_slot μεσα στη merge.

Εσυ τι λες υπαρχει κατι πιο ευκολο
santi mavropoulou


Μέλος από: 28 Μαη 2008
Μηνύματα: 5

View users profile Send email to user
ΜήνυμαΣτις: 01 Ιουν 2008 07:58    Θέμα: Αλλαγή τρόπου ταξινόμησης Απάντηση με παράθεση  Mark this post and the followings unread

Δεν είμαι καθόλου σίγουρη για την Merge,όντως,στην free_mem νομίζω πως έχω κάνει τις σωστές αλλαγές.Η μόνη αλλαγή που έκανα στην Merge είναι:

...................
if (hp->h_base + hp->h_len == next_ptr->h_len)
...................

NIKOS NAXOS ευχαριστώ,κάτι τέτοιο κάτω από την πρώτη del_slot εννοείς;

void swap (int v[], int i, int j)
{
int temp;
temp=v[i];
v[i]=v[j];
v[j]=temp;
}

void qsort(int v[], int left, int right)
{
int i, last;
void swap(int v[], int i, int j);
if (left >= right)
return;
swap(v, left, (left+right)/2);
last=left;
for (i=left+1; i<=right; i++)
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last-1);
qsort(v, last+1, right);
}

main()
{

int v[];
qsort(v, 0, NR_HOLES (2*NR_PROCS));
}
NIKOS NAXOS


Μέλος από: 31 Μαη 2008
Μηνύματα: 2

View users profile
ΜήνυμαΣτις: 01 Ιουν 2008 17:19    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σου Σαντη
Βλεπω βασανιζεσαι κ εσυ .
Κοιταξε δεν θελω να σε παρασυρω απλως τη γνωμη μου σου λεω.
Η ταξινομηση λιστας δεν ειναι ευκολο πραγμα και ειδικα να την προσαρμοσης εδω.
Τι εξαμηνο εισαι
Εαν καταληξω καπου δωσε μου το mail σου στο info@naxos-villaflora.com να σου πω.
Παντως κι εγω ταλαιπωρουμε και δεν ξερω αν παει χαμενος ο κοπος.
santi mavropoulou


Μέλος από: 28 Μαη 2008
Μηνύματα: 5

View users profile Send email to user
ΜήνυμαΣτις: 01 Ιουν 2008 17:41    Θέμα: Αλλαγή τρόπου ταξινόμησης Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σου Νίκο,σου έχω στείλει το email μου,σου έστειλα και προσωπικό μήνυμα το πρωί,δεν ξέρω αν έκανες login να το δεις.Πάντως απ'ότι έψαξα μανιωδώς και κατάλαβα τελικά,έχεις πέσει διάνα σε αυτό που είπες,δηλαδή όντως ο έλεγχος για το διαδοχικό πλαίσιο πρέπει να γίνει εν συγκρίσει με την επόμενη διεύθυνση.Κι επίσης όντως χρειάζεται μια συνάρτηση ταξινόμησης κάτω από τις 2 del_slot,νομίζω,για να τοποθετήσει και τον συγχωνευμένο κόμβο-κόμβους στη θέση τους.Πάντως σίγουρα έχεις καταλήξει κάπου πολύ καλύτερα από μένα,δείχνεις τρομερά έμπειρος για να είπες αυτά με την πρώτη.Ή εγώ θέλω πολύ δουλειά ακόμα!Αν δεν έχεις πρόβλημα,στείλε μου κάτι,ευχαριστώ.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 02 Ιουν 2008 04:54    Θέμα: Re: Αλλαγή τρόπου ταξινόμησης Απάντηση με παράθεση  Mark this post and the followings unread

Πάτρα ή Ιωάννινα;;
santi mavropoulou


Μέλος από: 28 Μαη 2008
Μηνύματα: 5

View users profile Send email to user
ΜήνυμαΣτις: 02 Ιουν 2008 12:40    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σου soteres2002,αν εννοείς από που είναι αυτή η εργασία,από το Ηράκλειο.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 03 Ιουν 2008 16:30    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

santi mavropoulou ανέφερε:
Γεια σου soteres2002,αν εννοείς από που είναι αυτή η εργασία,από το Ηράκλειο.


Ααα, μου φάνηκε σαν chunk από τον κώδικα του kernel του Minix και λέω κάποιος από το Πανεπιστήμιο Ιωαννίνων ή της Πατρας πόσταρε. Απλη περιέργεια... Τελικά, και στο Πανεπ. τσι Κρήτης κάνετε Μinix απ' ότι φαίνεται...
santi mavropoulou


Μέλος από: 28 Μαη 2008
Μηνύματα: 5

View users profile Send email to user
ΜήνυμαΣτις: 04 Ιουν 2008 22:45    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Πολύ καλά σου φάνηκε,ακριβώς αυτό είναι!Μόνο που είναι από το Τει Ηρακλείου
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [9 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 27 Μαρ 2017 16:26 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos