C - wczytywanie z pliku i funkcja getch()

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Kod:
#include<ncurses.h>
#include<stdlib.h>

struct Menu
{
	char function[7];
	int option;
	struct Menu *next;
};

struct Menu *first;

int menu()
{
	FILE*menu;
	menu=fopen("menu", "rt");
	if(menu==NULL)
	return 1;

	struct Menu *new;
	new=(struct Menu*)malloc(sizeof(struct Menu));
	
	first=new;
	while(!feof(menu))
	{
		fscanf(menu, "%s %i", new->function, &new->option);

		struct Menu *temp;
		temp=(struct Menu*)malloc(sizeof(struct Menu));
		temp->next=NULL;

		new->next=temp;
		new=temp;
	}
	new->next=first;

	return 0;
}

void printfmenu()
{
	struct Menu *prt;
	prt=(struct Menu*)malloc(sizeof(struct Menu));
	
	while(prt==first)
	{
		prt=first;
		printf("%s", prt->function);
		prt=prt->next;
	}
}

int main()
{
	
	menu();
	printfmenu();
	return 0;
	
}

Już mówię do czego ma mi służyć powyższa funkcja. To co stworzyłem ma mi tworzyć w miarę dynamiczne Menu na listach. Wszystko co ma być w menu jest zależne od pliku menu.txt. Wygląda on mniej więcej tak.
Kod:
a 1
b 2
...
z 9999

Błędów kompilacji nie ma więc dość ciężko mi wyłapać błąd (a zapewne siedzi w tym fscanfie) program się wykonuje ale nic mi nie wyświetla.

Druga sprawa to to działanie funkcji getch(), która jest dla mnie dokładnie czarną magią :)

Trochę tam poczytałem w sieci ale jest kilka problemów. Otóż jak mam program funkcje

switch(getch())
case 'w': ;
case 's':;

Ale teraz mam problem ponieważ gdy np chce aby coś zostało przerwane przez ESC - to wtedy przerywają również klawisze funkcyjne lub jak zrobić, aby Kursorami skakać po menu.

Pozdrawiam.
 

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Tak sie sklada, ze błąd byl w printfmenu() - ale poradziłem sobie z nim. Co do samego debugowania. Korzystam z gdb, który niezawsze pokaże - a nie chce mi się bawić środowiskami ponieważ są strasznie upirdliwe :D (najczęściej znajduje błędy pisząc funkcje od nowa zaczynając od prostszych przykładów rozszerszając ją do stanu, w jakim ma być).

Teraz mam troszkę inny problem.
Kod:
int menumove(struct Menu **first)
{
	int a;
	struct Menu *move;
	move=*first;
	
	struct Menu *and;
	and=*first;
	for(;;){
	a=getchar();
	printf("%i", a);
	switch(a){
	case 27: {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;
			}
			and=and->next;
		}
		and=*first;
		break;}
	case 10: {switch(move->option){
			case 1:menu(&first);break;
			case 2:break;
			case 3:break;
			case 4: return 0;
			}}
			}}
}

Funkcja działa tylko częściowo. Tzn da się zauważyć po uruchomieniu programu, że skok po liście dziala. Ponieważ kiedy dam 3 razy strzałkę czyli wywołanie 1 case to po 3 razie wartość move->option będzie równa 4 i wywoła się return 0 i program zakończy się. Niestety owe printfy w case nr1 nie drukują mi nic na ekranie :(

EDYTKA

Mały błąd. Teraz wypisuje mi tylko zawartość listy gdy spełniony jest pierwszy if - przy else jakby nie bralo uwagi.

EDYKA 2

Po problemie - dzięki za pomoc :)
 
Ostatnia edycja:
Do góry Bottom