Przekazywanie struktur miedzy funkcjami

0

Witam, mam napisać program który składa się z funkcji operujących na danych strukturach. Dodawanie, usuwanie, sortowanie ale mam problem ze zrozumieniem jak mogę przekazać juz uzupełnioną strukturę z funkcji do funkcji. Ktoś pomoże ?

#include <stdio.h>

typedef struct { char imie[30];
char nazwisko[50];
short wiek;
char PESEL[11];
char email[50];
} tperson;



int main()
{

system("cls");
int chose_menu=0;
int count=0;
int tab[100];
tperson data_person[100];

    printf("Menu\n\n");
    printf("Liczba elementow w tablicy: %i \n\n",count);
    printf("1.Dodaj.\n");
    printf("2.Usun dany element.\n");
    printf("0.Zakoncz program.\n");
    printf("Wybierz:\n");
    scanf("%i",&chose_menu);

    switch(chose_menu)
    {
    case 1:
    {
        add_person();
        break;
    }
case 2:
    {
        delete_person();
        break;
    }

    case 0:
    {
        system("cls");
        printf("Koniec :)");
        return 0;
        break;
    }
    }




    return 0;
}

void delete_person()
{
    int del;
    printf("Ktory element chcesz usunac ?\n");
    scanf("%i",&del);



}

void add_person (tperson data_person[100]){
int tab_size=0;


do{

    printf("Ile elementow chcesz dodac(max 100) ?\n");
    scanf("%i",&tab_size);
    if(tab_size>100)
    {
    system("cls");
    printf("Podaj liczbe z zakresu!!!\n");
    system("PAUSE");
    system("cls");

    }
}while(tab_size>100);





    for (int i=0;i<tab_size;i++)
    {
        printf("Nr.%i\nPodaj imie:\n",i+1);
        scanf("%s",&data_person[i].imie);
        printf("Nr.%i\nPodaj nazwisko:\n",i+1);
        scanf("%s",&data_person[i].nazwisko);
        printf("Nr.%i\nPodaj wiek:\n",i+1);
        scanf("%i",&data_person[i].wiek);
        printf("Nr.%i\nPodaj pesel:\n",i+1);
        scanf("%s",&data_person[i].PESEL);
        printf("Nr.%i\nPodaj email:\n",i+1);
        scanf("%s",&data_person[i].email);
    }


    /*
    for (int i=0;i<tab_size;i++)
    {
        printf("%s\n",data_person[i].imie);
        printf("%s\n",data_person[i].nazwisko);
        printf("%i\n",data_person[i].wiek);
        printf("%s\n",data_person[i].PESEL);
        printf("%s\n",data_person[i].email);
        printf("\n");
    }
      */

 main();
}

Napisałem też drugi program z mniejsza ilością elementów ale także mi nie wychodzi... Pomocy.

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

typedef struct{
int wiek;
} osoba;


int main()

{
    int chose;
    printf("1.Dodaj wiek dla 3 osoob.\n");
    scanf("%i\n",&chose);

    switch(chose)
        {
            case 1:
            {
            void dodaj_wiek(osoba);
            break;
            }
        }


    return 0;
}

void dodaj_wiek(osoba& ja)
{


    for (int i=0;i<3;i++)
        {
        printf("%i.Wiek:\n",i);
        scanf("%i",&ja.wiek);
        }

        system("PAUSE");


}

2

Tagujesz C, a piszesz w C++. Zdecyduj się.

Przekazywanie parametru przez wartość i referencję

Wywoływanie funkcji main() jest nielegalne w C++, i jest co najmniej bardzo dziwną praktyką w C.

0
kq napisał(a):

Tagujesz C, a piszesz w C++. Zdecyduj się.

Przekazywanie parametru przez wartość i referencję

Wywoływanie funkcji main() jest nielegalne w C++, i jest co najmniej bardzo dziwną praktyką w C.

Ok, to już widziałem tylko tutaj nic nie pisze jak by tą strukturę przekazać.

Napisałem coś takiego tylko co jest teraz źle ?

#include <stdio.h>

typedef struct { char imie[30];
char nazwisko[50];
short wiek;
char PESEL[11];
char email[50];
} tperson;



int main()
{

system("cls");
int chose_menu=0;
int count=0;
int tab[100];
tperson data_person[100];

    printf("Menu\n\n");
    printf("Liczba elementow w tablicy: %i \n\n",count);
    printf("1.Dodaj.\n");
    printf("2.Test.\n");
    printf("0.Zakoncz program.\n");
    printf("Wybierz:\n");
    scanf("%i",&chose_menu);

    switch(chose_menu)
    {
    case 1:
    {
        add_person();
        break;
    }
case 2:
    {
        test();
        break;
    }

    case 0:
    {
        system("cls");
        printf("Koniec :)");
        return 0;
        break;
    }
    }




    return 0;
}

void test ()
{

    add_person (&tperson data_person[100]);                                             //odbiór zmiennej ?
    printf("%s",add_person (data_person[0].imie));



}

void add_person (*tperson data_person[100]){
int tab_size=0;


do{

    printf("Ile elementow chcesz dodac(max 100) ?\n");
    scanf("%i",&tab_size);
    if(tab_size>100)
    {
    system("cls");
    printf("Podaj liczbe z zakresu!!!\n");
    system("PAUSE");
    system("cls");

    }
}while(tab_size>100);





    for (int i=0;i<tab_size;i++)
    {
        printf("Nr.%i\nPodaj imie:\n",i+1);
        scanf("%s",&data_person[i].imie);
        printf("Nr.%i\nPodaj nazwisko:\n",i+1);
        scanf("%s",&data_person[i].nazwisko);
        printf("Nr.%i\nPodaj wiek:\n",i+1);
        scanf("%i",&data_person[i].wiek);
        printf("Nr.%i\nPodaj pesel:\n",i+1);
        scanf("%s",&data_person[i].PESEL);
        printf("Nr.%i\nPodaj email:\n",i+1);
        scanf("%s",&data_person[i].email);
    }


    /*
    for (int i=0;i<tab_size;i++)
    {
        printf("%s\n",data_person[i].imie);
        printf("%s\n",data_person[i].nazwisko);
        printf("%i\n",data_person[i].wiek);
        printf("%s\n",data_person[i].PESEL);
        printf("%s\n",data_person[i].email);
        printf("\n");
    }
      */

 main();
}





to jak najlepiej wrócić do funkcji main ?

0

Nie potrafię przekazać tablicy do funkcji. Czytam jak to zrobić cały dzień i nie wychodzi....

2

Możesz to zrobić na różne sposoby, generalnie logika będzie podobna, zrobiłem z dużym uproszczeniem. Musisz mieć funkcję, która tworzy nową strukturę, tutaj tperson_init, a potem Budujesz metodę wypełniająca tablecę obiektów. Przesyłasz argument, zawsze tak samo, przez wskaźnik (dokładnie, jak Pisze @twonek, wskażnik przez wartość, a jego wartość to adres).:

#include <stdio.h>

typedef struct { 
	char imie[30];
	char nazwisko[50];
	short wiek;
	char PESEL[11];
	char email[50];
} tperson;

void add_persons (tperson * tab);

tperson * tperson_init(char gname [], char name [], short age, char pesel [], char email []);

int main(int argc, char **argv) {
	tperson * p = tperson_init("Albert", "Einstein", 22, "00", "[email protected]");
	printf("%s\n", p->imie);
	
	tperson tab [100];
	add_persons(tab);
	tperson p1 = tab[1];
	printf("%s\n", p1.imie);
	return 0;
}

tperson * tperson_init(char gname [], char name [], short age, char pesel [], char email []) {
  tperson * p =  {gname, name, age, pesel, email};
  return p;
}

void add_persons(tperson * tab) {
	tperson * p  = tperson_init("Albert", "Einstein", 22, "00", "[email protected]");
	tperson * p1 = tperson_init("Alan", "Turing", 22, "00", "[email protected]");
	tab[0] = *p;
	tab[1] = *p1;
}
0
lion137 napisał(a):

Możesz to zrobić na różne sposoby, generalnie logika będzie podobna, zrobiłem z dużym uproszczeniem. Musisz mieć funkcję, która tworzy nową strukturę, tutaj add_person, a potem Budujesz metodę wypełniająca tablecę obiektów. Przesyłasz argument, zawsze tak samo, przez wskaźnik (dokładnie, jak Pisze @twonek, wskażnik przez wartość, a jego wartość to adres).:

#include <stdio.h>

typedef struct { 
	char imie[30];
	char nazwisko[50];
	short wiek;
	char PESEL[11];
	char email[50];
} tperson;

void add_persons (tperson * tab);

tperson * tperson_init(char gname [], char name [], short age, char pesel [], char email []);

int main(int argc, char **argv) {
	tperson * p = tperson_init("Albert", "Einstein", 22, "00", "[email protected]");
	printf("%s\n", p->imie);
	
	tperson tab [100];
	add_persons(tab);
	tperson p1 = tab[1];
	printf("%s\n", p1.imie);
	return 0;
}

tperson * tperson_init(char gname [], char name [], short age, char pesel [], char email []) {
  tperson * p =  {gname, name, age, pesel, email};
  return p;
}

void add_persons(tperson * tab) {
	tperson * p  = tperson_init("Albert", "Einstein", 22, "00", "[email protected]");
	tperson * p1 = tperson_init("Alan", "Turing", 22, "00", "[email protected]");
	tab[0] = *p;
	tab[1] = *p1;
}

Dziękuję za pomoc, na taką odpowiedź liczyłem. Teraz juz wiem mniej więcej jak to zrobić. Pozdrawiam.

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