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

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

Δημοσ.
class node
{
public:
        node(int);
        ~node();
}

Το παραπάνω είναι ένας constructor με παράμετρο int και ένας deconstructor...

 

Σου ξαναλέω ότι θες μέσα στην node και το node() δηλαδή έναν constructor χωρίς καμία παράμετρο.

 

Νομίζω οτι κατάλαβα. Μηπώς μπόρεις να μου απαντήσεις τι είναι αυτό που πέρνω απο τον compiler σαν λάθος?

 

*** glibc detected *** a.out: double free or corruption (fasttop): 0x09206008 ***

======= Backtrace: =========

/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xac9ee2]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0x8ee51f]

a.out[0x8048d0a]

a.out[0x804897c]

/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xa6d4d3]

a.out[0x8048801]

======= Memory map: ========

0059b000-005b7000 r-xp 00000000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

005b7000-005b8000 r--p 0001b000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

005b8000-005b9000 rw-p 0001c000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

0070f000-00710000 r-xp 00000000 00:00 0          [vdso]

00845000-0091d000 r-xp 00000000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

0091d000-0091e000 ---p 000d8000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

0091e000-00922000 r--p 000d8000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

00922000-00923000 rw-p 000dc000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

00923000-0092a000 rw-p 00000000 00:00 0

00a54000-00bf8000 r-xp 00000000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bf8000-00bfa000 r--p 001a4000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bfa000-00bfb000 rw-p 001a6000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bfb000-00bfe000 rw-p 00000000 00:00 0

00e26000-00e46000 r-xp 00000000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00e46000-00e47000 r--p 0001f000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00e47000-00e48000 rw-p 00020000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00eea000-00f14000 r-xp 00000000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

00f14000-00f15000 r--p 00029000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

00f15000-00f16000 rw-p 0002a000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

08048000-0804a000 r-xp 00000000 00:15 4164234    /home/users1/std10218/a.out

0804a000-0804b000 r--p 00001000 00:15 4164234    /home/users1/std10218/a.out

0804b000-0804c000 rw-p 00002000 00:15 4164234    /home/users1/std10218/a.out

09206000-09227000 rw-p 00000000 00:00 0          [heap]

b770f000-b7712000 rw-p 00000000 00:00 0

b7721000-b7726000 rw-p 00000000 00:00 0

bfd8b000-bfdac000 rw-p 00000000 00:00 0          [stack]

Abort (core dumped)

 

μου το βγάζει κάποιες φορές και κάποιες άλλες μου εκτέλει κανονικά το πρόγραμμα..εχω μπερδευτεί.

Δημοσ.

Νομίζω οτι κατάλαβα. Μηπώς μπόρεις να μου απαντήσεις τι είναι αυτό που πέρνω απο τον compiler σαν λάθος?

 

*** glibc detected *** a.out: double free or corruption (fasttop): 0x09206008 ***

======= Backtrace: =========

/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xac9ee2]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0x8ee51f]

a.out[0x8048d0a]

a.out[0x804897c]

/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xa6d4d3]

a.out[0x8048801]

======= Memory map: ========

0059b000-005b7000 r-xp 00000000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

005b7000-005b8000 r--p 0001b000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

005b8000-005b9000 rw-p 0001c000 08:01 1067252    /lib/i386-linux-gnu/libgcc_s.so.1

0070f000-00710000 r-xp 00000000 00:00 0          [vdso]

00845000-0091d000 r-xp 00000000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

0091d000-0091e000 ---p 000d8000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

0091e000-00922000 r--p 000d8000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

00922000-00923000 rw-p 000dc000 08:01 85360      /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16

00923000-0092a000 rw-p 00000000 00:00 0

00a54000-00bf8000 r-xp 00000000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bf8000-00bfa000 r--p 001a4000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bfa000-00bfb000 rw-p 001a6000 08:01 1067462    /lib/i386-linux-gnu/libc-2.15.so

00bfb000-00bfe000 rw-p 00000000 00:00 0

00e26000-00e46000 r-xp 00000000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00e46000-00e47000 r--p 0001f000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00e47000-00e48000 rw-p 00020000 08:01 1067013    /lib/i386-linux-gnu/ld-2.15.so

00eea000-00f14000 r-xp 00000000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

00f14000-00f15000 r--p 00029000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

00f15000-00f16000 rw-p 0002a000 08:01 1067299    /lib/i386-linux-gnu/libm-2.15.so

08048000-0804a000 r-xp 00000000 00:15 4164234    /home/users1/std10218/a.out

0804a000-0804b000 r--p 00001000 00:15 4164234    /home/users1/std10218/a.out

0804b000-0804c000 rw-p 00002000 00:15 4164234    /home/users1/std10218/a.out

09206000-09227000 rw-p 00000000 00:00 0          [heap]

b770f000-b7712000 rw-p 00000000 00:00 0

b7721000-b7726000 rw-p 00000000 00:00 0

bfd8b000-bfdac000 rw-p 00000000 00:00 0          [stack]

Abort (core dumped)

 

μου το βγάζει κάποιες φορές και κάποιες άλλες μου εκτέλει κανονικά το πρόγραμμα..εχω μπερδευτεί.

 

Αυτό είναι βρισιές! Πολλές βρισιές μαζεμένες μαζί.

 

Έχεις κάπου κάποια περίεργη free για λάθος θέση μνήμης;

Για πρόσεξε όπου έχεις πράξη με pointers τί προσπελαύνεις.

Είναι σίγουρο ότι πατάς σε μνήμη που δε σου ανήκει.

Για post-αρε όλο τον κώδικα.

Τρέξε και ένα gdb και μόλις σε βρίσει τρέξε την εντολή bt για να δεις από που προέρχεται το πρόβλημα.

Δημοσ.

έχω βρεί οτι γίνετε στην παρακάω συναρτηση γιατί όταν δεν την χρησιμοποώστο πρόγραμμα δεν ου εμφάνιζει αυτο το μύνημα:

void node::resume()
{
    node *h = head;

    int number = head->id;

    head->id = head->next->id;

    node *current = head->next;

    while(current!=tail){

        current->id = current->next->id;
        current = current->next;

    }

    current->id = number;

}

δε βρήσκω καποιό λάθος όμως για κοιτάξτε την και εσείς! εντωμεταξύ την πόσταρε ο bluezy

Δημοσ.

Αν μπορείς κάνε τον κόπο να ποστάρεις ό,τι έχεις γράψει γιατί προσπαθώ να συνδέσω τα προηγούμενα μηνύματα και μπερδεύομαι. Έχω κάποιες ερωτήσεις πάνω στον κώδικα όταν το δω όλο.

Δημοσ.

είναι λιγο μεγάλο...λοιπόν αυτή είναι η main2.cpp:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "class2.h"

using namespace std;


int main( int argc, char* argv[] )
{
	int K,i,times=0,N;

	N = atoi(argv[1]);

	node players;

	srand(time(0));

	for( i = 0; i < N; i++ )
	players.create_chain();

	cout << "The game begins!!" << endl;


	while( 1 )
	{

		if( players.size == 1 )
			break;

		K = 1 + rand()%10;

		while( times < K )
		{
			cout << "Drum hit!" << endl;
			players.hit();
			times++;
		}

			times = 0;

		cout << "Drum stoped!" << endl;
		players.stop_tune();

		cout << "The current players is:" << endl;
		players.print_chain();

	}

	if( players.game_over() == true )
		players.winner();

	return 0;
}

αυτή είναι η class2.cpp:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "class2.h"

using namespace std;

node::node():size(0),head(0),tail(0)
{

}


void node::create_chain()
{

	node *temp = new node;

	cout << "Give the player id: ";
	cin >> temp -> id;

	temp -> next = 0;

	if ( head != NULL && tail != NULL )
	{
		tail->next = temp;
		tail = temp;
	}
	else
	{
		head = temp;
		tail = temp;
	}

size++;

}

void node::print_chain()
{
	node *h = head;

	while ( h != NULL )
	{
		cout << h->id << endl;
		h = h->next;
	}

}

void node::hit()
{

        int number = head->id;

        head->id = head->next->id;

        node *current = head->next;

        while(current!=tail)
	{

        	current->id = current->next->id;
        	current = current->next;

        }

    	current->id = number;

}

void node::stop_tune()
{

node *h = head;
node *temp = head;
int i = 1;

srand(time(0));

int selected = 1 + rand()%size;//take a random position

while ( h != NULL )
	{
		if ( i  == selected )//if we reach the position tha was selected
		{
			break;
		}
		else if ( h == temp )
		{
			h = h->next;
		}
		else
		{
			temp = temp->next;
			h = temp->next;
		}
	i++;//increase position

	}

		if ( h == NULL )
		{
			cout << "Not found" << endl;
			return;
		}
		else
		{
			temp -> next = temp -> next -> next;
			cout << "The player with id " << h->id << " in position " << i << " deleted!" << endl;
			delete h;
		}

	size--;
	cout << "The current size of chain is: " << size << endl;

}

int node::game_over()
{
	node *h = head;
	int i = 0;

	while( h != NULL )
	{
		h = h->next;
		i++;
	}

	if( i == 1)
	{
		cout << "Game Over!" << endl;
		return true;
	}
	else
	{
		cout << "Game is not over!" << endl;
		return false;
	}
}

void node::winner()
{
	cout << "The winner is the player with id " << head->id << "!" << endl;
}

και τέλος η class2.h:

class node{
	public:

		node();

		int size;

		void create_chain();
		void print_chain();
		void hit();
		void stop_tune();
		int game_over();
		void winner();

	private:

		int id;

		node *next;
		node *head;
		node *tail;
	};


Δημοσ. (επεξεργασμένο)

Όσες φορές το έτρεξα και όσες φορές μου έσκασε, φάνηκε να φταίει αυτή εδώ η μέθοδος:

void node::hit()
{
        int number = head->id;

        head->id = head->next->id;

        node *current = head->next;

        while(current!=tail)
	{

        	current->id = current->next->id; // polu upopto!!!
        	current = current->next;         // polu upopto!!!

        }

    	current->id = number;

}

Δε σου σκάει πάντα γιατί το πρόγραμμά σου βασίζεται στην τυχαιότητα (srand, rand).

 

Δε ξέρω τί ακριβώς θέλεις να υλοποιήσεις. Εγώ κατάλαβα ότι θέλεις να κάνεις ένα παιχνίδι σε στυλ μουσικές καρέκλες (ή ρώσικη ρουλέτα), όπου ο κάθε κόμβος κάθεται σε ένα κόμβο.

 

Έστω ότι έχουμε 4 κόμβους-παίχτες:

  • αρχικά ελέγχεις αν έχει μείνει μόνο ένας παίχτης στο παιχνίδι:
  • if( players.size == 1 )
    	break;
    

    Αυτός θα είναι και ο νικητής. Λίγο κουλά υλοποιείς τον counter των παιχτών αλλά φαίνεται να δουλεύει.

  • Μετά επιλέγεις τυχαία έναν αριθμό ενός sequence από χτύπους (1 ~ 10):

  • K = 1 + rand()%10;
    

    Ύστερα ωραία εκτυπώνεις Κ φορές το μήνυμα "Drum hit!" και καλείς μία συνάρτηση hit().

  • Η hit κάνει κάτι μαγικά: αλλάζει τα περιεχόμενα του head, κάνει μία πολύ περίεργη επανάληψη..και γενικώς δε μπορώ να την ακολουθήσω.

  • Μόλις οι χτύποι σταματήσουν καλείς τη συνάρτηση stop_tune(). Και αυτή με τη σειρά της υπολογίζει ένα τυχαίο αριθμό και διαγράφει τον κόμβο-παίχτη που της αντιστοιχεί.

  • Τέλος τερματίζεις το παιχνίδι. <<Ρώσικη ρουλέτα δηλαδή! Το Βρήκα!>>

Αν κατάλαβα καλά και εγκρίνεις τη σκέψη μου, τότε επέτρψέ μου να σου πω την γνώμη μου:

 

Ξεκινάς με λάθος σχεδιασμό το πρόγραμμά σου (Σημείωση: είναι η πρώτη φορά που εκτελώ κώδικα C++, συγχώρεσέ με για τις λεπτομέρειες):

  • Έχεις μία κλάση node. Ένας node, κόμβος πρέπει να περιέχει μέσα μόνο το όνομά του (id), ένα δείκτη στον επόμενο (next) και άντε και ένα δείκτη στον προηγούμενο (prev):
  • τα head και tail είναι κόμβοι. Btw δεν είναι must το tail, εκτός κι αν όντως το χρειάζεσαι.
  • Θα χρειαστείς μία κλάση η οποία θα λέγεται list και η οποία θα περιέχει πληροφορίες όπως το μέγεθος της λίστας, ένα δείκτη για το head της λίστας και όλες τις συναρτήσεις/μεθόδους (πως τις λέτε) που αφορούν τη λίστα (add_node(), delete_node() κ.α.)
  • Τέλος θες να έχεις και μία πιο γενική κλάση Roullete, η οποία θα περιέχει μεταβλητές (number_of_hits, number_of_players κ.α.) και μεθόδους που αφορούν το παιχνίδι σου (create_game(), end_game(), winner() κ.α.)

Όσον αφορά το ήδη υπάρχον παιχνίδι:

  • Από τη main επιλέγεις έναν τυχαίο αριθμό hits. Τα hits περιορίζονται σε μέχρι 10. Αν έχω 20 παίχτες;
  • Πρώτον πρέπει να επιλέξεις έναν αριθμό ο οποίος να είναι και μεγαλύτερος του αριθμού των παιχτών ΚΑΙ να κρατήσεις τον ίδιο αριθμό για τη διαγραφή του αντίστοιχου παίχτη. (σε είδα που ξαναυπολογίζεις έναν τυχαίο αριθμό στην stop_tune).
  • Τώρα αν ο τυχαίος αριθμός βγει μεγαλύτερος από τον αριθμό των παιχτών, απλά παίρνεις τον αριθμό που έβγαλες mod τον αριθμό των παιχτών συν 1.
  • τα υπόλοιπα τα ξέρεις..

Μιλώντας για λίστες. Εσύ υλοποιείς μία μη-κυκλική, απλά συνδεδεμένη λίστα:

head---> [ id (next]----> [ id (next]----> [ id (next]----> [ id (next]----> NULL
                                                            ^
                                                            |
                                                          tail

Σε C θα έκανα τις εξής συναρτήσεις για τη list (Προσάρμοσέ τες ανάλογα, μοιάζουν πολύ οι γλώσσες):

/* This is the struct describing of a list node */
typedef struct list {    /* Ayto gia sena einai h klassh node */
    int id;
    struct list *nxt;
} player_list;

/* Adds a new node, containing id as its data, to the beginning of the list
 * pointed to by head
 */
void list_add (struct list *head, it id)
{
        struct list *new_node;
        /* Allocate memory for the new node */
        new_node = (struct list *) malloc(sizeof(struct list)); /* esy xrhsimopoihse ton constructor */

        new_node->id = id;

        /* Insert the new node in the list */
        new_node->nxt = head->nxt;
        head->nxt = new_node;
}

/* Looks in the list pointed by head for the pos-th.
 * If found, the function returns a pointer to the previous node in the
 * list. Otherwise it returns NULL.
*/
struct list *list_search (struct list *head, int pos)
{
        int i = 1;
        struct list *curr, *prev;

        curr = head->nxt;
        prev = head;
        
        while (curr != NULL && i < pos) {
                prev = curr;
                curr = curr->nxt;
                i++;
        }

        if (curr != NULL)
                return(curr);
        else
                return(0);
}

/* Removes a node, containing id as its data, from the list pointed to by
 * head, if such a node exists in the specific list
 */
int list_rmv (struct list *head, int pos)
{
        struct list *prev, *curr;
        int ret = -1;
        /* Look for the node */
        prev = list_search(head, pos);
        if (prev != NULL) {
                ret = curr->id;
                /* Remove the node */
                curr = prev->nxt;
                prev->nxt = curr->nxt;
                free(curr);
        }
        return (ret);
}

H create_game() θα μπορούσε σε ψευδοκώδικα να υλοποιηθεί έτσι:

player_list *create_game (int num_of_players)
{
        int i, p_name;

        player_list *head = list_init();

        for (i = 1; i <= num_of_players) {
                printf("What is the name of the %d player?", i);
                scanf("%d", &p_name);
                list_add(head, p_name);
        }

        printf("Game initiated. All players are in position.");
        return (head);
}

To όλο game μπορεί να υλοποιηθεί σε μία τέτοια συνάρτηση:

int game_loop (player_list *head, int num_of_players)
{
        int player_to_exit, i, loser_id;
        int players_in_game = num_of_players;

        while (players_in_game > 1) {
                player_to_exit = (rand() % players_in_game) + 1;
                for (i = 1; i < player_to_exit; i++)
                        printf("%s\n", i%2 ? "dum..." : "doom...");
                loser_id = list_rmv(head, player_to_exit);
                printf("Player %d, you're unlucky.\n", loser_id);
                players_in_game--;
        }

        return (head->id);   /* that's the winner */
}

Τέλος η end_game θα μπορούσε να είναι της μορφής:

void end_game (player_list *head)
{
        print the winner;
        free all memory remained (only the first node);
}

Αυτά..δε χρειάζεται να κάνουμε τη ζωή μας δύσκολη ;)

Επεξ/σία από gon1332
Δημοσ.

ωραιιιιος!! Αυτό που θέλω να κάνω είναι οι μουσικές καρέκλες. Με την ht αύτο που θέλω είναι π.χ μπένουν μέσα οι αριθμοί 1,2,3,4 και μέτα απο ένα hit να γίνει 2,3,4,1 δηλαδή να μεταφερθούν όλα μια φορά προς τα αρίστερα φαινότανε να δουλεύει πάντως η συνάρτηση hit του bluezy. Γιατί αυτές τις 2 γραμμές κώδικα τις λές υπόπτες? Σε εύχαριστω πολύ για την βοήθεια βέβεα την τετάρτη επρεπε να παραδώσω την εργασία όποτε την έδωσα με ότι είχα κάνει ελπίζω απλώς να είμαι τυχερός και να μου δουλέψει για να δούν οτι δεν τρέχει κάτι :D :D!!

Δημοσ.

ωραιιιιος!! Αυτό που θέλω να κάνω είναι οι μουσικές καρέκλες. Με την ht αύτο που θέλω είναι π.χ μπένουν μέσα οι αριθμοί 1,2,3,4 και μέτα απο ένα hit να γίνει 2,3,4,1 δηλαδή να μεταφερθούν όλα μια φορά προς τα αρίστερα φαινότανε να δουλεύει πάντως η συνάρτηση hit του bluezy. Γιατί αυτές τις 2 γραμμές κώδικα τις λές υπόπτες? Σε εύχαριστω πολύ για την βοήθεια βέβεα την τετάρτη επρεπε να παραδώσω την εργασία όποτε την έδωσα με ότι είχα κάνει ελπίζω απλώς να είμαι τυχερός και να μου δουλέψει για να δούν οτι δεν τρέχει κάτι :D :D!!

 

Αχά. Πες το έτσι. Όλα θα χαλάνε μέσα στην stop_tune όπως σου είπα παραπάνω. Απλά στη hit φαίνονται όλα. Στη hit χτυπάει segmentation fault. Ξεκίνα το παιχνιδάκι πάλι από την αρχή, αλλά πιο δομημένα και το κάθε κομμάτι που υλοποιείς  να το υλοποιεί διακριτά. Άλλη κλάση είναι η λίστα. Άλλη κλάση ο κόμβος (ο οποίος συνδέεται με λίστες) και εντελώς άλλη κλάση το game. Αν φτιάξεις μία φορά την κλάση για λίστα, δε θα χρειαστεί να την ξαναυλοποιήσεις για κάποιο άλλο σου project. Μπορείς να την εμπλουτίσεις με μεθόδους ώστε να την κάνεις πιο λειτουργική.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...