Εργαστήριο Τεχνολογίας Λογισμικού
+2 votes
162 views

μπορειτε να προτεινεται καποια σελιδα για διαβασμα 2d πινακων σε συναρτησεις γιατι δεν μπορω να βρω τιποτα που να βοηθαει;

in progintro by (250 points) | 162 views

2 Answers

+2 votes

Αυτή η ερώτηση έχει απαντηθεί αρκετά καλά εδώ:
Passing a 2D array to a C++ function

Μία έξτρα σημείωση που το παραπάνω ποστ & η απάντησή του δεν αναφέρουν είναι το να περνάς επίσης και το μήκος του πίνακα (τις διαστάσεις του όταν πρόκειται για διδιάστατο πίνακα).

Είναι καλό να ορίζεις ρητά τα όρια των arrays που περνάς ώστε η συνάρτηση που τα παίρνει να γνωρίζει πως να τα προσπελάσει (δηλαδή να μην φύγει εκτός των πραγματικών τους ορίων)

by (3.0k points)
+2 votes

Short answer: Don't.

Not so short answer: Κάντο μόνο αν έχεις σκοπό να χρησιμοποιήσεις καρφωτά μεγέθη πινάκων, ακόμα και αν δεν τους γεμίζεις ολόκληρους:

#include <stdio.h>
#define MAX_SIZE 20

void read_array(int arr[MAX_SIZE][MAX_SIZE], int max_i, int max_j)
{
    for (int i = 0; i < max_i; ++i) {
        for (int j = 0; j < max_j; ++j) {
            scanf("%d", &arr[i][j]);
        }   
    }   
}

int main()
{
    int arr[MAX_SIZE][MAX_SIZE]; // είναι πολύ κακή ιδέα που τον έχω local, αλλά θέλω να δείξω ότι γίνεται.
    read_array(arr, 10, 5); 
    return 0;
}

Να σημειώσω πολύ έντονα ότι αν βγάλει warning μην το αγνοήσεις, γιατί θα συμβούν πανηγυρικά πράγματα ^^.

Το γιατί είναι καλό ο πίνακας να είναι global μπορεί να το δει κανείς εδώ. Βέβαια, προκύπτει το εύλογο ερώτημα, αφού έτσι κι αλλιώς θα έχεις global τους πίνακές σου για τις ασκήσεις, γιατί να θες να τους περνάς σε συναρτήσεις ως ορίσματα... :)

Long answer:

Το ξέρω ότι ακούγεται πολύ περίεργη η απάντησή μου, αλλά το συγκεκριμένο πρόβλημα δεν είναι ρεαλιστικό στη C (όσο εντυπωσιακό και αν ακούγεται αυτό). Οι διδιάστατοι πίνακες στη C είναι PITA :)

Υπάρχουν πολλά πράγματα που θα χρειαστεί να κάνεις μελλοντικά, στη μικρή περίπτωση που δουλέψεις σε C. Το να περάσεις διδιάστατο πίνακα σε συνάρτηση δεν είναι ψηλά στη λίστα...

Δεν αποθαρρύνω όποιον θέλει να παίξει με συναρτήσεις και διδιάστατους πίνακες (π.χ. σύμφωνα με άλλες απαντήσεις στην ίδια ερώτηση) αλλά θα δει ότι έχουν πάρα πολλούς περιορισμούς που κάνουν τις συναρτήσεις να μην είναι ό,τι καλύτερο (σ.σ. δουλεύουν για συγκεκριμένα μεγέθη πινάκων στις N-1 διαστάσεις - με κάποιες έξτρα ματσακωνιές στη C99 που είναι ακόμα πιο "εκτός ύλης"... Για περισσότερα "εκτός ύλης" λοιπόν εδώ: Post από nickie στο shmmy (που έφαγε timeout και γράφει "Επισκέπτης"), stackoverflow για VLA).

Αποθαρρύνω όμως όποιον νομίζει ότι κάτι τέτοιο είναι απαραίτητη γνώση για να περάσει το μάθημα :)

Αν πραγματικά θες να γράψεις μία συνάρτηση που παίζει για όλα τα μεγέθη πινάκων, στο 2ο εξάμηνο θα δεις πώς φτιάχνεις την κατάλληλη συνάρτηση loc ώστε να έχεις ένα μονοδιάστατο πίνακα και να τον χρησιμοποιείς ως διδιάστατο. Αν έχεις κέφια, φτιάχνεις και μία κλάση Matrix που παίζει με αυτή τη loc, και είσαι καλυμμένος :)

by (800 points)

298 questions

287 answers

287 comments

3.2k users