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

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

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

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

Δημοσ.

Οπότε πρέπει να μας δώσεις περισσότερο κώδικα, διότι αυτός που δίνεις δεν επαρκεί για να καταλάβουμε τι μπορεί να πηγαίνει στραβά (π.χ. δεν ξέρουμε τι κάνεις με τα list και dummy μέσα στην Delete() ).

 

EDIT:

 

Με το Eclipse έβγαλες άκρη τελικά;

Δημοσ.

Oχι δεν το εψαξα καθολου...δεν βρηκα χρονο...

>
Bool SSLDelete(type *list, type *node) {
while (list->next && list->next != node)
 list = list->next;
if (list->next) {
 list->next = node->next;
 free(node);
 return TRUE;
} else
 return FALSE;
}

Δημοσ.

Πολύ πρόχειρα βλέπω πως τον δείκτη list τον δηλώνεις by-val στα ορίσματα της SSLDelete(), αλλά όταν την καλείς μάλλον τον περνάς by-ref (δεν έχω επαρκή πληροφόρηση για το πως είναι ορισμένος πριν τη κλήση της SSLDelete(), αλλά από τα συμφραζόμενα φαίνεται να τον περνάς by-ref ).

Δημοσ.

Και αυτο το εγραψα λαθος εδω(by ref ειναι το list)...Τεσπα θα το ξανα κοιταξω και αν ειναι θα στειλω πιο συγκεκριμενες αποριες...Ευχαριστω

Δημοσ.

@imitheos:

 

Τελικά έχω παρερμηνεύσει κάτι σχετικά με το πρότυπο και την αρχική σου παρατήρηση (btw, που χάθηκες ρε συ);

 

Επίσης, θα μπορούσες όταν ευκαιρήσεις (ή όποιος άλλος) να εξηγήσεις τι εννοεί το απόσπασμα του προτύπου σχετικά με το union, γιατί δεν καταλαβαίνω... γρι;

 

 

 

Δημοσ.
  Στις 9/11/2012 στις 3:00 ΜΜ, migf1 είπε

@imitheos:

 

Τελικά έχω παρερμηνεύσει κάτι σχετικά με το πρότυπο και την αρχική σου παρατήρηση (btw, που χάθηκες ρε συ);

 

Επίσης, θα μπορούσες όταν ευκαιρήσεις (ή όποιος άλλος) να εξηγήσεις τι εννοεί το απόσπασμα του προτύπου σχετικά με το union, γιατί δεν καταλαβαίνω... γρι;

 

>
int my2d[2][3] = { {1,2,3}, {4,5,6} };
int *p;
union mitsos {
 int arr2d[2][3];
 int arr1d[6];
};
p = ((union mitsos *)&my2d)->arr1d;

 

Εκτός από δείκτη σε συμβατό τύπο (δηλαδή στον ίδιο δισδιάστατο με τον οποίο έχει δηλωθεί αρχικά ο πίνακας) και με δείκτη σε char μπορείς να χρησιμοποιήσεις union. Μπορείς δηλαδή να κάνεις cast τον δισδιάστατο πίνακά σου σε ένα union που περιέχει και τις δύο "μορφές" πίνακα και μετά να θέσεις την διεύθυνση του μονοδιάστατου σε ένα απλό δείκτη σε int. Στο περίπου δηλαδή όπως φαίνεται στον παραπάνω code. Επειδή το union εμπεριέχει τον σωστό τύπο (τον δισδιάστατο) επιτρέπεται να κάνεις cast τον πίνακα και έπειτα απλά χρησιμοποιείς την μονοδιάστατη μορφή. Όμως για να είσαι σίγουρος θέλεις C99 και πέρα.

Δημοσ.

Thanks για την εξήγηση (a bit complicated, indeed :))

 

Συνεχίζω όμως να διατηρώ επιφυλάξεις για την ακαταλληλότητα των (non-char *) και πιο συγκεκριμένα ακόμα και σε σύγκριση με το απόσπασμα του προτύπου που παράθεσες.

 

Στο δικό μου αντίγραφο του προτύπου, αναφέρονται τα εξής:

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

Δηλαδή, όπως το ερμηνεύω εγώ (ενδεχομένως λανθασμένα), το casting είναι ακριβώς αυτό που εξασφαλίζει τη συμβατότητα των τύπων του stored value.

 

Επίσης, από το c-faq 6.3 ...

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

EDIT:

 

Απλώς σαν συμπληρωματική πληροφορία, η μέθοδος αυτή με το walk είναι επί της ουσίας αυτή που σε αυτό το άρθρο ισοδυναμεί με την μέθοδο 9 (η οποία πάνω-κάτω ισοδυναμεί με την μέθοδο 8).

 

Αυτές οι 2 μέθοδοι είναι κατά κανόνα ταχύτεροι (επιθυμητό σε σε speed-critical εφαρμογές) όπως φαίνεται και στα benchmarks του άρθρου (χρώματα γκρι και μαύρο, για τις μεθόδους 9 και 8 αντίστοιχα).

Δημοσ.
  Στις 10/11/2012 στις 11:42 ΠΜ, migf1 είπε

Συνεχίζω όμως να διατηρώ επιφυλάξεις για την ακαταλληλότητα των (non-char *) και πιο συγκεκριμένα ακόμα και σε σύγκριση με το απόσπασμα του προτύπου που παράθεσες.

 

Επίσης, από το c-faq 6.3 ...

 

Ναι όμως η 6.3 επειδή εξηγεί το "decaying" μιλάει μόνο για μονοδιάστατους οπότε όσα λέει είναι σωστά.

 

Δες τι λέει και η 6.19 που περιγράφει ακριβώς αυτό που λέμε.

 

  C-FAQ 6.19 είπε:

It must be noted, however, that a program which performs multidimensional array subscripting ``by hand'' in this way is not in strict conformance with the ANSI C Standard; according to an official interpretation, the behavior of accessing (&array[0][0])[x] is not defined for x >= NCOLUMNS.

Όταν περνάς τη διεύθυνση του 1ου στοιχείου και μετά διατρέχεις τις διευθύνσεις σαν να ήταν "flat" ο πίνακας δηλαδή μονοδιάστατος, όταν περάσεις NCOLUMNS στοιχεία δηλαδή την 1η γραμμή, τότε η συμπεριφορά είναι αόριστη.

 

  Στις 10/11/2012 στις 11:42 ΠΜ, migf1 είπε

Απλώς σαν συμπληρωματική πληροφορία, η μέθοδος αυτή με το walk είναι επί της ουσίας αυτή που σε αυτό το άρθρο ισοδυναμεί με την μέθοδο 9 (η οποία πάνω-κάτω ισοδυναμεί με την μέθοδο 8).

 

Αυτές οι 2 μέθοδοι είναι κατά κανόνα ταχύτεροι (επιθυμητό σε σε speed-critical εφαρμογές) όπως φαίνεται και στα benchmarks του άρθρου (χρώματα γκρι και μαύρο, για τις μεθόδους 9 και 8 αντίστοιχα).

 

Καλά τα λέει το άρθρο. Συγκρίνει όλες τις "κοινές", όπως αναφέρει, μεθόδους προσπέλασης και προτείνει την πιο γρήγορη. Δηλαδή προτείνει κάτι πρακτικό για να το χρησιμοποιεί ο κόσμος. Δεν αναφέρει πουθενά ότι σκοπεύει σε πλήρη τήρηση του προτύπου. Άσε που θα μπορούσε ακόμη και να το πει γιατί δεν έχω δει καμμία υλοποίηση να συμπεριφέρεται όπως περιέγραψα αρχικά (θα ήταν χαζό άλλωστε).

 

Αυτό πάντως το θέμα με τους πίνακες που μας έφαγε τόση ώρα είναι απλό. Κάτσε να συζητήσουμε για unions (όταν ανέφερα το τρόπο με τη union αν πρόσεξες ανέφερα ότι θέλει c99 και πέρα) να δεις τι χαμός γίνεται εκεί :P

 

Για να μη θαφτεί η ερώτηση του nik234, να αναφέρω πάλι ότι αν δουλεύει κάποιος eclipse σε windows ας γράψει πως μπορούν να εμφανιστούν αναλυτικά τα μηνύματα λάθους του project.

Δημοσ.

Ναι. Δηλαδη σου λεει οτι συμφωνα με την αυστηρη θεωρια αν εσυ περάσεις έναν 2D array σε μια συναρτηση τοτε αυτος

μεταφραζεται σαν ενας δεικτης σε πινακα μήκους δευτερης διάστασης. Την πρωτη μπορουμε να την παραλειψουμε εχουμε χιλιοπεί :P

 

Αν δηλαδη έχεις

 

>

#include<stdio.h>
void func( int [][3]);

int main(void)
{

int arr2d[2][3] = { { 1 , 2 , 3 } , { 4 , 5 , 6 } ;

func( arr2d ) ;

return 0;
}

void func( arr2d [2][3] )
{
int *p= NULL;

for( p = *arr2d ; p < *arr2d + 6; p++)
printf(" %d " , *p);

}

 

Toτε αν εχω καταλαβει καλα ο πινακας {4,5,6}

θεωρειται αοριστη συμπεριφορα απο το προτυπο αλλα δουλευει επειδη αυτοι που εχουν φτιαξει

τον compiler δεν ειναι βλαμμένοι :P

 

Mε απλα λογια χωρις αλλη εμπλοκη των αγγλικων απο το προτυπο για να εξαχθεί και ενα τελικο συμπερασμα .

 

  Στις 10/11/2012 στις 11:42 ΠΜ, migf1 είπε

Thanks για την εξήγηση (a bit complicated, indeed :))

 

Συνεχίζω όμως να διατηρώ επιφυλάξεις για την ακαταλληλότητα των (non-char *) και πιο συγκεκριμένα ακόμα και σε σύγκριση με το απόσπασμα του προτύπου που παράθεσες.

 

Στο δικό μου αντίγραφο του προτύπου, αναφέρονται τα εξής:

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

Δηλαδή, όπως το ερμηνεύω εγώ (ενδεχομένως λανθασμένα), το casting είναι ακριβώς αυτό που εξασφαλίζει τη συμβατότητα των τύπων του stored value.

 

Επίσης, από το c-faq 6.3 ...

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

EDIT:

 

Απλώς σαν συμπληρωματική πληροφορία, η μέθοδος αυτή με το walk είναι επί της ουσίας αυτή που σε αυτό το άρθρο ισοδυναμεί με την μέθοδο 9 (η οποία πάνω-κάτω ισοδυναμεί με την μέθοδο 8).

 

Αυτές οι 2 μέθοδοι είναι κατά κανόνα ταχύτεροι (επιθυμητό σε σε speed-critical εφαρμογές) όπως φαίνεται και στα benchmarks του άρθρου (χρώματα γκρι και μαύρο, για τις μεθόδους 9 και 8 αντίστοιχα).

 

migf1 εννοεις τον walk που είχες δωσει στον κώδικα με την while για τους δισδιάστατους ? Αυτος ειναι speed efficient ?

 

http://ideone.com/RqdXtf

Δημοσ.
  Στις 10/11/2012 στις 1:12 ΜΜ, imitheos είπε

...

Δες τι λέει και η 6.19 που περιγράφει ακριβώς αυτό που λέμε.

Όταν περνάς τη διεύθυνση του 1ου στοιχείου και μετά διατρέχεις τις διευθύνσεις σαν να ήταν "flat" ο πίνακας δηλαδή μονοδιάστατος, όταν περάσεις NCOLUMNS στοιχεία δηλαδή την 1η γραμμή, τότε η συμπεριφορά είναι αόριστη.

 

Ναι, το είχα δει ("according to an official interpretation"). Αυτό ακριβώς το interpretation είναι που συζητάμε κι εδώ (προφανώς εγκυκλοπαιδικά).

 

Βασικά με βλέπεις κι επιμένω, για 2 λόγους:

 

α) Επειδή αποτελεί κοινή (κοινότατη) πρακτική

β) Επειδή αν το δεχτούμε αβασάνιστα αυτό το interpretation, τότε νομίζω πως κάνει defeat (contradict) όλη την έννοια του casting στην C.

 

Συμφωνούμε στο β);

 

@StarLight: Ναι.

Δημοσ.

@migf1

 

sum is : 20

Process returned 0 (0x0) execution time : 0.013 s

Press any key to continue.

 

Aπο τον κώδικα σου με τον walk.

 

Aν συγκριθει με αυτον εδω

 

>
#include<stdio.h>
#define rows 2
#define COLS 3
void arr2d_sumElements( int [][COLS] , int );
int main(void)
{
int arr2d[rows][COLS]= { {1 , 2 , 3 } , { 4 , 5 , 5}};
arr2d_sumElements(arr2d,2);
return 0;
}
void arr2d_sumElements( int arr2d[][COLS], int nrows ){
   int sum = 0 , i , j;

  for(i=0; i<rows; i++)
   for(j=0; j<COLS; j++)

   sum += arr2d[i][j];
   printf(" sum is :  %d " , sum);
}

 

Μην σου πω οτι δινει και λιγοτερο...

 

sum is : 20

Process returned 0 (0x0) execution time : 0.007 s

Press any key to continue.

Δημοσ.

Κώστα, το benchmarking έχει γίνει σχεδόν ολόκληρη επιστήμη (π.χ.: http://download.intel.com/embedded/software/IA/324264.pdf), σίγουρα χρειάζεται συγγραφή custom ρουτίνων μέτρησης (ιδανικά προσαρμοσμένες στην εκάστοτε αρχιτεκτονική του συστήματος) και σίγουρα δεν περιλαμβάνει μέσα του ούτε printf() statements, ούτε i/o γενικότερα.

 

O κώδικας που έγραψα και χαρακτήρισα ως γρήγορο, δεν είναι ούτε δικά μου επινόηση ούτε κάτι καινούριο. Η τεχνική προσπέλασης πολυδιάστατων πινάκων μονοδιάστατα είναι common-ground στις speed-critical εφαρμογές. Επίσης, αν ο compiler είναι καλός, τότε η ενεργοποίηση των optimization flags του μετατρέπουν έτσι κι αλλιώς τα neseted-loops σε 1.

 

Παρεμπιπτόντως, σχετικά με τις ερμηνείες των προτύπων (και πριν απαντήσει ο imitheos αν συμφωνεί ή όχι με το β) του προηγούμενου ποστ μου), θα ήθελα να προσθέσω στο απόσπασμα του imitheoy καθώς και σε αυτά που συμπλήρωσα εγώ, ακόμα ένα απόσπασμα, από το C11 standard (δεν έχω εύκαιρο το C99 εδώ... είναι στο laptop εκείνο).

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

Η ερώτηση λοιπόν είναι κατά πόσο τα πρότυπα περιέχουν σημεία ανοιχτά σε διαφορετικές ερμηνείες, ή ακόμα κι αν ενίοτε περιέχουν αντιφάσεις (οι οποίες συνήθως διορθώνονται στα final drafts, ή σε επόμενη έκδοση).

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

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

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