getopt jak uzywac
-
- Piegowaty Guziec
- Posty: 15
- Rejestracja: 28 wrz 2008, 22:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
getopt jak uzywac
mam program ktory robi podstawowe operacje na wektorach suma, roznica itp. ale to nie wazne. dane wektorow pobiera z dwoch plikow wektor1 wektor2, a dzialania wypisuje na ekran. Wykladowca kazal nam przerobic tak program uzywajac getopt http://www.gnu.org/s/libc/manual/html_node/Getopt.html aby dzieki temu getopt program wywoalny ./program -p1 wektor1 -p2 wektor2 -o wyniki pobral dane z plikow i wypisal do trzeciego pliku wyniki. Ja umiem tylko to zrobic za pomoca argumentow funkcji main argc i argc* tab[], a koniecznie trzeba uzyc tego getopt. wie ktos jak tego uzywac i jak to dziala?
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: getopt jak uzywac
Idąc zgodnie za tym przykładem:
Używasz tak:
Tylko z tego co zauważyłem chyba nie można wprowadzać dwu-i-więcej znakowej nazwy argumentu bez podwójnego minusa. Tzn albo -1 albo --p1, bo -p1 już nie działa. Ale może się mylę.
PS Jeszcze wypada sprawdzić czy podane są wszystkie 3 parametry, inaczej przerwać.
Kod: Zaznacz cały
{"p1", required_argument, 0, '1'},
{"p2", required_argument, 0, '2'},
{"output", required_argument, 0, 'o'},
Kod: Zaznacz cały
c = getopt_long (argc, argv, "1:2:o:", long_options, &option_index);
Kod: Zaznacz cały
case '1':
printf ("Wektor 1 `%s'\n", optarg);
break;
case '2':
printf ("Wektor 2 `%s'\n", optarg);
break;
case 'o':
printf ("Wynik `%s'\n", optarg);
break;
Kod: Zaznacz cały
./program -1 asdf -2 qwer -o wynik
./program --p1 asdf --p2 qwer --output wynik
PS Jeszcze wypada sprawdzić czy podane są wszystkie 3 parametry, inaczej przerwać.
-
- Piegowaty Guziec
- Posty: 15
- Rejestracja: 28 wrz 2008, 22:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
Odp: getopt jak uzywac
hmm a nie da sie jakosc przeksztalcic tego kodu aby zastapic czyms ta pierwsza strukture:
szczerze umiem uzywac struktur, ale w programie mamy to dopiero za pare godzin wykladow. wiec napewno da sie to jakos przeksztalcic
Kod: Zaznacz cały
{"p1", required_argument, 0, '1'},
{"p2", required_argument, 0, '2'},
{"output", required_argument, 0, 'o'},
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: getopt jak uzywac
Chyba nie da rady:
No i przy okazji odkryłem, że jak użyjesz getopt_long_only zamiast getopt_long, to można wywoływać dwu-i-więcej znakowe nazwy argumentów z pojedyńczym minusem, tj: -p1 ... -p1 ....
Kod: Zaznacz cały
int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *indexptr)
-
- Piegowaty Guziec
- Posty: 15
- Rejestracja: 28 wrz 2008, 22:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
Odp: getopt jak uzywac
master jestes. dzieki wielkie
EDIT:
i jeszcze takie pytanie z ciekawosci. w czym to jest lepsze od pobierania nazw plikow z char argv*[]?
EDIT:
i jeszcze takie pytanie z ciekawosci. w czym to jest lepsze od pobierania nazw plikow z char argv*[]?
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: getopt jak uzywac
Tym, że argv musiałbyś sam przeszukiwać czy jest tam nazwa parametru, a później sprawdzić czy argument znajduje się zaraz za nim. Dzięki getopt możesz sprawdzić 100 parametrów właściwie jednym poleceniem. Spróbuj teraz napisać swój program bez użycia getopt biorąc pod uwagę, że użytkownik może wpisywać parametry w różnej kolejności to zobaczysz w czym jest lepsze. Będzie to właściwie odkrywanie koła (getopt) na nowo.ddddax pisze:i jeszcze takie pytanie z ciekawosci. w czym to jest lepsze od pobierania nazw plikow z char argv*[]?
-
- Piegowaty Guziec
- Posty: 15
- Rejestracja: 28 wrz 2008, 22:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
Odp: getopt jak uzywac
sam nie umiem przerobic programu. jesli ktos moglby mi pomoc pisac na gg:6780340
- el.pescado
- Zakręcona Traszka
- Posty: 734
- Rejestracja: 26 maja 2005, 11:43
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Odp: getopt jak uzywac
Kod: Zaznacz cały
man 3 getopt
PS. Może się przydać
Kod: Zaznacz cały
sudo apt-get install manpages-dev
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: getopt jak uzywac
W manie jest niemal ten sam przykład, który podałem wyżej. Kolega ddddax po prostu nie umie go przerobić do swoich celów... napisałem właściwie wszystko co trzeba zmienić więc nie wiem jak pomóc.el.pescado pisze:Na końcu jest przykład:)Kod: Zaznacz cały
man 3 getopt
-
- Piegowaty Guziec
- Posty: 15
- Rejestracja: 28 wrz 2008, 22:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
Odp: getopt jak uzywac
to inczej przyjmijmy jakis prosty przyklad:
jak taki program zmienic zeby uzywal getopt? tam wiele zeczy ominalem w programie dotyczacych bledow, ale to tylko zeby ogarnac jak uzyc tego getopt na takim przykladzie?
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#define MAX_T 10000
int przypisz (FILE* we,int v[]){
int n,i=0;
while (fscanf(we,"%d",&n)==1){
v[i]=n;
if (i>=MAX_T-1) return -1;
i++;
}
return i;
}
void suma (int v1[],int v2[],int n){
int i;
for (i=0;i<n;i++) printf("%d ",v1[i]+v2[i]);
printf("\n");
}
int main (int argc, char *argv[]){
int v [MAX_T],v1 [MAX_T];
int t1=0,t2=0;
FILE * we = fopen(argv[1],"r");
FILE * we1 = fopen(argv[2],"r");
t1=przypisz(we,v);
t2=przypisz(we1,v1);
printf("suma wektor1 + wektor2: "); suma(v,v1,t2);
fclose(we);
fclose(we1);
return 0;
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości