Κώδικας:int main(){ int m = 5; int n = 6; int arr[m][n]; pseudoRandom(m, n); printMatrix(m, n); //This cout doesnt work cout <<"After multiply with constant"<<endl; //multiplyConstant(m, n); printMatrix(m, n); }
Εχω το παραπανω κωδικα. Οταν δεν βαζω το ενδιαμεσο cout ολα δουλευουν ρολοι. Οταν βαζω το cout η συναρτηση printMatrix μου βγαζει ανοησιες.
Δεν μπορω να το καταλαβω αυτο.
Παραθετω και το printMatrix
To output χωρις την cout ειναι για παραδειγμα:Κώδικας:void printMatrix(int m, int n){ int array[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(array[i][j]<10) cout <<array[i][j] <<" "; else if(array[i][j]<100) cout <<array[i][j] <<" "; else cout <<array[i][j] <<" "; } cout <<endl; } cout <<endl; }και με την cout γινεται:Κώδικας:317 498 49 198 121 17 49 399 169 49 260 382 161 419 324 81 61 72 342 289 296 283 441 490 319 61 441 388 262 148
Δεν πολλαπλασιαζω με το constant που αναφερει. Αν τρεξω διαδοχικα την printMatrix συναρτηση παλι ολα δουλευουν ρολοι .... μονο οταν βαζω ενδιαμεσα το cout αλλαζουν ολα..... ?????? Καμμια ιδεα?Κώδικας:After multiply with constant 28 0 494377255 32713 497817088 32713 3432 0 29 0 1809075232 21961 497797312 32713 494384274 32713 1789472800 21961 497817088 32713 10 0 10 0 0 0 -1924970352 32764 0 0
Εμφάνιση 1-15 από 16
-
07-11-16, 12:23 C++. Δεν μπορω να καταλαβω αυτο το bug. #1
-
07-11-16, 13:21 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #2
O πίνακας int array[m][n]; δεν παίρνει πουθενά τιμές. Όταν τον διαβάζει η printMatrix εχει σκουπίδια. Βάλε όλο το listing για να δούμε πως το έχεις συνταγμένο.
ουδέν μονιμότερο του προσωρινού
-
07-11-16, 17:14 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #3< HTML:
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; const int x=2; void pseudoRandom(int m, int n); void multiplyConstant(int m, int n); void printMatrix(int m, int n); int main(){ int m = 5; int n = 6; int arr[m][n]; pseudoRandom(m, n); printMatrix(m, n); //This cout doesnt work cout<<"After multiply with constant"<<endl; //multiplyConstant(m, n); printMatrix(m, n); } void pseudoRandom(int m, int n){ int pseudoRandomValue; //random seed is initialized to a value representing the current time (calling time) //to generate a different value every time the program is run. int array[m][n]; srand(time(NULL)); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ pseudoRandomValue = rand()%499; array[i][j]= pseudoRandomValue; } } } void multiplyConstant(int m, int n){ int array[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ array[i][j]=x*array[i][j]; } } } void printMatrix(int m, int n){ int array[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(array[i][j]<10) cout <<array[i][j] <<" "; else if(array[i][j]<100) cout <<array[i][j] <<" "; else cout <<array[i][j] <<" "; } cout<<endl; } cout<<endl; }
Το εβαλα σε HTML tags επειδη βλεπω κραταει τα διαστηματα(Κραταει τα διαστηματα και το code tag ,λαθος μου. Ειναι εκτελεσιμο αν το κανετε compile.
- - - Updated - - -
Το προγραμμα δουλευει μια χαρα μεχρι που ... αποφασισα να βαλω εκεινη την cout ... αν την αφαιρεσετε απο το main παιρνει κανονικα τιμες και ολα εξελισσονται ομαλα.Τελευταία επεξεργασία από το μέλος zaranero : 07-11-16 στις 17:30.
-
07-11-16, 17:44 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #4
Στην C++ ο ορισμός πίνακα με αυτόν τον τρόπο είναι λάθος!
Κώδικας:int array[m][n];
Αν θέλεις πίνακα m*n μέσα στην συνάρτηση πρέπει να χρησιμοποιήσεις δυναμική δέσμευση μνήμης:
Κώδικας:int ** array = new int*[m]; for(int i=0; i<m ++m) array[i] = new int[n];
Για να σου δημιουργείται αυτό το πρόβλημα μόνο όταν βάζεις πριν το cout κάτι παίζει με την διαχείριση της μνήμης σε αυτές τις περιπτώσεις από τον compiler!
- - - Updated - - -
NOTE: The elements field within square brackets [], representing the number of elements in the array, must be a constant expression, since arrays are blocks of static memory whose size must be determined at compile time, before the program runs.
-
07-11-16, 17:49 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #5ο ότι γίνεται compile όπως το έχεις είναι περίεργο και μάλλον ο compiler σου απλά πετάει warnings...
-
07-11-16, 18:02 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #6
Λογικά επειδή ο compiler δεν ήξερε το μέγεθος του πίνακα απλά του όρισε μία θέση. Μετά έχεις το cout το οποίο επειδή χρησιμοποιείς ένα string πρέπει και αυτό να πάει στη μνήμη. Μάλλον έδωσε μία θέση για τον πίνακα και στη συνέχεια όρισε το string! Οπότε το ένα έπεσε πάνω στο άλλο!
Με δυναμική μνήμη (pointers) παίζει;
- - - Updated - - -
Έχεις και άλλα θέματα με τον κώδικά σου και το ότι έπαιζε όπως ήταν είσαι λίγο "τυχερός" - έπεσες σε περίπτωση και έπαιξε!!!
-
07-11-16, 18:06 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #7
To μεγαλύτερο πρόβλημα είναι ότι η printMatrix διαβάζει τυχαίο chunk από την μνήμη.
Το παραπάνω πρόγραμμα έχει μάλλον απροσδιόριστο output που τυχαίνει να δουλεύει επειδή δεν έχει αλλάξει το stack σε εκείνο το σημείο.
Πού, πώς, πότε έγινε σαφές ότι το array που διαβάζει η printMatrix είναι το ίδιο με αυτό που γράφει η pseudoRandom; (πουθενά)
To σωστό θα ήταν global array (αν δεν σε ενδιαφέρει variable length στο array) ή δυναμική δημιουργία (όπως είπε ο mitsakos) και pointer passing μεταξύ των συναρτήσεων.
ΥΓ: Compile με -Wall πάντα για να αποφεύγονται εύκολα λάθη.
-
07-11-16, 18:22 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #8
Διαβαζω το αρθρο με το λινκ του MitsakosGR
Κώδικας:With the only difference that with multidimensional arrays, the compiler automatically remembers the depth of each imaginary dimension. The following two pieces of code produce the exact same result, but one uses a bidimensional array while the other uses a simple array: multidimensional array pseudo-multidimensional array #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT][WIDTH]; int n,m; int main () { for (n=0; n<HEIGHT; n++) for (m=0; m<WIDTH; m++) { jimmy[n][m]=(n+1)*(m+1); } } #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT * WIDTH]; int n,m; int main () { for (n=0; n<HEIGHT; n++) for (m=0; m<WIDTH; m++) { jimmy[n*WIDTH+m]=(n+1)*(m+1); } }
- - - Updated - - -
Πού, πώς, πότε έγινε σαφές ότι το array που διαβάζει η printMatrix είναι το ίδιο με αυτό που γράφει η pseudoRandom; (πουθενά)
-
07-11-16, 18:34 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #9
-
07-11-16, 18:52 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #10
Ευχαριστω για τις απαντησεις , θα επιστρεψω μαλλον αργα το βραδυ ή αυριο γιατι πρεπει να διαβασω αρκετη θεωρια ... για να ξεδιαλυνω τι γινεται τωρα εχω μπερδευτει πολυ και μαλλον θα κανω διαλλειμμα.
-
07-11-16, 19:39 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #11Κώδικας:
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; const int x=2; void pseudoRandom(int m, int n, int **array); //void multiplyConstant(int m, int n); void printMatrix(int m, int n, int **array); int main(){ int m = 5; int n = 6; int i; int arr[m][n]; int *b[m]; for (i = 0; i < m; ++i) { b[i] = arr[m]; } pseudoRandom(m, n, b); printMatrix(m, n, b); //This cout doesnt work cout<<"After multiply with constant"<<endl; //multiplyConstant(m, n); printMatrix(m, n, b); } void pseudoRandom(int m, int n, int **array){ int pseudoRandomValue; //random seed is initialized to a value representing the current time (calling time) //to generate a different value every time the program is run. //int array[m][n]; srand(time(NULL)); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ pseudoRandomValue = rand()%499; array[i][j]= pseudoRandomValue; } } } /* void multiplyConstant(int m, int n){ //int array[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ array[i][j]=x*array[i][j]; } } } */ void printMatrix(int m, int n, int **array){ //int array[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(array[i][j]<10) cout <<array[i][j] <<" "; else if(array[i][j]<100) cout <<array[i][j] <<" "; else cout <<array[i][j] <<" "; } cout<<endl; } cout<<endl; }
Μια λύση είναι και αυτή. Για άσκηση φτιάξε την multiplyConstant.ουδέν μονιμότερο του προσωρινού
-
07-11-16, 23:30 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #12Κώδικας:
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; const int x=2; void pseudoRandom(int m, int n, int **array); void printMatrix(int m, int n, int **array); void multiplyConstant(int m, int n, int **array); int main(){ int m = 5; int n = 6; int i; int arr[m][n]; int *b[m]; for (i = 0; i < m; ++i) { b[i] = arr[i]; } pseudoRandom(m, n, b); printMatrix(m, n, b); cout<<"After multiply with constant"<<endl; multiplyConstant(m, n, b); printMatrix(m, n, b); } void pseudoRandom(int m, int n, int **array){ int pseudoRandomValue; //random seed is initialized to a value representing the current time (calling time) //to generate a different value every time the program is run. srand(time(NULL)); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ pseudoRandomValue = rand()%499; array[i][j]= pseudoRandomValue; } } } void multiplyConstant(int m, int n, int **array){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ array[i][j]=x*array[i][j]; } } } void printMatrix(int m, int n, int **array){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(array[i][j]<10) cout <<array[i][j] <<" "; else if(array[i][j]<100) cout <<array[i][j] <<" "; else cout <<array[i][j] <<" "; } cout<<endl; } cout<<endl; }
-
08-11-16, 09:56 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #13
Αναρωτιέσαι γιατί δουλεύει με τους δείκτες;
Αν ναι τότε πρέπει να σκεφτείς τι μεταφέρεται σε κάθε συνάρτηση! Στην ουσία ορίζοντας την συνάρτηση ως (πχ)
Κώδικας:void printMatrix(int m, int n, int **array)
Άρα η συνάρτηση θα πάρει ένα αντίγραφο του Pointer. Το αντίγραφο θα είναι του pointer καθεαυτού, όχι των δεδομένων του!! Άρα θα έχεις δύο Pointer που δείχνουν στην ίδια θέση μνήμης. Αλλάζοντας τα δεδομένα στα οποία δείχνει ο ένας αλλάζουν και τα δεδομένα που δείχνει ο άλλος (αφού στην πραγματικότητα είναι τα ίδια)!
-
08-11-16, 22:35 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #14
int arr[m][n]; // Ο πίνακας σου
int *b[m]; // ενας πίνακας με ιδιο αριθμό γραμμών (m) με τον arr
// Κάθε στοιχείο του b = με κάθε γραμμή ή μάλλον με την αρχή κάθε γραμμής του πίνακα arr.
// Στην μνημη, οι θέσεις κάθε γραμμής του arr είναι διαδοχικές. ΠΧ η γραμμή arr[0] περιέχει n στοιχεία. Το arr[0][0] ξεκινά απο την θέση 00Α στην μνήμη. Όλα τα στοιχεία του arr[0] καταλαμβάνουν n * (size of int) θέσεις
// Στο παραπάνω παράδειγμα εφόσον το arr[0][0] βρίσκεται στην 00Α θέση το b[0] θα περιέχει αυτή την διεύθυνση δηλαδή b[0] = 00A. Το ίδιο και για τα υπόλοιπα
// Μέχρι στιγμής ασχοληθήκαμε με την μία διάσταση του arr
for (i = 0; i < m; ++i)
{
b[i] = arr[i];
}
// Καλώντας την pseudoRandom περνάμε την διεύθυνση αρχής του b, ας πούμε οτι είναι η 0FA
// το **δηλώνει δείκτης σε δείκτη. Δηλαδή ενα δείκτη σε μια θέση μνήμης που είναι δείκτης σε μια άλλη θέση αυτή της arr
// Η array βλέπει την διεύθυνση αρχής του b δηλαδή την 0FΑ η οποία περιέχει την διεύθυνση του arr[0] δηλαδή την 00Α.
// Όλες οι θέσεις μνήμης της arr έχουν είδη δεσμευθεί κατα την εκκίνηση του προγράμματος. Θυμίζω πως οι θέσεις στην μνήμη είναι διαδοχικές.
// Επομένως το array[0][0] δείχνει στην θέση 00Α του πίνακα arr μέσα στην main, το array[0][1] δείχνει στην θέση 00C γιατί ο τύπος Int θέλει δυο θέσεις μνήμης κ.ο.κ.
// Χρησιμοποιήσαμε δηλαδή τις θέσεις μνήμης για να αλλάξουμε μέσα απο την pseudoRandom το περιεχόμενο του arr η εμβέλεια του οποίου είναι εντός της main.
pseudoRandom(m, n, b);ουδέν μονιμότερο του προσωρινού
-
09-11-16, 06:50 Απάντηση: C++. Δεν μπορω να καταλαβω αυτο το bug. #15
Παρόμοια Θέματα
-
Δεν μπορω να ανοιξω ενα Basic δισκο για να παρω αρχεια
Από DJman στο φόρουμ WindowsΜηνύματα: 17Τελευταίο Μήνυμα: 15-06-16, 13:44 -
Δεν μπορώ να βρώ άκρη dsl/dslam
Από NetJim στο φόρουμ NovaΜηνύματα: 10Τελευταίο Μήνυμα: 17-05-16, 19:33 -
δεν μπορω να μπω στις επιλογες στον IE
Από rorocoleman στο φόρουμ Internet, web surfing και online υπηρεσίεςΜηνύματα: 4Τελευταίο Μήνυμα: 03-04-16, 15:08 -
Προβληματακι σε C στο οποιο δεν μπορω να βρω την λυση.
Από zaranero στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 24Τελευταίο Μήνυμα: 28-01-16, 03:11 -
Δεν μπορώ να συγχρονίσω.
Από Theodore41 στο φόρουμ P2PΜηνύματα: 3Τελευταίο Μήνυμα: 31-12-15, 16:11
Bookmarks