[C]funkcje system i getch

0

Otóż mam troszkę zapytań co do owych funkcji.

Zaczniemy od funkcji system :) Działa ona tak jak mamy opisane tutaj. Jednak z tego co tam pisze i wypróbował wynika, ze w funkcji nie można umieszczać zmiennych a więc powiedzmy, że gdy chce użyć czegoś takiego

SYSTEM("which nazwa_programu") to wtedy nazwa programu musi być z góry określona a ja chciałbym aby to było dynamiczne i owa funkcja mogla sprawdzać obecność dla programu, który podam. Czy da sie coś takiego zrobić?

Problem z funkcją getch jest taki, że nie wiem jak zrobić aby np rozpoznawała kursory. Powiedzmy taka funkcja
switch(getch())
case 'kusor':;
case 'kursor':;

Poza tym jest problem również z ESC i klawiszami funkcyjnymi. Gdy powyższa funkcja ma kończyć się po wciśnięciu klawisza ESC kończy równiez się po wcisnięciu F1...F12 ponieważ z tego co wiem to wg tablicy ASCII ESC przyjmuje taka samą wartość jak klawisze funkcyjne.

Pozdrawiam.

0

Co do funkcji system to mozesz zrobic sobie tablice znakow z poleceniem i dopisywac ewentualnie nazwe pliku o tak:

char pol[32] = "which ";   //masz 6 znakow, wiec na 6 liczac od zera dopisujesz nazwe pliku o tak
strcat(pol+6, nazwa);        // mozesz tez sprintf uzyc lub czegos innego, ale to jest najprostszy sposob chyba

Co do ESC, czyli 0x27 to jest jedyny i nie powtarzalny, kody klawiszy funkcyjnych sa inne, jesli w ogóle w ascii sa, bo tego nie jestem pewny.
getch(); osobiscie nie lubie, tak jak reszty funkcji z conio.h, ale nie prosciej by Ci bylo pobrac do zmiennej typu int znak i po kodach w switchu reagowac.

0

To jeden problem rozwiązany :) Wielkie dzięki

A teraz do getch() i ESC - http://pl.wikipedia.org/wiki/Ascii - klawiszy funkcyjnych nie ma w tym spisie. Co do tego pobierania do zmiennej do inta - no ja do tego używam getchar() - ale problem jest w tym, że wszystko należy potwierdzać Enterem, a mi zależy na dynamiczności - już raz własnie używałem tak co spowodowalo, że program był strasznie denerwujący. nim sie gdzies dojechało to trzeba było sie naklikac jak szalony tego Entera. funkcja getch załatwiała by sprawę - w szczególności gdyby jeszcze rozpoznawala kursory.

0

Klawisze funkcyjne (przynajmniej w MSVC) zwracają przez getch() dwa znaki (tzn. trzeba dwa razy wywołać getch). Pierwszym znakiem jest zazwyczaj 0:

‌ F1 -   0  59
‌ F2 -   0  60
    ...
F10 -   0  68
F11 - 224 133
F12 - 224 134

Podobnie było to rozwiązane już np. w Turbo Pascalu.
Kursory też działają w ten sposób. Jakie im kody odpowiadają, to już proszę sobie sprawdzić:

	while(1)
		printf("%i ",getch());
0

Chwilowo z braku czasu odpuszcze sobie tego getch'a zastąpie go getchar'em :) (czy wam tez sie wydaje, ze funkcja getc() jest zrobiona na 'odpierdziel'? Moglaby działać np tak getch(int a) - pobiera znak i jego wartość wrzuca do owego inta co by bardzo ułatwiło sprawę)

Ale do tematu. Walcząc z kolejnymi problemami programu chciałbym abyś rzucili fachowym okiem na tą jeszcze niepełną funkcje.

int menumove(struct Menu **first)
{
	int a;
	struct Menu *move;
	move=*first;
	
	struct Menu *and;
	and=*first;
	a=getchar();
	switch(a){
	case 73: move=move->next;
			system("clear");
		while(and==NULL)
		{
		if(and==move)
		{
			printf("%s<=", move->function);
		}
		else{printf("%s", move->function);}
		move=move->next;
		if(move==NULL){move=*first;}
		}
		break;
	case 65: switch(move->option){
			case 1:break;
			case 2:break;
			case 3:break;
			case 4: return 0;
			}
	default: printf("Chujnia z grzbnia :)");
		}
}

Otóż zawsze wykonuje sie default ;/ nieważne czy podam właściwy znak (czyli e lub s). A może najpierw opisze co chcę osiągnać. Otóż chcę stworzyć dość dynamiczne menu na listach :) ta funkcja jak idzie sie dmyslec ma powodować ruch po menu i wykonanie odpowiedniej funkcji w zależności od wyboru :). Move - jest zmienna typu struct Menu która przetrzymuje aktualny wskaznik na element listy and - to przydaje sie do tego aby mozna wyswietlic menu i odróżnić element na którym stajemu(czyli s(moje 73) powoduje ruch (chwilowo jednostronny) po liście, e natomiast(moje 65) powoduje potwierdzenie wyboru i wykonanie innej funkcji. Niestety tak nie jest - gdzieś jest mały błąd i nie bardzo wiem gdzie.

Pozdrawiam

EDYTKA

Problem rozwiązany. Dzieki za wszelką pomoc.

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1