Προς το περιεχόμενο

Accessing struct members - C


Dr.Fuzzy

Προτεινόμενες αναρτήσεις

Επανέρχομαι μιας και το είχα αφήσει λόγο άλλων ασχολιών. Λοιπόν μου δούλεψε κάνοντας return το struct.

 

>
struct single_ant* ants_place(struct TSP_data *problem)
{
 int i;
 int r;
 srand(time(NULL)); /* randomness depends on time */
 struct single_ant *ants;

 ants = (struct single_ant *) malloc(problem->n * sizeof (struct single_ant)); /* allocate placement memory (n int elements) dynamically */

 for (i = 0; i < problem->n; i++)
 {
   ants[i].tour = (int *) malloc(problem-> n * sizeof (int));
   ants[i].visited = (int *) malloc(problem-> n * sizeof (int));
 }
 // debug
 if (ants != 0)
 {
   printf("Allocation of %ld bytes for the initial ants placement was successful\n\n", problem->n * sizeof (int));
 }
 else
 {
   fprintf(stderr, "\nERROR: Attempt to allocate %ld bytes for the initial ants placement failed !\n", problem->n * sizeof (int));
   exit(1);
 }

 /* place ants randomly */
 for (i = 0; i < problem->n; i++)
 {
   r = rand() % (problem->n - 1) + 1;
   /* since path is from nest to food use nodes-1 to place ants to all nodes 
      except the target (food) node */
   ants[i].tour[0] = r;
 }
  return ants;
}

 

και στην main

 

>struct single_ant *ants;

ants = ants_place(&problem);

for (i = 0; i < problem.n; i++)
{
 printf("ith ant placement: %d\n", *ants[i].tour); // debug
}

 

Δυστυχώς δεν κατάφερα να βγάλω άκρη γιατί δεν δούλευε σωστά με πέρασμα του ants by ref...?

 

:-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 85
  • Δημ.
  • Τελ. απάντηση

Αυτο δλδ σου δουλευει κανονικα , χωρις κανενα προβλημα ; Ουτε καποιο παραπονο απο compiler ;

 

main :

>
....

for (i = 0; i < problem.n; i++)
{
 printf("ith ant placement: %d\n", *ants[i].tour); // debug
}  

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι, ακόμα και με -Wall στον gcc τίποτα.

Θα σκάσω όμως αν δε βρω γιατί δεν μου δούλεψε σωστά με pass by reference!:shifty:

Καπου μπερδευτηκες με τα dereference. Ισος σε μπερδεψα εγω, επειδη χρησιμοποιησα 2 διαφορετια dereference αντι ενος. πχ αντι του obj[0][n] εκανα (*obj)[n] :rolleyes:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καπου μπερδευτηκες με τα dereference. Ισος σε μπερδεψα εγω, επειδη χρησιμοποιησα 2 διαφορετια dereference αντι ενος. πχ αντι του obj[0][n] εκανα (*obj)[n] :rolleyes:

 

:-D πριν δεν νομίζω! Τώρα όντως μπερδεύτηκα, pls κάνε αν δε βαριέσαι post πάνω στο function μου για να καταλάβω. :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ισος σε βοηθησουν μερικα defs

>//help defs
#define REF *       // pass by reference
#define DEREF(X) (*X) // mporeis na baleis kai DEREF(X) X[0]

void ants_place(
struct TSP_data REF problem, 
	//an kai den einai anangeo afoy den allazei mesa apo th func

struct single_ant REF *ants
	//pass by ref enan "pinaka" apo single_ants
)
{
//helps defs
//to ANTS_ARRAY einai to deference apo to ants
#define ANTS_ARRAY DEREF(ants)

 int i;
 int r;
 srand(time(NULL)); /* randomness depends on time */
 ANTS_ARRAY = (struct single_ant *) malloc(problem->n * sizeof (struct single_ant)); /* allocate placement memory (n int elements) dynamically */

 for (i = 0; i < problem->n; i++)
 {
   ANTS_ARRAY[i].tour = (int *) malloc(problem-> n * sizeof (int));
   ANTS_ARRAY[i].visited = (int *) malloc(problem-> n * sizeof (int));
 }
 // debug
 if (ANTS_ARRAY != 0)
 {
   printf("Allocation of %ld bytes for the initial ants placement was successful\n\n", problem->n * sizeof (int));
 }
 else
 {
   fprintf(stderr, "\nERROR: Attempt to allocate %ld bytes for the initial ants placement failed !\n", problem->n * sizeof (int));
   exit(1);
 }

 /* place ants randomly */
 for (i = 0; i < problem->n; i++)
 {
   r = rand() % (problem->n - 1) + 1;
   /* since path is from nest to food use nodes-1 to place ants to all nodes 
      except the target (food) node */
   ANTS_ARRAY[i].tour[0] = r;
 }
#undef ANTS_ARRAY
} 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι, ακόμα και με -Wall στον gcc τίποτα.

Θα σκάσω όμως αν δε βρω γιατί δεν μου δούλεψε σωστά με pass by reference!:shifty:

 

Δεν σου βγαζει κατι σαν - makes pointer fromm integer without a cast - ;

Του λες να τυπωσει στην οθονη εναν ακεραιο , αλλα εσυ του δινεις δεικτη σε ακεραιο.Επισης αν το αφησεις με το return , ( μια χαρα μου φαινεται η συναρτηση...) ειναι περα για περα λαθος να γραφεις *ants.tour.Μαλλον εχεις μπερδευτει με τους δεικτες......

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

thanks @Evgenios1, ενταξει τα defs δεν είναι αναγκαία, το καταλαβαίνω. Απλά λέω ότι στο παραπάνω παράδειγμα με pass by ref στα ants δεν μου δούλευε σωστά.

 

@Luffy-san, όχι δεν παίρνω κάτι τέτοιο. Όπως το λες βέβαια δίκιο έχεις. Εγώ σκέφτηκα ότι κάνω dereference και τυπώνω το object ants.tour, το οποίο δουλεύει βέβαια. Πώς θα έπρεπε να είναι;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

βλεπω οτι μεσα στην place_ants δευσμευεις problem.n ακεραιους και βαζεις στη πρωτη θεση το τυχαιο αριθμο r.Αν θελεις μεσα στη main να τυπωσεις αυτο το r που υπαρχει στη ΠΡΩΤΗ θεση του tour πρεπει να το γραψεις - printf( "......%d" , ants.tour[0] );

Αν θελεις να τυπωσεις ολους ακεραιους του tour , θα πρεπει να βαλεις και ενα ακομα for, κατι που βεβαια θα ειναι καπως ακυρο γιατι θα τυπωσεις σκουπιδια.

 

Διορθωσε με αν κανω λαθος και δεν ζητας κατι τετοιο :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πρόσεξε, το όλο θέμα θα μπορούσα να το χειριστώ έχοντας δυο 2D pointer arrays, π.χ., int **ant_tours και **ants_visited. Για να είναι πιο human linguistic ο κώδικας το περιγράφω ως εξής,

 

struct single_ant

{

int tour_length; /* the ant's tour length */

int *tour; /* ant's memory storing (partial) tours */

int *visited; /* visited cities */

};

 

και

 

struct single_ant *ants;

 

οπότε

 

ant[2].tour[0] = 1 σημαίνει ότι π.χ., το ant[2] στο tour[0] έχει βάρος 1 ή random και είναι το ίδιο με ant_tour[2][0] = 1. Όπως και να έχει δηλαδή και στις δύο περιπτώσεις μιλάμε για ένα 2D array (καλά καλά! pointer σε pointer το ξέρω ότι δεν είναι to ίδιο με array).

 

Οπότε ίσως το λάθος στην υλοποίηση αν υπάρχει, να είναι ο τρόπος με τον οποίο κάνω assign τα βάρη ή τις random τιμές στη συγκεκριμένη περίπτωση. Δεν το ξέρω! Αν πάντως κάνω όπως λες printf("...%d", ants.tour[0]) αντί για printf("...%d", *ants.tour) το αποτέλεσμα είναι το ίδιο, δουλεύει μια χαρά δηλαδή (στη δικιά μου περίπτωση κάνω deref. to tour οπότε παίρνω το object που κοιτάει στη θέση 0).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διάβασα το νήμα αλλά ομολογώ ότι την έχασα τη μπάλα και δεν καταλαβαίνω αυτή τη στιγμή που έγγυται το πρόβλημα. Ήθελα απλά να προσθέσω ότι είναι λογικό να ισοδυναμούν τα *ants.tour και ants.tour[0]. Έχει να κάνει αφ'ενός με το γεγονός ότι οι τελεστές '[]' και '.' έχουν προτεραιότητα σε σχέση με τον '*' και αφ'ετέρου με το ότι κάνοντας dereference έναν πίνακα είναι σαν να παίρνεις το πρώτο του στοιχείο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...