myle Δημοσ. 19 Ιουνίου 2008 Share Δημοσ. 19 Ιουνίου 2008 Δοκίμασε == και βάλε μόνο έναν χαρακτήρα. Αν θες πολλούς την strncmp. <Άκυρο, δεν είδα ότι απαντήθηκε> Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
antiregulator Δημοσ. 25 Ιουνίου 2008 Share Δημοσ. 25 Ιουνίου 2008 αν σκεφτεις οτι ο τροπος διαχειρισης των πινακων ειναι μεσω δεικτη (pointer), τοτε ενας δεικτης σε δεικτη (π.χ. char **argv) αναπαριστα ενα μονοδιαστατο πινακα μονοδιαστατων πινακων, αρα δισδιαστατο πινακα χαρακτηρων! ωραιο ε? κ εγω προχθες το μαθα! Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Aesmade Δημοσ. 25 Ιουνίου 2008 Share Δημοσ. 25 Ιουνίου 2008 αν σκεφτεις οτι ο τροπος διαχειρισης των πινακων ειναι μεσω δεικτη (pointer), τοτε ενας δεικτης σε δεικτη (π.χ. char **argv) αναπαριστα ενα μονοδιαστατο πινακα μονοδιαστατων πινακων, αρα δισδιαστατο πινακα χαρακτηρων! ωραιο ε? κ εγω προχθες το μαθα! Ή ένα μονοδιάστατο πίνακα από strings. Μην τον μπερδέψουμε τον άνθρωπο... Δηλαδή ίδιο πράγμα είναι πάνω κάτω το **argv με το *argv[], όπως και π.χ. το a[] με το *a. Υπάρχουν μόνο κάποιες μικροδιαφορές (δεν μπορείς να αλλλάξεις τη διεύθυνση στην οποία δείχνει ένας πίνακας, με πίνακα η sizeof δίνει το μέγεθος όλων των στοιχείων ενώ με pointer μόνο του pointer). Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
xyz_ Δημοσ. 25 Ιουνίου 2008 Share Δημοσ. 25 Ιουνίου 2008 Ή ένα μονοδιάστατο πίνακα από strings. Μην τον μπερδέψουμε τον άνθρωπο...Δηλαδή ίδιο πράγμα είναι πάνω κάτω το **argv με το *argv[], όπως και π.χ. το a[] με το *a. Υπάρχουν μόνο κάποιες μικροδιαφορές (δεν μπορείς να αλλλάξεις τη διεύθυνση στην οποία δείχνει ένας πίνακας, με πίνακα η sizeof δίνει το μέγεθος όλων των στοιχείων ενώ με pointer μόνο του pointer). Δεν υπάρχουνε αυτές οι διαφορες σε function prototype με outmost []. Γενικά [] είναι incomplete type: > #include <stdio.h> #include <stdlib.h> struct paradeigma { int a; char b[]; /* sizeof (paradeigma. einai error */ }; int main(void) { struct paradeigma *p = malloc(sizeof paradeigma + sizeof "hello world"); if(p) { strcpy(p->b, "hello world"); puts(p->; } free(p); return 0; } Είναι ένα σωστό πρόγραμμα σε C99 αλλα όχι σε C89. Σε function declaration, το outmost [] είναι pointer. > int f(char str[]); Το ίδιο με > int f(char *str); Αλλα αυτό ισχύει μονο σε outmost []. Παράδειγμα: > int f(char (*str)[]); δεν είναι το ίδιο με > int f(char *(*str)); Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Razor911 Δημοσ. 20 Ιανουαρίου 2010 Share Δημοσ. 20 Ιανουαρίου 2010 Ευχαριστω πολυ , επιτελους βρεθηκε καποιος να με διαφωτισει για το τι ακριβως ειναι αυτα τα 2;) Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tespa_2002 Δημοσ. 20 Ιανουαρίου 2010 Share Δημοσ. 20 Ιανουαρίου 2010 > #include <stdio.h> int main(int argc, char **argv) { if(argc>1) if((argv[1][0] == '-') && (argv[1][1] == 'a') && (argv[1][2] == '\0')) printf("Correct Argument\n"); return 0; } Εναλλακτικά Sorry, αλλά η παραπάνω τεχνική δεν είναι σωστή... Σκέψου τι θα γίνει αν π.χ. η 1η παράμετρος της γραμμής εντολών ήταν - (σχέτη παύλα) και όχι -a. Τυχόν πρόσβαση στο argv[1][2] θα σε έβγαζε εκτός της δεσμευμένης μνήμης στην οποία δείχνει το argv[1]. Στο συγκεκριμένο παράδειγμα βέβαια δε θα είχες πρόβλημα, επειδή οι προσπελάσεις στα argv[1][something] γίνονται όλες στα πλαίσια μιας λογικής έκφρασης με AND, οπότε όταν βρεθεί η 1η ψευδής σύγκριση θα υπάρχει τελικό αποτέλεσμα της λογικής συνθήκης και δε θα συνεχίσει στις επόμενες προσπελάσεις, αλλά γενικά δε μου φαίνεται καλή ιδέα... Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
C6WGMN Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 Από θεωρητικής απόψεως το ακριβώς ίδιο κάνει και η συνάρτηση strcmp που όλοι γνωρίζουμε ότι είναι ασφαλές. Οι υποψίες σου θα ήταν βάσιμες αν η πηγή των argv δεν εξασφάλιζε την ιδιότητα να είναι strings. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
ippo00 Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 Ο μόνος κίνδυνος είναι το segfault στον έλεγχο του \0. Κατά τα άλλα δεν θυμάμαι γιατί το έγραψα έτσι και ούτε με ενδιαφέρει να το σκεφτώ μιάς και πέρασαν 18 μήνες. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tespa_2002 Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 Ο μόνος κίνδυνος είναι το segfault στον έλεγχο του \0. Ακριβώς αυτό εννοώ. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
bxenos Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 Ο μόνος κίνδυνος είναι το segfault στον έλεγχο του \0. ... Ακριβώς αυτό εννοώ. δεν υπάρχει τέτοιο θέμα. o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει. π.χ. > char c = 3; if(c==2 && memset((void *)0,0,100)){ //εσβησα το NULL:shock: } Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tasosk11 Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 παιδια εχω και εγω μια απορεια πανω στο θεμα.. εχω το εξης: int main (int argc, char *argv[]) { if(argv[3] > 53 || argv[3] < 1){ printf("Invalid integer value\n"); exit(1); } και shuffleDeck(deck,argv[3]); και δινω στην γραμμη εντολων το εξης: ./set4 deck.txt out.txt 10 και μου βγαζει προβλημα στο argv[3]: comparison between pointer and integer και passing argument 2 of ‘shuffleDeck’ makes integer from pointer without a cast πραγμα πολυ λογικο βεβαια..απλα δεν ξερω πωσ να το διορθωσω ευχαριστωωωωωω Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
virxen75 Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 παράδειγμα atoi (μετατροπή string σε ακέραιο) > #include <stdio.h> #include <stdlib.h> int main(){ char a[]="53"; int aa=atoi(a); printf("integer=%d",aa); return 0; } μετέτρεψε τα string π.χ. argv[3] σε ακέραιο και μετά κάνε την σύγκριση επίσης πέρασε τον ακέραιο σαν όρισμα στην συνάρτηση σου. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tespa_2002 Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 δεν υπάρχει τέτοιο θέμα.o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει. π.χ. > char c = 3; if(c==2 && memset((void *)0,0,100)){ //εσβησα το NULL:shock: } Επίσης αυτό εννοούσα με την δεύτερη παράγραφο του μηνύματός μου. Στο ΣΥΓΚΕΚΡΙΜΕΝΟ παράδειγμα δε θα γινόταν segfault, λόγω της ιδιότητας short circuit των λογικών εκφράσεων στη C (δηλαδή το να γίνονται evaluate ακριβώς μέχρι το σημείο που η γλώσσα είναι σίγουρη για το τελικό αποτέλεσμα) όμως σε οποιοδήποτε άλλο setting θα ήταν επικίνδυνο. Anyway, είμαστε ούτως ή άλλως offtopic Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
C6WGMN Δημοσ. 21 Ιανουαρίου 2010 Share Δημοσ. 21 Ιανουαρίου 2010 δεν υπάρχει τέτοιο θέμα.o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει. π.χ. > char c = 3; if(c==2 && memset((void *)0,0,100)){ //εσβησα το NULL:shock: } κοίτα και αυτό > int main(void) { return (0 && 1/0); } Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Luffy-san Δημοσ. 22 Ιανουαρίου 2010 Share Δημοσ. 22 Ιανουαρίου 2010 παιδια εχω και εγω μια απορεια πανω στο θεμα..εχω το εξης: int main (int argc, char *argv[]) { if(argv[3] > 53 || argv[3] < 1){ printf("Invalid integer value\n"); exit(1); } και shuffleDeck(deck,argv[3]); και δινω στην γραμμη εντολων το εξης: ./set4 deck.txt out.txt 10 και μου βγαζει προβλημα στο argv[3]: comparison between pointer and integer και passing argument 2 of ‘shuffleDeck’ makes integer from pointer without a cast πραγμα πολυ λογικο βεβαια..απλα δεν ξερω πωσ να το διορθωσω ευχαριστωωωωωω Θα χαιρωτανε πολυ η κυρα - Βανα να σε βλεπει να λυνεις ασκησεις.Α ρε τι μας κανουν.... Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.