[C] Listy dwukierunkowe cykliczne i strcat :)

0

Mam problemy jak zawsze :D Otóż ten kawałek kodu

int menu(struct Menu **first)//wczytujemy menu główne :)
{
	FILE*menu;
	menu=fopen("menu.txt", "r");
	if(menu==NULL)
	{return 1;}

	struct Menu *new;
	new=(struct Menu*)malloc(sizeof(struct Menu));

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

		new->next=temp;
		new->prev=prev;
		new=temp;
	}
	
	fclose(menu);
	return 0;
}

Ma za zadanie wczytać mi na liste zawartość pliku :) robi to świetnie dla list jednokierunkowych cyklicznych. Ja mam mały problem z przerobieniem tego na 2 kierunkowe - miałem problemy z listami a sposób jaki obmysliłem jest dość nieporfesjonalny a wiem, że jest łatwiejszy. Czyli funkcja ma ogólnie tworzyć listę 2 kierunkową cykliczną.

Druga część tematu dotyczy tego kawałka kodu

	char *distribution;
	char *temp;
	char *temp2;
	char program[100];
	char which[100]="which ";
	char dis[100];
	int back;
	
	temp=distribution;
	temp2=which;
	while(!feof(list))
	{
		fscanf(list, "%s", program);
		strcat(distribution, program); <- tutaj warning mi wywala
		strcat(which, program);
		back=system(which);
		if(back==0){back=1;}
		if(back!=0)
		{
			back=system(dis);
		}
		distribution=temp;
		which=temp2;                        <- tutaj błędzik :)
		add_to_list(back,program);
	}

To mi wywala gdy kompiluje
install.c: In function ‘install’:
install.c warning: incompatible implicit declaration of built-in function ‘strcat’
install.c error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’

Jak temu zaradzić?

0
  1. /warning/ skąd pochodzi (z jakiego nagłówka) funkcja strcat?
  2. gdzie przydzielasz pamięć dla distribution?
  3. /error/ takie przypisanie jest niedozwolone; wyżej używasz (niekoniecznie potrzebnie) strcat, a tutaj gdzie trzeba, to próbujesz przypisania...
0

te wszystkie str* są z <string.h>

0

Ja wiem, ale warning jest dlatego, że tego nie zadeklarowano.

0

Zgubiłem sie w twoim kodzie, może to będzie czytelniejsze:

int menu(struct Menu **first)//wczytujemy menu główne :)
{
	FILE*menu;
	menu=fopen("menu.txt", "r");
	if(menu==NULL)return 1;

        *first=NULL; // jesli usuniesz to, to bedziesz mogl doczytywac z innych plikow
                 //ale bedziesz musial sam zadbac poza ta funkcja o to, zeby pusta lista wskazywala na NULL
	while(!feof(menu))
	{

                struct Menu *temp;
		temp=(struct Menu*)malloc(sizeof(struct Menu));
                if(*first){  // jezeli juz cos jest w liscie wrzucasz nowy element przed first, zatem na koniec listy
		  temp->next=*first;
                  temp->prev=(*first)->prev;
                  (*first)->prev->next=temp;
                  (*first)->prev=temp;
                }else{
                  temp->next=temp;   // musisz zawiazac liste, zeby byla cykliczna
                  temp->prev=temp;  // w obu kierunkach
                  *first=temp;
                }

		fscanf(menu, "%s %i\n", temp->function, &temp->option);  // nie ma znaczenia czy wczytasz przed powiazaniem, czy po nim, nie typasz pol next i prev
		
	}
	
	fclose(menu);
	return 0;
}

0

(*first)->prev->next=temp;

Szczerze to dla mnie nie ma większego sensu. Nie jestem mistrzem programowania i nie będę ale szczerze nie mam pojęcia co to ma za zadanie robić.

Zresztą. Po użyciu tej funkcji pomimo, że program nie sypie się jednak nie działa tak jak trzeba.


EDYTKA.

Zwracam honor, jeśli obraziłem. Kod działa 100% dobrze ale musiałem zmienić pętle z while() na do{}while(); :) Dzięki wielkie.

0

(*first)->prev->next=temp;

Patrzac na kod, ktory flabra dal, first jest wskaznikiem na wskaznik, wiec samo (*first) jest w tym przypadku wskaznikiem, a dalej wyciagasz z prev, za pomoca prev wyciagasz next i przypisujesz next adres temp ;)

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