Σελ. 1 από 2 12 ΤελευταίαΤελευταία
Εμφάνιση 1-15 από 16
  1. #1
    Κώδικας:
    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

    Κώδικας:
    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;
    
    }
    To output χωρις την 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
    και με την 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
    Δεν πολλαπλασιαζω με το constant που αναφερει. Αν τρεξω διαδοχικα την printMatrix συναρτηση παλι ολα δουλευουν ρολοι .... μονο οταν βαζω ενδιαμεσα το cout αλλαζουν ολα..... ?????? Καμμια ιδεα?

  2. #2
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    52
    Μηνύματα
    1.081
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    O πίνακας int array[m][n]; δεν παίρνει πουθενά τιμές. Όταν τον διαβάζει η printMatrix εχει σκουπίδια. Βάλε όλο το listing για να δούμε πως το έχεις συνταγμένο.
    ουδέν μονιμότερο του προσωρινού

  3. #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.

  4. #4
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Στην C++ ο ορισμός πίνακα με αυτόν τον τρόπο είναι λάθος!
    Κώδικας:
    int array[m][n];
    Όλες οι παράμετροι του πίνακα πρέπει να είναι σταθερές κατά την διαδικασία της μεταγλώττισης!!

    Αν θέλεις πίνακα m*n μέσα στην συνάρτηση πρέπει να χρησιμοποιήσεις δυναμική δέσμευση μνήμης:
    Κώδικας:
    int ** array = new int*[m];
    for(int i=0; i<m ++m)
        array[i] = new int[n];
    Το ότι γίνεται compile όπως το έχεις είναι περίεργο και μάλλον ο compiler σου απλά πετάει warnings...

    Για να σου δημιουργείται αυτό το πρόβλημα μόνο όταν βάζεις πριν το 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.
    http://www.cplusplus.com/doc/tutorial/arrays/

  5. #5
    ο ότι γίνεται compile όπως το έχεις είναι περίεργο και μάλλον ο compiler σου απλά πετάει warnings...
    Ουτε warnings πεταει , χρησιμοποιω ενα linux ubuntu 16.10 σε virtual machine και το προεγκατεστημενο compiler gcc. Κατι με τη μνημη ναι λες και σβηνει το πινακα και γραφεται απο πανω η cout ... περιεργο

  6. #6
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Λογικά επειδή ο compiler δεν ήξερε το μέγεθος του πίνακα απλά του όρισε μία θέση. Μετά έχεις το cout το οποίο επειδή χρησιμοποιείς ένα string πρέπει και αυτό να πάει στη μνήμη. Μάλλον έδωσε μία θέση για τον πίνακα και στη συνέχεια όρισε το string! Οπότε το ένα έπεσε πάνω στο άλλο!

    Με δυναμική μνήμη (pointers) παίζει;

    - - - Updated - - -

    Έχεις και άλλα θέματα με τον κώδικά σου και το ότι έπαιζε όπως ήταν είσαι λίγο "τυχερός" - έπεσες σε περίπτωση και έπαιξε!!!

  7. #7
    Εγγραφή
    12-04-2007
    Ηλικία
    35
    Μηνύματα
    121
    Downloads
    4
    Uploads
    0
    Ταχύτητα
    24576/1024
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΚΑΜΑΤΕΡΟ
    Router
    NetGear DGN2000
    SNR / Attn
    9(dB) / 33(dB)
    Path Level
    Interleaved
    To μεγαλύτερο πρόβλημα είναι ότι η printMatrix διαβάζει τυχαίο chunk από την μνήμη.
    Το παραπάνω πρόγραμμα έχει μάλλον απροσδιόριστο output που τυχαίνει να δουλεύει επειδή δεν έχει αλλάξει το stack σε εκείνο το σημείο.

    Πού, πώς, πότε έγινε σαφές ότι το array που διαβάζει η printMatrix είναι το ίδιο με αυτό που γράφει η pseudoRandom; (πουθενά)
    To σωστό θα ήταν global array (αν δεν σε ενδιαφέρει variable length στο array) ή δυναμική δημιουργία (όπως είπε ο mitsakos) και pointer passing μεταξύ των συναρτήσεων.

    ΥΓ: Compile με -Wall πάντα για να αποφεύγονται εύκολα λάθη.

  8. #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);
        }
    }
    Το πρωτο παραδειγμα μοιαζει ακριβως με τον κωδικα μου μονο που εχουν οριστει οι διαστασεις σαν σταθερες και τρεχει στην main ... θελει μελετη , θα πειραματιστω λιγο

    - - - Updated - - -

    Πού, πώς, πότε έγινε σαφές ότι το array που διαβάζει η printMatrix είναι το ίδιο με αυτό που γράφει η pseudoRandom; (πουθενά)
    Ναι το σκεφτηκα αυτο ... αλλα επειδη δουλευε το αφησα ... μεχρι που σταματησε να δουλευει με μια απλη προσθηκη. Πρεπει να ψαχτω λιγο.

  9. #9
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Παράθεση Αρχικό μήνυμα από zaranero Εμφάνιση μηνυμάτων
    Το πρωτο παραδειγμα μοιαζει ακριβως με τον κωδικα μου μονο που εχουν οριστει οι διαστασεις σαν σταθερες και τρεχει στην main ... θελει μελετη , θα πειραματιστω λιγο
    Μοιάζει αλλά δεν είναι!!
    Το ότι έχουν οριστεί οι μεταβλητές μέσα από την #define κάνει τον compiler να ξέρει ακριβώς την τιμή καθώς ο preprocessor θα αντικαταστήσει αυτόματα το
    Κώδικας:
    int jimmy [HEIGHT][WIDTH];
    με
    Κώδικας:
    int jimmy [3][5];

  10. #10
    Ευχαριστω για τις απαντησεις , θα επιστρεψω μαλλον αργα το βραδυ ή αυριο γιατι πρεπει να διαβασω αρκετη θεωρια ... για να ξεδιαλυνω τι γινεται τωρα εχω μπερδευτει πολυ και μαλλον θα κανω διαλλειμμα.

  11. #11
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    52
    Μηνύματα
    1.081
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    Κώδικας:
    #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.
    ουδέν μονιμότερο του προσωρινού

  12. #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;
    
    }
    Ευχαριστω , τωρα ειναι ετοιμο. Αν και ακομα δεν εχω καταλαβει καλα γιατι τρεχει , μονο οτι τρεχει ... πρεπει να εντρυφησω λιγο στο γιατι δουλευει.

  13. #13
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.451
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Αναρωτιέσαι γιατί δουλεύει με τους δείκτες;
    Αν ναι τότε πρέπει να σκεφτείς τι μεταφέρεται σε κάθε συνάρτηση! Στην ουσία ορίζοντας την συνάρτηση ως (πχ)
    Κώδικας:
    void printMatrix(int m, int n, int **array)
    του λες ότι θα περάσει ένας pointer σε pointer of int.
    Άρα η συνάρτηση θα πάρει ένα αντίγραφο του Pointer. Το αντίγραφο θα είναι του pointer καθεαυτού, όχι των δεδομένων του!! Άρα θα έχεις δύο Pointer που δείχνουν στην ίδια θέση μνήμης. Αλλάζοντας τα δεδομένα στα οποία δείχνει ο ένας αλλάζουν και τα δεδομένα που δείχνει ο άλλος (αφού στην πραγματικότητα είναι τα ίδια)!

  14. #14
    Εγγραφή
    09-09-2005
    Περιοχή
    Θεσσαλονίκη
    Ηλικία
    52
    Μηνύματα
    1.081
    Downloads
    32
    Uploads
    0
    Τύπος
    FTTH
    Ταχύτητα
    200Mbps/200Mbps
    ISP
    INALAN - OTE
    DSLAM
    ΟΤΕ - ΒΑΡΝΑΣ
    Router
    HAUWEI HG8546M
    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);
    ουδέν μονιμότερο του προσωρινού

  15. #15
    Ευχαριστω

    Νομιζω το καταλαβα αλλα για να σιγουρευτω εκανα μια γραφικη αναπαρασταση.

    Πατήστε στην εικόνα για να τη δείτε σε μεγέθυνση. 

Όνομα:  Arrays.jpg 
Εμφανίσεις:  14 
Μέγεθος:  98,0 KB 
ID: 176412

    - - - Updated - - -

    Διορθωστε με αν ειναι λαθος.

    - - - Updated - - -

    (Για χαρην ευκολιας απλως εβαλα διαδοχικες θεσεις , δεν υπολογισα μεγεθος integer κλπ)

Σελ. 1 από 2 12 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Μηνύματα: 17
    Τελευταίο Μήνυμα: 15-06-16, 13:44
  2. Δεν μπορώ να βρώ άκρη dsl/dslam
    Από NetJim στο φόρουμ Nova
    Μηνύματα: 10
    Τελευταίο Μήνυμα: 17-05-16, 19:33
  3. δεν μπορω να μπω στις επιλογες στον IE
    Από rorocoleman στο φόρουμ Internet, web surfing και online υπηρεσίες
    Μηνύματα: 4
    Τελευταίο Μήνυμα: 03-04-16, 15:08
  4. Προβληματακι σε C στο οποιο δεν μπορω να βρω την λυση.
    Από zaranero στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 24
    Τελευταίο Μήνυμα: 28-01-16, 03:11
  5. Δεν μπορώ να συγχρονίσω.
    Από Theodore41 στο φόρουμ P2P
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 31-12-15, 16:11

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας