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

τι είναι τα argc και argv στη C


GIANNISPATRA

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

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

αν σκεφτεις οτι ο τροπος διαχειρισης των πινακων ειναι μεσω δεικτη (pointer), τοτε ενας δεικτης σε δεικτη (π.χ. char **argv) αναπαριστα ενα μονοδιαστατο πινακα μονοδιαστατων πινακων, αρα δισδιαστατο πινακα χαρακτηρων! :D

 

ωραιο ε? κ εγω προχθες το μαθα! ;)

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

αν σκεφτεις οτι ο τροπος διαχειρισης των πινακων ειναι μεσω δεικτη (pointer), τοτε ενας δεικτης σε δεικτη (π.χ. char **argv) αναπαριστα ενα μονοδιαστατο πινακα μονοδιαστατων πινακων, αρα δισδιαστατο πινακα χαρακτηρων! :D

 

ωραιο ε? κ εγω προχθες το μαθα! ;)

Ή ένα μονοδιάστατο πίνακα από strings. Μην τον μπερδέψουμε τον άνθρωπο...

Δηλαδή ίδιο πράγμα είναι πάνω κάτω το **argv με το *argv[], όπως και π.χ. το a[] με το *a. Υπάρχουν μόνο κάποιες μικροδιαφορές (δεν μπορείς να αλλλάξεις τη διεύθυνση στην οποία δείχνει ένας πίνακας, με πίνακα η sizeof δίνει το μέγεθος όλων των στοιχείων ενώ με pointer μόνο του pointer).

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

Ή ένα μονοδιάστατο πίνακα από 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));

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

  • 1 χρόνο αργότερα...
>
#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η ψευδής σύγκριση θα υπάρχει τελικό αποτέλεσμα της λογικής συνθήκης και δε θα συνεχίσει στις επόμενες προσπελάσεις, αλλά γενικά δε μου φαίνεται καλή ιδέα...

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

Από θεωρητικής απόψεως το ακριβώς ίδιο κάνει και η συνάρτηση strcmp που όλοι γνωρίζουμε ότι είναι ασφαλές. Οι υποψίες σου θα ήταν βάσιμες αν η πηγή των argv δεν εξασφάλιζε την ιδιότητα να είναι strings.

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

Ο μόνος κίνδυνος είναι το segfault στον έλεγχο του \0. Κατά τα άλλα δεν θυμάμαι γιατί το έγραψα έτσι και ούτε με ενδιαφέρει να το σκεφτώ μιάς και πέρασαν 18 μήνες.

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

Ο μόνος κίνδυνος είναι το segfault στον έλεγχο του \0. ...
Ακριβώς αυτό εννοώ.

δεν υπάρχει τέτοιο θέμα.

o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει.

 

π.χ.

>
char c = 3;
if(c==2 && memset((void *)0,0,100)){
         //εσβησα το NULL:shock:
}

:shock:

;)

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

παιδια εχω και εγω μια απορεια πανω στο θεμα..

εχω το εξης:

 

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

 

πραγμα πολυ λογικο βεβαια..απλα δεν ξερω πωσ να το διορθωσω

 

ευχαριστωωωωωω

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

παράδειγμα 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] σε ακέραιο και μετά κάνε την σύγκριση

επίσης πέρασε τον ακέραιο σαν όρισμα στην συνάρτηση σου.

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

δεν υπάρχει τέτοιο θέμα.

o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει.

 

π.χ.

>
char c = 3;
if(c==2 && memset((void *)0,0,100)){
         //εσβησα το NULL:shock:
}

:shock:

;)

 

Επίσης αυτό εννοούσα με την δεύτερη παράγραφο του μηνύματός μου. Στο ΣΥΓΚΕΚΡΙΜΕΝΟ παράδειγμα δε θα γινόταν segfault, λόγω της ιδιότητας short circuit των λογικών εκφράσεων στη C (δηλαδή το να γίνονται evaluate ακριβώς μέχρι το σημείο που η γλώσσα είναι σίγουρη για το τελικό αποτέλεσμα) όμως σε οποιοδήποτε άλλο setting θα ήταν επικίνδυνο.

 

Anyway, είμαστε ούτως ή άλλως offtopic

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

δεν υπάρχει τέτοιο θέμα.

o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει.

 

π.χ.

>
char c = 3;
if(c==2 && memset((void *)0,0,100)){
         //εσβησα το NULL:shock:
}

:shock:

;)

 

κοίτα και αυτό :)

 

>
int main(void) { return (0 && 1/0); }

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

παιδια εχω και εγω μια απορεια πανω στο θεμα..

εχω το εξης:

 

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

 

πραγμα πολυ λογικο βεβαια..απλα δεν ξερω πωσ να το διορθωσω

 

ευχαριστωωωωωω

 

Θα χαιρωτανε πολυ η κυρα - Βανα να σε βλεπει να λυνεις ασκησεις.Α ρε τι μας κανουν....:P

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

Αρχειοθετημένο

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


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