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

Τα posts που έγιναν κατά την διάρκεια του Ακαδημαϊκού Έτους 2016-2017 για τα προπτυχιακά μαθήματα.
AkisMadrugada
bit level
bit level
Posts: 21
Joined: Tue Oct 06, 2009 12:36 am
Gender:

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

Post by AkisMadrugada » Wed Dec 21, 2016 1:34 pm

Και κάτι άλλο στην getPixel() όταν κάνω
math::Vec3<float> v;
v[Image::RED] = buffer[s + RED];
μου πετάει error Error "cannot convert from 'math::Vec3<float>' to 'float"
αφού και τα δύο Vec3<float> τύπου είναι δεν καταλαβαίνω γιατί!
User avatar
Georgilakis Antonios
Mbyte level
Mbyte level
Posts: 548
Joined: Mon Dec 02, 2013 11:10 pm
Academic status: Alumnus/a
Gender:
Location: Straight into your Mind

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

Post by Georgilakis Antonios » Wed Dec 21, 2016 1:44 pm

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];
Last edited by Georgilakis Antonios on Wed Dec 21, 2016 3:05 pm, edited 3 times in total.
"Always keep a low profile. Cause when you get high, things can become strange."
"Never stop doing things you like. Never stop loving people you love. Never give up. Believe in yourself. Believe in your hidden powers."
"Honesty is an expensive gift, so don't expect it from cheap people."
The Scientist
AkisMadrugada
bit level
bit level
Posts: 21
Joined: Tue Oct 06, 2009 12:36 am
Gender:

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

Post by AkisMadrugada » Wed Dec 21, 2016 1:47 pm

Vec3<float> *buffer;
Ναι έτσι το έχω δηλώσει

Edit::
Έχεις δίκιο στο edit σου, κατά συνέπεια εάν
δηλώσω τον buffer float δεν πετάει error!
Last edited by AkisMadrugada on Wed Dec 21, 2016 2:05 pm, edited 1 time in total.
User avatar
Georgilakis Antonios
Mbyte level
Mbyte level
Posts: 548
Joined: Mon Dec 02, 2013 11:10 pm
Academic status: Alumnus/a
Gender:
Location: Straight into your Mind

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

Post by Georgilakis Antonios » Wed Dec 21, 2016 1:50 pm

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

EDIT: Μπορεί και να είναι όμως. (not sure) :-D
"Always keep a low profile. Cause when you get high, things can become strange."
"Never stop doing things you like. Never stop loving people you love. Never give up. Believe in yourself. Believe in your hidden powers."
"Honesty is an expensive gift, so don't expect it from cheap people."
The Scientist
User avatar
nachos
Gbyte level
Gbyte level
Posts: 1252
Joined: Mon Aug 21, 2006 4:28 pm
Academic status: Alumnus/a
Gender:
Location: Brachamee City

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

Post by nachos » Wed Dec 21, 2016 2:23 pm

Δεν υπάρχει λόγος το 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;
Nothing is impossible for the man who doesn't have to do it himself
User avatar
skater1995
bit level
bit level
Posts: 44
Joined: Tue Jan 21, 2014 5:14 pm
Academic status: Alumnus/a
Gender:

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

Post by skater1995 » Wed Dec 21, 2016 7:38 pm

Υπάρχει δυνατότητα να στείλω μαζί με την δεύτερη εργασία και την πρώτη? Ή αυτό γίνεται μόνο με την τρίτη και τελευταία εργασία?
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Wed Dec 21, 2016 7:50 pm

skater1995 wrote:Υπάρχει δυνατότητα να στείλω μαζί με την δεύτερη εργασία και την πρώτη? Ή αυτό γίνεται μόνο με την τρίτη και τελευταία εργασία?
Μπορείς να στείλεις και τις 2 μαζί.
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
skater1995
bit level
bit level
Posts: 44
Joined: Tue Jan 21, 2014 5:14 pm
Academic status: Alumnus/a
Gender:

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

Post by skater1995 » Wed Dec 21, 2016 7:53 pm

ωραιοςς!
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Wed Dec 21, 2016 8:00 pm

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

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
leecher
Venus Former Team Member
Posts: 139
Joined: Fri Jan 23, 2015 9:47 pm
Academic status: N>4
Gender:

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

Post by leecher » Wed Dec 21, 2016 8:38 pm

Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Wed Dec 21, 2016 8:53 pm

leecher wrote:Το i παίρνει σίγουρα τιμές από το 0 ως και το n-1 όπου n το μέγεθος του buffer? Γιατί το error αυτό ίσως στο πετάει γιατί πας να διαβάσεις από θέση που δεν ανήκει στον πίνακα.
δεν εχω ορίσει κάπου το μέγεθος του buffer όμως.. έχω γράψει ακριβώς αυτό :

component_t * buffer = new component_t;

Όπου component_t έχουμε ήδη ορίσει ότι είναι το ιδιο με το float
Last edited by v4ss4s1n on Wed Dec 21, 2016 8:54 pm, edited 1 time in total.
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
Georgilakis Antonios
Mbyte level
Mbyte level
Posts: 548
Joined: Mon Dec 02, 2013 11:10 pm
Academic status: Alumnus/a
Gender:
Location: Straight into your Mind

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

Post by Georgilakis Antonios » Wed Dec 21, 2016 8:54 pm

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)
}

// ...
Last edited by Georgilakis Antonios on Wed Dec 21, 2016 9:14 pm, edited 5 times in total.
"Always keep a low profile. Cause when you get high, things can become strange."
"Never stop doing things you like. Never stop loving people you love. Never give up. Believe in yourself. Believe in your hidden powers."
"Honesty is an expensive gift, so don't expect it from cheap people."
The Scientist
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Wed Dec 21, 2016 9:06 pm

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
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Thu Dec 22, 2016 10:15 pm

Γειά σας παιδιά και πάλι..Έχω ένα πρόβλημα και θα ήθελα λίγο βοήθεια αν γνωρίζει κανείς τι πάει λάθος..

Το πρόβλημα:
Έχω έναν 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 αλλά πάλι τα ίδια..
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
kras
Kilobyte level
Kilobyte level
Posts: 253
Joined: Mon Sep 01, 2014 1:21 am
Academic status: 4th year
Gender:

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

Post by kras » Thu Dec 22, 2016 10:35 pm

Τι εννοείς χάνει την τιμή του; Εκτύπωσες την τιμή του myimage πριν και μετά τις κλήσεις και είχε αλλάξει; Τι ακριβώς σου επιστρέφει η getB();;
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Thu Dec 22, 2016 11:09 pm

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.
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
leecher
Venus Former Team Member
Posts: 139
Joined: Fri Jan 23, 2015 9:47 pm
Academic status: N>4
Gender:

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

Post by leecher » Thu Dec 22, 2016 11:28 pm

Στείλε τον κώδικα.
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Fri Dec 23, 2016 2:44 am

leecher wrote:Στείλε τον κώδικα.
Που? :P :smt017 :smt017
Coders Cycle

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
User avatar
Georgilakis Antonios
Mbyte level
Mbyte level
Posts: 548
Joined: Mon Dec 02, 2013 11:10 pm
Academic status: Alumnus/a
Gender:
Location: Straight into your Mind

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

Post by Georgilakis Antonios » Fri Dec 23, 2016 3:16 am

Άσε ένα μικρό αλλά επαρκές code snippet εδώ.
"Always keep a low profile. Cause when you get high, things can become strange."
"Never stop doing things you like. Never stop loving people you love. Never give up. Believe in yourself. Believe in your hidden powers."
"Honesty is an expensive gift, so don't expect it from cheap people."
The Scientist
User avatar
v4ss4s1n
byte level
byte level
Posts: 80
Joined: Tue Nov 05, 2013 2:50 pm
Academic status: 4th year
Gender:

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

Post by v4ss4s1n » Fri Dec 23, 2016 9:27 pm

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

:smt017 -> :smt018 -> :smt021 -> :smt022 -> :smt025
nikos8232
bit level
bit level
Posts: 49
Joined: Thu Oct 02, 2014 1:13 am
Academic status: 1st year
Gender:

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

Post by nikos8232 » Sun Jan 15, 2017 3:45 am

η παραδωση εργασιων δεν μπορει να γινει αλλη περιοδο?
User avatar
Shocker
Gbyte level
Gbyte level
Posts: 1080
Joined: Wed Sep 19, 2007 11:59 pm
Academic status: N>4
Location: Beehives / Anabyss
Contact:

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

Post by Shocker » Sun Jan 15, 2017 4:34 pm

Οχι
Locked

Return to “Ακαδημαϊκό Έτος 2016-2017”