Page 3 of 4

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 1:34 pm
by AkisMadrugada
Και κάτι άλλο στην getPixel() όταν κάνω
math::Vec3<float> v;
v[Image::RED] = buffer[s + RED];
μου πετάει error Error "cannot convert from 'math::Vec3<float>' to 'float"
αφού και τα δύο Vec3<float> τύπου είναι δεν καταλαβαίνω γιατί!

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 1:44 pm
by Georgilakis Antonios
AkisMadrugada wrote:Και κάτι άλλο στην getPixel() όταν κάνω
math::Vec3<float> v;
v[Image::RED] = buffer[s + RED];
μου πετάει error Error "cannot convert from 'math::Vec3<float>' to 'float"
αφού και τα δύο Vec3<float> τύπου είναι δεν καταλαβαίνω γιατί!
Το v με index είναι float μέσα στο Vec3<float> (λογικά).

Μήπως το buffer το έχεις δηλώσει έτσι ? :

Code: Select all

Vec3<float> buffer[/* N */];
Αν ναι, τότε κάθε buffer είναι τύπου Vec3<float>.

EDIT:
Ένα τελευταίο συμπέρασμα που βγάζω από το παραπάνω:

Code: Select all

// Vec3<float> & v = buffer[i];

float r = buffer[i][Image::RED];
float g = buffer[i][Image::GREEN];
float b = buffer[i][Image::BLUE];

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 1:47 pm
by AkisMadrugada
Vec3<float> *buffer;
Ναι έτσι το έχω δηλώσει

Edit::
Έχεις δίκιο στο edit σου, κατά συνέπεια εάν
δηλώσω τον buffer float δεν πετάει error!

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 1:50 pm
by Georgilakis Antonios
AkisMadrugada wrote:Vec3<float> *buffer;
Ναι έτσι το έχω δηλώσει
Ίσως (λέω ίσως) να μην είναι αυτό που χρειάζεσαι. (Η δήλωση τουλάχιστον, ή η μορφή της [μάλλον])

EDIT: Μπορεί και να είναι όμως. (not sure) :-D

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 2:23 pm
by nachos
Δεν υπάρχει λόγος το Vec3 να το δηλώσεις ως pointer. Για την ακρίβεια για αυτό που πας να κάνεις είναι λάθος και μάλιστα για πολλούς διαφορετικούς λόγους:
  • - Η δήλωση ενός pointer δε συνεπάγεται και δημιουργία αντικειμένου. Θα πρέπει να κατασκευάσεις και το αντικείμενο με χρήση της new, το ποίο αυτόματα συνεπάγεται ότι κάποια στιγμή έχεις και την ευθύνη να το κάνεις delete. Αμφιβάλλω αν χρειάζεσαι κάτι τέτοιο στο context που δουλεύεις.
    - O indexer ([ ]) πάνω σε ένα δείκτη εφαρμόζεται στον δείκτη, και όχι στο αντικείμενο που δείχνει αυτός. Έτσι, όταν λες buffer[ i ], όπου buffer ένα Vec3*, αυτό ερμηνεύεται ώς το Vec3 αντικείμενο που βρίσκεται i θέσεις έπειτα από τη διεύθυνση που δείχνει ο buffer (ωσαν ο buffer να ήταν πίνακας από Vec3 δλδ.). Αν θες μέσω του buffer να καλέσεις τον indexer του αντικειμένου Vec3 στο οποίο δείχνει, έχεις τις εξής 2 επιλογές:
    • 1. Dereference τον δείκτη και εφαρμογή του indexer στο παραγόμενο:

      Code: Select all

      (*buffer)[i]
      2. Κλήση του operator με το πλήρες όνομα του, μέσω του δείκτη:

      Code: Select all

      buffer->operator[](i)
Ουσιαστικά η σωστή προσέγγιση είναι να φτιάξεις ένα απλό αντικείμενο Vec3, δηλαδή να κάνεις το εξής:

Code: Select all

Vec3 buffer;

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 7:38 pm
by skater1995
Υπάρχει δυνατότητα να στείλω μαζί με την δεύτερη εργασία και την πρώτη? Ή αυτό γίνεται μόνο με την τρίτη και τελευταία εργασία?

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 7:50 pm
by v4ss4s1n
skater1995 wrote:Υπάρχει δυνατότητα να στείλω μαζί με την δεύτερη εργασία και την πρώτη? Ή αυτό γίνεται μόνο με την τρίτη και τελευταία εργασία?
Μπορείς να στείλεις και τις 2 μαζί.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 7:53 pm
by skater1995
ωραιοςς!

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 8:00 pm
by v4ss4s1n
Καλησπέρα παιδιά, έχω την εξής απορία και θα ήμουν ευγνώμων αν μπορούσε κάποιος να με βοηθήσει.(Πρώτη εργασία κατά το διάβασμα των δεδομένων της εικόνας). Έχω φτιάξει μια μεταβλητή( int character ) στην οποία διαβάζω ένα ένα τα bytes με σωστό τρόπο(επαληθευμένα). Εν συνεχεία έχω μια μεταβλητή pointer ( float * buffer = new float ) στην οποία θέλω να αποθηκεύσω τα δεδομένα αυτά. Εκτελώ μέσα σε ένα loop την εξής εντολή για κάθε καινούργιο byte που είναι αποθηκευμένο στο character : ( buffer = (float)character; ) που είμαι αρκετά σίγουρος ότι είναι λάθος.Όταν εκτελώ το πρόγραμμα μου πετάει : Access violation reading location 0xFFFFF..... .Ψάχνω στο βιβλίο να βρω τι πάει λάθος αλλά πιστεύω ότι κάποιος που γνωρίζει C++ θα μπορεί αμέσως να καταλάβει τι πάει λάθος και να μου σώσει πολύ χρόνο.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 8:38 pm
by leecher
Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 8:53 pm
by v4ss4s1n
leecher wrote:Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.
δεν εχω ορίσει κάπου το μέγεθος του buffer όμως.. έχω γράψει ακριβώς αυτό :

component_t * buffer = new component_t;

Όπου component_t έχουμε ήδη ορίσει ότι είναι το ιδιο με το float

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 8:54 pm
by Georgilakis Antonios
v4ss4s1n wrote:
leecher wrote:Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.
δεν εχω ορίσει κάπου το μέγεθος του buffer όμως.. έχω γράψει ακριβώς αυτό :

component_t * buffer = new component_t;

Code: Select all

#include <cstddef>	// 'NULL' symbol.

// ...

component_t *buffer = new component_t[szBufferSize];

for (size_t i = 0; i < szBufferSize; i++)
{
	// ...
}

// ...

delete[ ] buffer;

buffer = NULL;

// ...
Φτιάξε το κατάλληλα.

EDIT: Εναλλακτικά (Έχω δει να πιάνει και για μεγάλα buffers, ενώ το new όχι):

Code: Select all

#include <cstddef>	// 'NULL' symbol.
#include <cstdlib>	// 'malloc()', 'free()'

// ...

component_t *buffer = reinterpret_cast<component_t *>(malloc(szBufferSize * sizeof(component_t)));

if (buffer)
{
	for (size_t i = 0; i < szBufferSize; i++)
	{
		// ...
	}
	
	// ...
	
	free(buffer);
	
	buffer = NULL;
}
else
{
	// Handle memory allocation error ... (rare)
}

// ...

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Wed Dec 21, 2016 9:06 pm
by v4ss4s1n
Georgilakis Antonios wrote:
leecher wrote:Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.

Code: Select all

#include <cstddef>	// 'NULL' symbol.

// ...

component_t *buffer = new component_t[szBufferSize];

for (size_t i = 0; i < szBufferSize; i++)
{
	// ...
}

// ...

delete[ ] buffer;
buffer = NULL;

// ...
Φτιάξε το κατάλληλα.
Παιδιά ευχαριστώ πάρα πολύ...αλήθεια.. :smt023 :smt023

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Thu Dec 22, 2016 10:15 pm
by v4ss4s1n
Γειά σας παιδιά και πάλι..Έχω ένα πρόβλημα και θα ήθελα λίγο βοήθεια αν γνωρίζει κανείς τι πάει λάθος..

Το πρόβλημα:
Έχω έναν pointer σε ένα αντικείμενο τύπου Image.( Image * myimage = new Image; )

Η κλάση Image έχει μέσα 2 μεταβλητές int a,b και 1 μεταβλητή float * buffer;

Προσπαθώ στη συνέχεια να πάρω τις τιμές a, b μέσω μίας συνάρτησης της κλάσης Image : (getA(){return a;},
getB(){return b;})

Αυτό το κάνω έτσι : (*myimage).getA() και (*myImage).getB() Ή myimage->getA() και myimage->getB() .

Το πρόβλημα όμως είναι πως όταν καλώ την μέθοδο (*myimage).getA() και στη συνέχεια καλώ την μέθοδο (*myimage).getB() επιστρέφει σωστά το a όμως μετά για κάποιο λόγω ο pointer myimage χάνει την τιμή του και όταν καλείται η (*myimage).getB() μου επιστρέφει ό,τι νά'ναι..Το ίδιο αποτέλεσμα έχει και ο δεύτερος τρόπος..δεν μπορώ να καταλάβω τι συμβαίνει λάθος.. :smt021 :smt017 :smt021 :smt013 :smt021

προσπάθησα μέχρι και να κάνω const τον pointer myimage αλλά πάλι τα ίδια..

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Thu Dec 22, 2016 10:35 pm
by kras
Τι εννοείς χάνει την τιμή του; Εκτύπωσες την τιμή του myimage πριν και μετά τις κλήσεις και είχε αλλάξει; Τι ακριβώς σου επιστρέφει η getB();;

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Thu Dec 22, 2016 11:09 pm
by v4ss4s1n
kras wrote:Τι εννοείς χάνει την τιμή του; Εκτύπωσες την τιμή του myimage πριν και μετά τις κλήσεις και είχε αλλάξει; Τι ακριβώς σου επιστρέφει η getB();;

θεωρητικά το a και το b θα έπρεπε να έχουν τις τιμές 1200 και 750 (και τις έχουν μέχρι να καλέσω την getA ή την getB,ή προσπελάσω τον pointer με οποιονδήποτε τρόπο). Οι getA και getB απλά επιστρέφουν τις αντίστοιχες μεταβλητές(το a και το b).Όταν καλέσω είτε την getA είτε την getB, τότε ο pointer myimage σταματάει να δείχνει εκεί που έδειχνε και οι τιμές a και b γίνονται ό,τι νά'ναι..και είναι διαφορετικές σε κάθε υπολογιστή..

Σημείωση: ξέρω τι τιμές έχουν επειδή τις βλέπω μέσω του visual studio σε debug mode.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Thu Dec 22, 2016 11:28 pm
by leecher
Στείλε τον κώδικα.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Fri Dec 23, 2016 2:44 am
by v4ss4s1n
leecher wrote:Στείλε τον κώδικα.
Που? :P :smt017 :smt017

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Fri Dec 23, 2016 3:16 am
by Georgilakis Antonios
Άσε ένα μικρό αλλά επαρκές code snippet εδώ.

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Fri Dec 23, 2016 9:27 pm
by v4ss4s1n
Καλησπέρα παιδιά, απλά θέλω να κάνω report τι έφταιγε..Νόμιζα ότι εμείς δεν έπρεπε να έχουμε ένα αντικείμενο τύπου Image στην main, αλλά έπρεπε να έχουμε ένα reference σε ένα τέτοιο object.Επομένως, (Δεν είμαι σίγουρος για το παρακάτω, ούτε ξέρω το γιατί, απλά το υποθέτω) κατέστρεφε το αντικείμενο και το reference έδειχνε σε μια τυχαία θέση μνήμης .Ευχαριστώ πολύ τους : leecher και Georgilakis Antonios για την βοήθειά τους. :smt024

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Sun Jan 15, 2017 3:45 am
by nikos8232
η παραδωση εργασιων δεν μπορει να γινει αλλη περιοδο?

Re: Προγραμματισμός Υπολογιστών με C++

Posted: Sun Jan 15, 2017 4:34 pm
by Shocker
Οχι