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

Ερωτήσεις για C


capoelo

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

Για πολυπλοκοτητες εχω βρει αυτο εδω :

 

http://www.contentedcoder.com/2012/04/big-o-notation-explained-survival-kit.html

 

migf1 ποια η σκοπιμοτητα να χρησιμοποιεις μια συναρτηση που επιστρέφει εναν δεικτη ενω μπορουσαμε να κανουμε την ιδια δουλεια με τυπο void στο προ-προηγουμενο ποστ ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Για πολυπλοκοτητες εχω βρει αυτο εδω :

 

http://www.contentedcoder.com/2012/04/big-o-notation-explained-survival-kit.html

 

migf1 ποια η σκοπιμοτητα να χρησιμοποιεις μια συναρτηση που επιστρέφει εναν δεικτη ενω μπορουσαμε να κανουμε την ιδια δουλεια με τυπο void στο προ-προηγουμενο ποστ ?

Δεν είμαι σίγουρος σε ποιο post αναφέρεσαι, όμως όταν χρησιμοποιείς μια συνάρτηση που παίρνει κάποιον δείκτη και αλλάζει τα περιεχόμενά του, καλό είναι να επιστρέφει το αποτέλεσμα έτσι ώστε να χρησιμοποιηθεί κατευθείαν κάπου αλλού.

Είτε σε μία if, είτε σαν όρισμα σε κάποια άλλη συνάρτηση κτλ...

π.χ.

char* func(char *input, ...);

void print_string(char* input);

...
char *foo;

if ( func(foo,...) == NUL ) { ...

ή

printf("%s\n", func(foo,...);

ή

print_string(func(foo,...));
func(func(foo,...),...);
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που είπε ο bird!

 

 

 

Πρέπει κάποια στιγμή να αρχίσεις να σκέφτεσαι σε πιο γενικό context, ώστε οι συναρτήσεις που φτιάχνεις να είναι επαναχρησιμοποιήσιμες σε διάφορα projects.

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μιγφ1 δωσε ενα παραδειγμα επαναχρησιμοποιησιμης συνάρτησης (οχι μεγαλη σε εκταση) αν μπορεις...

 

α δεν απαντησες σε αυτο με τον δισδιαστατο αν έχω εναν και αποθηκευω μεσα strings μήκους LENWORD γιατι θα πρέπει

 

να βάλω +1 και στο MAXWORDS ?

 

Πχ

 

> ....#define MAXWORDS 30 + 1#define LENWORDS 20 + 1.... char arr2d[MAXWORDS][LENWORDS] = { {'\0'}}; 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω μια ερώτηση που πιο πολύ είναι γενική.

 

αν έχω έναν πίνακα [256][16] θα σαρώνατε ανα γραμμή για κάθε στήλη; ή το αντίστροφο αν θέλατε καλύτερη απόδοση(μειώνοντας τα miss rate στην cache).

 

 

 

#include <stdio.h>

int main(void ) {

int a[256][16];

int i = 0;
int j = 0;
for(i = 0; i < 25; i++) {
    for(j = 0; j < 3; j++) {
        //do something...e.g.
        printf("%p\n", &a[i][j]);
    }
    printf("---\n");
}

return 0;
}

 

 

 

 

Ανα γραμμή ε; ή εξαρτάται απο την γλώσσα και πως δεσμεύει την μνήμη;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω μια ερώτηση που πιο πολύ είναι γενική.

 

αν έχω έναν πίνακα [256][16] θα σαρώνατε ανα γραμμή για κάθε στήλη; ή το αντίστροφο αν θέλατε καλύτερη απόδοση(μειώνοντας τα miss rate στην cache).

 

 

 

#include <stdio.h>

int main(void ) {

int a[256][16];

int i = 0;
int j = 0;
for(i = 0; i < 25; i++) {
    for(j = 0; j < 3; j++) {
        //do something...e.g.
        printf("%p\n", &a[i][j]);
    }
    printf("---\n");
}

return 0;
}
 

 

 

 

Ανα γραμμή ε; ή εξαρτάται απο την γλώσσα και πως δεσμεύει την μνήμη;

 

 

Ναι.

 

Αν τα δεδομενα σου δε χωρανε σε ενα φυσικο πλαισιο μνήμης και γραφεις κωδικα C, μπορεί να είσαι τόσο άτυχος που σε κάθε προσπέλαση μνήμης να έχεις page fault.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ας κάνω κι εγώ μια μάλλον χαζή ερώτηση.

typedef struct {
	/* .... */
} My_struct;

My_struct compute1(int x, int y, ...)
{
	My_struct var;
	
	// computations... changing var...
	
	return(var);
}

My_struct* compute2(My_struct *var, int x, int y, ...)
{
	// computations... changing var...
	
	return(var);
}

Εδώ η compute2 είναι "οικονομικότερη" σε σχέση με την cοmpute1 έτσι δεν είναι; (από πλευράς ταχύτητας και μνήμης)

ή δε θα έχουν ιδιαίτερη διαφορά;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ειναι ετσι κι ετσι. μπορει o compiler να σου μεταφρασει το compute1 σα το compute2, δηλαδη να αγνοησει το My_struct var και να παρει την διευθυνση του απο τον caller. Βεβαια αυτο για c++, για c δεν ειμαι σιγουρος.

Τεσπα, το πρωτο ειναι λαθος οπως και να το παρεις. Διοτι φτιαχνεις δυο δομες MyStruct, μαλιστα κανεις και copypaste.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σαφώς και το 2ο είναι πιο οικονομικό(εκτός αν το struct σου είναι μικρότερο απο pointer). Υποτίθεται ότι στη πρώτη περίπτωση έχεις φτιάξει ένα struct στη main το οποίο περνάς στο function - άρα φτιάχνεις αντίγραφο, οπότε σπαταλάς περισσότερη μνήμη. Τώρα βέβαια αν ο compiler κάνει μόνος του optimize άλλη ιστορία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για αυτό ακριβώς είπα ότι είναι χαζή η ερώτηση από τη στιγμή που η απάντηση είναι προφανής.

Ήθελα να δω μόνο αν υπάρχει κάποια άλλη περίπτωση (όπως πχ για το optimize που μπορεί να κάνει ο compiler όπως είπατε ...)

 

Thanx πάντως!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για αυτό ακριβώς είπα ότι είναι χαζή η ερώτηση από τη στιγμή που η απάντηση είναι προφανής.

Ήθελα να δω μόνο αν υπάρχει κάποια άλλη περίπτωση (όπως πχ για το optimize που μπορεί να κάνει ο compiler όπως είπατε ...)

 

Thanx πάντως!

Δεν είμαι σίγουρος αν οι compilers εσωτερικά επιστρέφουν by-value ή by-reference τα struct ως return values συναρτήσεων (και βαριέμαι να το ψάξω κιόλας τώρα). Αν εσωτερικά τα κάνουν handle by-reference (με ή χωρίς optimization flags) τότε δεν υπάρχουν σημαντικές διαφορές μεταξύ των δυο προσεγγίσεων.

 

Προσωπικά όταν θέλω να είμαι σίγουρος & portable χρησιμοποιώ την 2η μέθοδο.

 

 

... 

α δεν απαντησες σε αυτο με τον δισδιαστατο αν έχω εναν και αποθηκευω μεσα strings μήκους LENWORD γιατι θα πρέπει

να βάλω +1 και στο MAXWORDS ?

 

Πχ

 

 

 

 
....
#define MAXWORDS 30 + 1
#define LENWORDS 20 + 1
....
 
char arr2d[MAXWORDS][LENWORDS] = { {'\0'}};
 

 

 

Για να είμαι ειλικρινής βαριέμαι να κάνω trace τον κώδικα αυτόν, αφενός γιατί δεν τον βρίσκω χρήσιμο (λόγω του 2D) κι αφετέρου επειδή θεωρώ πως αυτό που ρωτάς είναι πολύ εύκολο να το βρεις μόνος σου τρέχοντάς το με διάφορα test-cases.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν υπαρχει λογος για casting

 

Μα δεν ειναι το ιδιο με την getchar που ειχαμε συζητησει παλια???

 

οτι δηλαδη ειναι πιο σωστο να λες int c

 

getchar( c ) παρα char c .

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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