[C++] Βοήθεια σε πίνακα και δείκτες!

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 27 Ιούλ 2012 19:13

Για σε όλους αλάνια!

Μιας και έχω ελέυθερο χρόνο είπα να εξασκηθώ στους πίνακες με δείκτες!

έχω όμως ένα πρόβλημα!

Table.h --> Όλα καλά!

Κώδικας: Επιλογή όλων

#ifndef TABLE_H_
#define TABLE_H_

class Table {
public:
	Table();
	Table(int);
	void saveTableSize(int);
	int showTableSize() const;
	int* createTable(int);
	void addValues(int *, int);
	void showTable(int *, int) const;
	virtual ~Table();
private:
	int megethosPinaka;
};

#endif /* TABLE_H_ */
Table.ccp --> Λάθος στο addValues

Κώδικας: Επιλογή όλων

/*
 * Table.cpp
 *
 *  Created on: 27 Ιουλ 2012
 *      Author: Panagos
 */

#include "Table.h"

#include <iostream>

using namespace std;

Table&#58;&#58;Table&#40;&#41; &#123;
	// TODO Auto-generated constructor stub

&#125;

Table&#58;&#58;Table&#40;int _tableSize&#41; &#123;
	megethosPinaka = _tableSize;
&#125;

Table&#58;&#58;~Table&#40;&#41; &#123;
	// TODO Auto-generated destructor stub
&#125;

void Table&#58;&#58;saveTableSize&#40;int _tableSize&#41; &#123;
	megethosPinaka = _tableSize;
&#125;

int Table&#58;&#58;showTableSize&#40;&#41; const &#123;
	return megethosPinaka;
&#125;

int* Table&#58;&#58;createTable&#40;int _tableSize&#41; &#123;

	int *newTable = new int&#91;_tableSize&#93;;

	return newTable;
&#125;

void Table&#58;&#58;addValues&#40;int *table, int _tableSize&#41; &#123;

	int *i = NULL;
	int *pointerFirst = &table&#91;0&#93;;
	int *pointerLast = &table&#91;_tableSize&#93;;

	for&#40;i=pointerFirst;i<pointerLast;i++&#41; &#123;
		cout << "Dwse to " << i+1 << "o stoixeio tou pinaka&#58; ";
		cin >> table&#91;i&#93;;  <------- Εδώ το λάθος. Ο compiler μου λεεί&#58; error&#58; invalid types 'int*&#91;int*&#93;' for array subscript
	&#125;
&#125;

void Table&#58;&#58;showTable&#40;int *table, int _tableSize&#41; const &#123;

	int *i = NULL;
	int *pointerLast = &table&#91;_tableSize&#93;;

	int counter = 1;

	for&#40;i=table;i<pointerLast;i++&#41; &#123;
		cout << "a&#91;" << counter << "&#93; = " << *i << endl;
		counter++;
	&#125;
&#125;
Θα μπορούσατε να μου πείτε γιατί είναι λάθος και πιο είναι το σωστό?

Ευχαριστώ εκ τον προτέρον!!!

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από xmavidis » 28 Ιούλ 2012 12:52

Το πρόβλημα εδώ είναι στην addValues().
To i είναι pointer (για διευθύνσεις μνήμης) και όχι αριθμητικός δείκτης (0, 1, 2,...). Οπότε το

Κώδικας: Επιλογή όλων

table&#91;i&#93;

δεν αντιστοιχεί σε κανένα στοιχείο του πίνακα.

Αυτό που δείχνει στα στοιχεία του πίνακα είναι το i και για να αλλάξεις την τιμή του στοιχείου που βρίσκεται στην διεύθυνση i πρέπει να χρησιμοποιήσεις τον dereference operator (*i):

Κώδικας: Επιλογή όλων

cin >> *i;
Τέλος, η διεύθυνση του αρχικού στοιχείου αντιστοιχεί στο όνομα του πίνακα. Μπορείς λοιπόν αντί για:

Κώδικας: Επιλογή όλων

int *pointerFirst = &table&#91;0&#93;;
Να γράψεις:

Κώδικας: Επιλογή όλων

int *pointerFirst = table;
I want to know God’s thoughts; the rest are details.
Albert Einstein

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 29 Ιούλ 2012 02:42

Σε ευχαριστώ πολύ φίλε μου!!! Να σε καλά για την βοήθεια!!!

Και μου αρέσει που στο να τα εμφανίσω το έκανα σωστά γιατί το κατάλαβα και στο να τα εισάγω έκανα χαζό λάθος :P

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 29 Ιούλ 2012 19:21

Κώδικας: Επιλογή όλων

void Table&#58;&#58;sortTable&#40;int *table, int _tableSize, int userChoise&#41; &#123;

	int *i = NULL;
	int *j = NULL;
	int *temp = NULL;
	int *pointerFirst = table;
	int *pointerLast = &table&#91;_tableSize&#93;;

	switch&#40;userChoise&#41; &#123;
		case 1&#58;
			//Bubble sort
			for&#40;i=pointerFirst+1;i<pointerLast;i++&#41; &#123;
				for&#40;j=pointerLast-1;j>=i;j--&#41; &#123;
					if&#40;*j < *j-1&#41; &#123;
						*temp = *j;
						*j = *j-1;
						*j-1 = temp;   <-------- Μου βγάζει ο compiler το εξής λάθος&#58; error&#58; lvalue required as left operand of assignment... τι δεν κάνω σωστα???
					&#125;
				&#125;
			&#125;
			break;
	&#125;

&#125;
Τι κάνω λάθος :(

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από gvre » 29 Ιούλ 2012 20:52

Λογικά, αν όπου έχεις *j-1 βάλεις *(j-1), θα λυθεί το πρόβλημα.
Περισσότερα μπορείς να διαβάσεις σε αυτό το tutorial για pointers

ps. Τα i, j συνήθως δεν τα χρησιμοποιείς ως pointers, αλλά ως μετρητές.
ps2. Καλό είναι κάθε συνάρτηση να κάνει μια δουλειά, όχι πολλές. Θα μπορούσες δηλαδή να δημιουργήσεις μια συνάρτηση sort_bubble, η οποία θα κάνει μόνο bubble sort και τίποτα άλλο.

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από mariosal » 29 Ιούλ 2012 20:53

Νομίζω πως πρέπει να διαβάσεις το "Pointers & Memory" από το Stanford. http://cslibrary.stanford.edu/102/

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 29 Ιούλ 2012 21:08

Σας ευχαριστώ πολύ παιδιά!!!

Να σας ρωτήσω, γιατί βάζουμε *(j+1) και όχι σκέτο *j+1?


PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 29 Ιούλ 2012 21:26

Δεν το κατάλαβα πολύ καλά... μπορείς να μου το εξηγησεις αν δεν σου είναι κόπος? :S

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από gvre » 29 Ιούλ 2012 21:32

Είναι θέμα προτεραιότητας.
Με το *(j+1) παίρνεις την τιμή της επόμενης θέσης του πίνακα από αυτή που δείχνει το j.
Με το *j + 1 προσθέτεις 1 στην τιμή της θέσης που δείχνει ο j.
Δηλαδή, αν ο πίνακάς σου είναι { 10, 20, 30 } και το j δείχνει στη θέση 0 (με τιμή 10), το *(j+1) θα σου δώσει την τιμή 20, ενώ το *j+1 θα σου δώσει την τιμή 11.

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

[C++] Βοήθεια σε πίνακα και δείκτες!

Δημοσίευση από PanosPss » 29 Ιούλ 2012 21:35

Κατάλαβα!!! Σε ευχαριστώ πολύ για την βοήθειά σου!!!

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες