Pliki nagłówkowe C/Struktury

0

Hej,

Natrafiłem się na nieco irytujący problem podczas pisania mojego programu. Nie jestem zaawansowanym programistą ale się pilnie uczę tego wymagającego rzemiosła.

Cóż zrobiłem sobie listę w C wszystko wyglądało ładnie i działało tak jak trzeba, jednak problem się pojawił kiedy chciałem podzielić moją strukturę listy jednokierunkowej na poszczególne pliki tak by program można było ładnie rozbudowywać dodałem również jakieś menu. Niestety poszczególne pliki nie widzą siebie nawzajem mimo, że je includuje (nie jestem w stanie wykonać kompilacji)

Coś jest źle ze składnią osobiście nie lubię tego typu problemów i nie wiem jak sobie z nim poradzić

Kompiluje sobie w devie przy okazji przekazuje kod napisany w c

Kilka razy wyskakuje błąd [Error] unknown type name 'Lista' oraz 'element'

//Plik main

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "element.h"
#include "lista.h"


void menu(){

int exit=0;
int menu;
	
	while( exit==0 ){
		printf("1. Dodanie osoby do listy:\n");
		printf("2. Wypisanie na ekran\n");
		printf("3. Exit\n");
		scanf("%d", &menu);
		switch( menu )
		{
			case 1:
				dodaj();
			case 2:
				wypisz();
			case 3:
				exit=1;
		}
	}
}

int main(){
	

	
	menu();
	
}
 
 
//lista.h

#ifndef _LISTA_H
#define _LISTA_H
#include <stdio.h>
#include <stdlib.h>

	struct Lista{
		element* pierwszy;
	};

	Lista lista;
	lista.pierwszy=NULL;
	
	Lista wypisz(Lista lista);
	
#endif
 
//lista.c

#include <stdio.h>
#include <stdlib.h>

Lista wypisz(Lista lista){
	
	element *i;
	i=lista.pierwszy;
	
	while(i!=NULL){
		printf("%d\n", i->wartosc);
		i=i->next;
		
	}
	
	printf("\n");
}
 
//element.h

#ifndef _ELEMENT_H
#define _ELEMENT_H
#include <stdio.h>
#include <stdlib.h>

	struct element{
		int wartosc;
		element* next;
	};
	
	int wartosc;
	
	Lista dodaj(Lista lista, int wartosc);


#endif
//element.c

#include <stdio.h>
#include <stdlib.h>

lista dodaj(Lista lista, int wartosc){
	
	element *nowy;
	nowy = (element*)malloc(sizeof(element));
	nowy->wartosc = wartosc;
	nowy->next = NULL;
	
	if(lista.pierwszy==NULL){
	
	lista.pierwszy=nowy;
	
	}else{
	
	element *i;
	i=lista.pierwszy;	
		
	while(i->next!=NULL){
	   	i=i->next;
		}
	i->next=nowy;
	
	}
	return lista1;
}
 
0

W lista.c powinieneś dołączyć lista.h. Analogicznie w element.c

0

to:
Lista lista;
lista.pierwszy=NULL;'
nie może być w .h

0

Strasznie namieszałeś. Chyba nie za bardzo odróżniasz plik nagłówkowy (.h) od żródłowego (.c). W pierwszm zazwyczaj umeszcza się deklaracje funkcji i struktur a w drugim implementację funkcji i resztę. Z zastrzerzeniem, że nie zawsze tak.
A teraz do rzeczy.

//element.h

#ifndef _ELEMENT_H
#define _ELEMENT_H

typedef struct tag_element{
    int wartosc;
    struct tag_element* next;
}element;

#endif 
//lista.h
 
#ifndef _LISTA_H
#define _LISTA_H
#include <stdio.h>
#include <stdlib.h>
#include "element.h"
 
typedef struct tag_Lista{
    element* pierwszy;
}Lista;
 
void wypisz(Lista* lista);
void dodaj(Lista* lista, int wartosc);
void usun(Lista* lista);
#endif 
 //lista.c
 
#include <stdio.h>
#include <stdlib.h>
#include "lista.h"
 
void wypisz(Lista* lista){
 
    element *i;

    i=lista->pierwszy;
 
    while(i!=NULL){
        printf("%d\n", i->wartosc);
        i=i->next;
 
    }
 
    printf("\n");
}

void dodaj(Lista* lista, int wartosc){
 
    element *nowy;

    nowy = (element*)malloc(sizeof(element));
    nowy->wartosc = wartosc;
    nowy->next = NULL;
 
    if(lista->pierwszy==NULL){
        lista->pierwszy=nowy;
    }
    else{
        element *i;
        i=lista->pierwszy;
 
        while(i->next!=NULL){
               i=i->next;
        }
        i->next=nowy;
    }
}

void usun(Lista* lista)
{
    element *i;
    element *usuwany_element;

    i=lista->pierwszy;
 
    while(i!=NULL){
        usuwany_element = i;
        i=i->next;
        free(usuwany_element);	
   }
}
//Plik main

#include "lista.h"
  
int main(){
 
    int exit=0;
    int menu;
    int wartosc;
    Lista lista;

    lista.pierwszy=NULL;

    while( exit==0 ){
        printf("1. Dodanie osoby do listy:\n");
        printf("2. Wypisanie na ekran\n");
        printf("3. Exit\n");
        scanf("%d", &menu);
        switch( menu ){
            case 1:
                printf("Podaj ID osoby: ");
	     scanf("%d", &wartosc);
                dodaj(&lista, wartosc);
	 break;
            case 2:
                wypisz(&lista);
	 break;
            case 3:
                exit=1;
            break;
        }
    }
 	usun(&lista);

    return 0;
} 

Definicja typów upraszcza pózniejsze posługiwanie się nimi.
Przekazywanie przez wskaźnik a nie przez wartość typów złożonych.
Zbyteczna (moim zdanie) funkcja menu.
I kilka błędów np. nie zwracanie wartości lub nieprzekazywanie argumentów.

Teraz powinno działać.

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