getopt jak uzywac

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
ddddax
Piegowaty Guziec
Piegowaty Guziec
Posty: 15
Rejestracja: 28 wrz 2008, 22:50
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME

getopt jak uzywac

Post autor: ddddax »

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?
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post autor: beluosus »

Idąc zgodnie za tym przykładem:

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;
Używasz tak:

Kod: Zaznacz cały

./program -1 asdf -2 qwer -o wynik
./program --p1 asdf --p2 qwer --output wynik
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ć.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ddddax
Piegowaty Guziec
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

Post autor: ddddax »

hmm a nie da sie jakosc przeksztalcic tego kodu aby zastapic czyms ta pierwsza strukture:

Kod: Zaznacz cały

{"p1",     required_argument, 0, '1'},
{"p2",     required_argument, 0, '2'},
{"output", required_argument, 0, 'o'},
szczerze umiem uzywac struktur, ale w programie mamy to dopiero za pare godzin wykladow. wiec napewno da sie to jakos przeksztalcic :)
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post autor: beluosus »

Chyba nie da rady:

Kod: Zaznacz cały

int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *indexptr)
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 .... :)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ddddax
Piegowaty Guziec
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

Post autor: ddddax »

master jestes. dzieki wielkie :D

EDIT:
i jeszcze takie pytanie z ciekawosci. w czym to jest lepsze od pobierania nazw plikow z char argv*[]?
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post autor: beluosus »

ddddax pisze:i jeszcze takie pytanie z ciekawosci. w czym to jest lepsze od pobierania nazw plikow z char argv*[]?
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.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ddddax
Piegowaty Guziec
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

Post autor: ddddax »

sam nie umiem przerobic programu. jesli ktos moglby mi pomoc pisac na gg:6780340
Awatar użytkownika
el.pescado
Zakręcona Traszka
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

Post autor: el.pescado »

Kod: Zaznacz cały

man 3 getopt
Na końcu jest przykład:)

PS. Może się przydać

Kod: Zaznacz cały

sudo apt-get install manpages-dev
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post autor: beluosus »

el.pescado pisze:

Kod: Zaznacz cały

man 3 getopt
Na końcu jest przykład:)
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.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ddddax
Piegowaty Guziec
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

Post autor: ddddax »

to inczej przyjmijmy jakis prosty przyklad:

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;
}
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?
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości