Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα ;)

 

γραφω στην c εναν κωδικα, και εχω χαθει σε αυτο το σημειο:

void max(float a[10][10]){
	int i,j;
	float m;
	m=a[0][0];
	for (i=0; i<=9; i++){
		for (j=0; j<=19; j++){
			if (a[i][j]>m){
				m=a[i][j];
			}
		}
	}
	return m;
}

ειναι μια συναρτιση η οποια βρισκει το max ενος πινακα a. το προβλημα ειναιι πως εγω θελω να την καλω στην main και να αποθηκευει σε μια μεταβλητη το μεγιστο του πινακα. αν βαλω αντι για return ενα printf τυπωνει κανονικα το max εγω θελω να το κρατησω σε μια μεταβλητη χ καθως θα καλεσω την συναρτιση στην main.

 

main(){

x=max(a) ///a ειναι ο πινακας που θελω να βω το max

}

  • Απαντ. 38
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ.

Τι τύπο πρέπει να βάλω;

 

Έκανα μια αλλαγή και πλέον δουλεύει αλλά θα ήθελα να μάθω πως θα έπρεπε να γίνει με τον παραπάνω τρόπο.

  • Moderators
Δημοσ.

Μία συνάρτηση με τύπο επιστροφής void δεν επιστρέφει τίποτα. Για να επιστρέψει κάτι, ο τύπος της θα πρέπει να είναι κάτι άλλο από void. Το τι είναι αυτό το κάτι εσύ θα του πεις. Στην περίπτωσή σου θα πρέπει να είναι float, μιας και τα στοιχεία του πίνακα που περνάς (άρα και το μέγιστο στοιχείο του) είναι float.

  • Like 2
Δημοσ.

Οκ αυτό ήταν τελικά..

 

Ακόμη:

 

Έστω ότι έχω έναν πινακα (στην c, float) ο οποίος ισχύει για μια χρονική στιγμή t=0. Και θα ήθελα να υπολογίσω τις τιμές του πινακα για μια άλλη χρονική στιγμή t=x η οποία θα εισάγεται από τον χρήστη. Αυτό που έχω είναι ένας τύπος ο οποίος βρίσκει τον αμέσως επόμενο πινακα. Δηλαδή για t=0 χρησιμοποιώ τον τύπο και βγάζω πινακα για t=1 πως θα μπορούσα να βγάζω πινακα για χρονική στιγμή, υπόψιν βέβαια ότι θα πρέπει να υπολογίζω τους προηγούμενους κάθε φορά για να φτάσω στον ζητούμενο; διότι έχω μπερδευτεί καθώς αν για t=0 έχω έναν πινακα κάνω αλλαγές και φτιάχνω για t=1 έναν άλλο. Αυτό που θέλω να βρω είναι αν υπάρχει τρόπος να βρω τον τελικό πινακα χωρίς να χρησιμοποιήσω πολλές μεταβλητές πχ αν θέλω τον πινακα για t=3 να μην χρειαστούν 4 πίνακες: ένας για t=0 κλπ...

  • Moderators
Δημοσ.

Αν δεν έχεις τρόπο να υπολογίσεις τον πίνακα για μια τυχαία χρονική στιγμή τότε αναγκαστικά πρέπει να το κάνεις σταδιακά (αναδρομικά ή αλλιώς). Βάλε αν θες το πρόβλημα ως έχει ακριβώς μήπως υπάρχει άλλος τρόπος.

  • Like 1
Δημοσ.

Οκ αυτό ήταν τελικά..

 

Ακόμη:

 

Έστω ότι έχω έναν πινακα (στην c, float) ο οποίος ισχύει για μια χρονική στιγμή t=0. Και θα ήθελα να υπολογίσω τις τιμές του πινακα για μια άλλη χρονική στιγμή t=x η οποία θα εισάγεται από τον χρήστη. Αυτό που έχω είναι ένας τύπος ο οποίος βρίσκει τον αμέσως επόμενο πινακα. Δηλαδή για t=0 χρησιμοποιώ τον τύπο και βγάζω πινακα για t=1 πως θα μπορούσα να βγάζω πινακα για χρονική στιγμή, υπόψιν βέβαια ότι θα πρέπει να υπολογίζω τους προηγούμενους κάθε φορά για να φτάσω στον ζητούμενο; διότι έχω μπερδευτεί καθώς αν για t=0 έχω έναν πινακα κάνω αλλαγές και φτιάχνω για t=1 έναν άλλο. Αυτό που θέλω να βρω είναι αν υπάρχει τρόπος να βρω τον τελικό πινακα χωρίς να χρησιμοποιήσω πολλές μεταβλητές πχ αν θέλω τον πινακα για t=3 να μην χρειαστούν 4 πίνακες: ένας για t=0 κλπ...

 

Δεν είναι απαραίτητο  να χρησιμοποιήσεις πολλούς πίνακες, εφ'όσον η συνάρτηση (τύπος) είναι μία θα κληθεί t φορές απλά σαν όρισμα θα παίρνει το array(t).

 

Επίσης, επειδή λογικά θα προβληματιστείς στο να κάνεις return ένα array αυτό είναι αδύνατο στη C. Αυτό όμως που γίνεται είναι να επιστρέψεις ένα struct το οποίο μπορέι να περιέχει arrays. 

  • Like 1
  • 1 χρόνο αργότερα...
Δημοσ.
Στις 24/3/2017 στις 5:33 ΜΜ, sundance_kid είπε

return ένα array αυτό είναι αδύνατο στη C

 

Εάν επιστρέψεις δείκτη σε κάτι, πώς αυτό είναι διαφορετικό από το να επιστρέφεις πίνακα, εφόσον και το array notation (στην ουσία) pointers είναι; 

Πώς λοιπόν είναι αδύνατο να επιστρέψεις array στην C;

Δημοσ.
2 ώρες πριν, Fortistis είπε

Εάν επιστρέψεις δείκτη σε κάτι, πώς αυτό είναι διαφορετικό από το να επιστρέφεις πίνακα, εφόσον και το array notation (στην ουσία) pointers είναι; 

Πώς λοιπόν είναι αδύνατο να επιστρέψεις array στην C;

Προφανώς εννοεί ότι δεν μπορείς να επιστρέψεις ένα copy του array, όταν από την άλλη μπορείς να επιστρέψεις ένα copy ενός struct.
 

Δημοσ. (επεξεργασμένο)
Στις 23/3/2017 στις 4:53 ΜΜ, taslikos είπε

Οκ αυτό ήταν τελικά..

Ακόμη:

Έστω ότι έχω έναν πινακα (στην c, float) ο οποίος ισχύει για μια χρονική στιγμή t=0. Και θα ήθελα να υπολογίσω τις τιμές του πινακα για μια άλλη χρονική στιγμή t=x η οποία θα εισάγεται από τον χρήστη. Αυτό που έχω είναι ένας τύπος ο οποίος βρίσκει τον αμέσως επόμενο πινακα. Δηλαδή για t=0 χρησιμοποιώ τον τύπο και βγάζω πινακα για t=1 πως θα μπορούσα να βγάζω πινακα για χρονική στιγμή, υπόψιν βέβαια ότι θα πρέπει να υπολογίζω τους προηγούμενους κάθε φορά για να φτάσω στον ζητούμενο; διότι έχω μπερδευτεί καθώς αν για t=0 έχω έναν πινακα κάνω αλλαγές και φτιάχνω για t=1 έναν άλλο. Αυτό που θέλω να βρω είναι αν υπάρχει τρόπος να βρω τον τελικό πινακα χωρίς να χρησιμοποιήσω πολλές μεταβλητές πχ αν θέλω τον πινακα για t=3 να μην χρειαστούν 4 πίνακες: ένας για t=0 κλπ...

Προσθέτεις μια διασταση στον αρχικό σου πίνακα (χρόνος). Aν είναι διδιάστατος τον κανεις τρισδιάστατο κοκ. δλδ γινεται 'πίνακας που περιέχει πίνακες' 

Επεξ/σία από albNik
Δημοσ.
8 ώρες πριν, Ilias95 είπε

Προφανώς εννοεί ότι δεν μπορείς να επιστρέψεις ένα copy του array, όταν από την άλλη μπορείς να επιστρέψεις ένα copy ενός struct.
 

α) Γιατί προφανώς, πώς το γνωρίζεις εσύ ότι είναι "προφανώς" και πώς μπορείς να το δείξεις ότι είναι "προφανώς"; 

β) Δεν σχολίασα τι εννοούσε, αλλά τι έγραψε. 

Δημοσ.
2 ώρες πριν, Fortistis είπε

α) Γιατί προφανώς, πώς το γνωρίζεις εσύ ότι είναι "προφανώς" και πώς μπορείς να το δείξεις ότι είναι "προφανώς"; 

Common sense.
Δεν χρειάζεται να αρπαζόμαστε όμως. Κουβέντα κάνουμε.

2 ώρες πριν, Fortistis είπε

β) Δεν σχολίασα τι εννοούσε, αλλά τι έγραψε. 

Αυτό που έγραψε είναι σωστό.
Στην C δεν μπορείς να επιστρέψεις array από συνάρτηση.

Δημοσ. (επεξεργασμένο)
32 λεπτά πριν, Ilias95 είπε

Common sense.
Δεν χρειάζεται να αρπαζόμαστε όμως. Κουβέντα κάνουμε.

Αυτό που έγραψε είναι σωστό.
Στην C δεν μπορείς να επιστρέψεις array από συνάρτηση.

Πώς ακριβώς κατάλαβες ότι αρπάχτηκα; “Common sense” και αυτό;

Και ξαναρωτάω, από πού προκύπτει ότι «προφανώς», δεδομένου πως ούτε τον έβλεπες, ούτε τον ξέρεις;

Τέλος, γιατί δεν μπορείς να επιστρέψεις πίνακα από συνάρτηση, χρησιμοποιώντας δείκτες; Τι διαφορά έχει ένας πίνακας από μία μεταβλητή τύπου δείκτη;

Επεξ/σία από Fortistis
Δημοσ. (επεξεργασμένο)
27 λεπτά πριν, Fortistis είπε

Πώς ακριβώς κατάλαβες ότι αρπάχτηκα; “Common sense” και αυτό;

Έτσι μου φάνηκε από το ύφος σου, αν κατάλαβα λάθος ζητώ συγγνώμη.

27 λεπτά πριν, Fortistis είπε

Τέλος, γιατί δεν μπορείς να επιστρέψεις πίνακα από συνάρτηση, χρησιμοποιώντας δείκτες;

Κανείς δεν είπε ότι δεν μπορείς να επιστρέψεις έναν pointer σε οποιαδήποτε virtual διεύθυνση μνήμης θες.
Και κανείς δεν είπε ότι τα δεδομένα που βρίσκονται σε αυτή τη διεύθυνση μνήμης δεν μπορείς να τα κάνεις interpret σαν array ή σαν struct ή σαν οτιδήποτε άλλο θες!

Αυτό που γράφτηκε παραπάνω είναι ότι δεν μπορείς να επιστρέψεις array από function.
Και έτσι είναι, τι να κάνουμε; Να αλλάξουμε το specification και τους compilers;

int [] foo(void); // ILLEGAL
struct bar foo(void); // LEGAL

Στην C μπορείς να επιστρέψεις από μια συνάρτηση ints, chars, pointers, structs και άλλα πράγματα.
Arrays ΔΕΝ μπορείς να επιστρέψεις.
Στην C τα arrays δεν είναι first class citizens!

Στην Java που είναι first class citizens μπορείς να γράψεις:

int [] foo(); // LEGAL

 

27 λεπτά πριν, Fortistis είπε

Τι διαφορά έχει ένας πίνακας από μία μεταβλητή τύπου δείκτη;

Τώρα αυτό είναι διαφορετική ερώτηση.
Αν πραγματικά δεν ξέρεις τότε googlαρε.

Επεξ/σία από Ilias95

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...