Ĺadny brzuch
Witam!
Kiedyś już miałem z tym problem, olałem ale teraz widze, ze jednak sie bez tego nie obejdzie.
Otóż potrzebuje sie odwołac do struktury przez wskaźnik:
Dałem tak:
#include<stdio.h> struct point { int x; int y; }; struct point *pp; main() { printf("Wpisz x: "); scanf("%d",pp->x); printf("\nWpisz y: "); scanf("%d",pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); return 0; }
Pewnie zapomniałem a jakims znaczku bo program juz na początku sie wywala zanim wpisze jakąkolwiek daną.
I pytanie dwa, w jaki sposób zrobić funkcje która by pobierała ode dwa punkty xy i zapisywała w strukturze. czytam sporo ale jak na razie to jest to tak pogmatwane ze mało rozumiem:/
moze tak
struct point { int x; int y; }; struct point *pp = new point; main() { printf("Wpisz x: "); scanf("%d",&pp->x); printf("\nWpisz y: "); scanf("%d",&pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; }
i ta funkcjia:
void SetPoint(int a, int b, point* P) { P->x = a; P->y = b; }
Użytkownik Artur Menc edytował ten post 29 grudzień 2005, 22:16
Gra i buczy ale pytanko:P
Czyli rozumiem ze jak daje wskaźnik do struktury (*pp) to musze ją(strukture) uprzednio jakby stworzyć tym new?
tak;)
niestety tak B)
//EDIT: trochę się spóźniłem
Użytkownik comp123 edytował ten post 29 grudzień 2005, 22:26
Ok.
Wiem ze nie na miejscu jest prosić o gotowy kod, ale czy moglibyscie napisac jak zrobić teraz funkcje która mi by pobierała owe punkty.
I pytanko dwa:)
Teraz chciałem pobrać string i int .
Dałem tak:
#include<stdio.h> struct point { char imiona; int wiek; }; struct point *pp=new point; main() { printf("Wpisz imiona: "); gets(&pp->imiona); printf("\nWpisz wiek: "); scanf("%d",&pp->wiek); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; }
Nie wiem czemu ale wywala się przy wyświetlaniu imion?
Gra i buczy ale pytanko:P
Czyli rozumiem ze jak daje wskaźnik do struktury (*pp) to musze ją(strukture) uprzednio jakby stworzyć tym new?
struct point { char imiona[30]; int wiek; }; struct point *pp=new point; main() { printf("Wpisz imiona: "); scanf("%s",&pp->imiona); printf("\nWpisz wiek: "); scanf("%d",&pp->wiek); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; }
Użytkownik Artur Menc edytował ten post 29 grudzień 2005, 22:44
Tak się zapytam bo po przeczytaniu tego tamatu czegoś nierozumiem i czuje się zmieszany. Od kiedy w C jest new?
Użytkownik reVis edytował ten post 29 grudzień 2005, 22:44
Tak się zapytam bo po przeczytaniu tego tamatu czegoś nierozumiem i czuje się zmieszany. Od kiedy w C jest new?
heh, nie spojrzałem dokłądnie na temat, ale autorowi nie przeszkadzało pierwsze new to może nie ma to dla niego różnicy czy pisze w c czy w c++
jeśli chcesz bezpośrednio umieścić obiekt na stercie powinieneś użyć funkcji malloc() i free() - dostępnych w C
Sprawdź:
1. http://galaxy.uci.ag...s/C/malloc.html
2. http://galaxy.uci.ag...res/C/free.html
Użytkownik comp123 edytował ten post 29 grudzień 2005, 23:02
Po pierwsze dziekuje za konstruktywną krytykę. Faktycznie ciągle się mecze ze wskaźnikami.
Faktycznie powinienem uzywac malloc ale wygodniej jest na new:)
Co do samego programu
Po długich męczarniach udało mi sie stworzyć (metodą prób i błędów) f-cje:)
(tak sie pochwale zeby na totalnego lenia nie wyjsc:)
#include<stdio.h> struct point { int x; int y; }*pp; void zapis(struct point *wsk); main() { int x=0,y=0; pp=new point; printf("Wpisz X: "); scanf("%d",&pp->x); printf("\nWpisz Y: "); scanf("%d",&pp->y); zapis(pp); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; } void zapis(struct point *wsk) { wsk->x=(wsk->x)+2; wsk->y=(wsk->y)+2; }
Nie wiem czy do końca tak wygladaja funkcje do struktur? Ale działa. jezeli moj kod jest nie wlasciwy prosze o uwage
Nie bede edytował coby było bardziej czytelnie:)
Otóż chciałem teraz zrobić funkcje pobierającą. Niby prosta sprawa
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { printf("Wpisz imiona: "); gets(wsk->imiona); printf("\nWpisz wiek: "); scanf("%d",&wsk->wiek); }
Działa ( nie wiem czy zapis poprawny ale działą)
A czy jest możliwe zrobienie takiego tricku, ze imie i wiek podaje w mainie a samo przypisanie następuje w f-cji ???
Chodzi mi mniej wiecej o cos takiego:
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; printf("Wpisz imiona: "); printf("\nWpisz wiek: "); zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { gets(wsk->imiona); scanf("%d",&wsk->wiek); }
Nie bede edytował coby było bardziej czytelnie:)
Otóż chciałem teraz zrobić funkcje pobierającą. Niby prosta sprawa
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { printf("Wpisz imiona: "); gets(wsk->imiona); printf("\nWpisz wiek: "); scanf("%d",&wsk->wiek); }
Działa ( nie wiem czy zapis poprawny ale działą)
A czy jest możliwe zrobienie takiego tricku, ze imie i wiek podaje w mainie a samo przypisanie następuje w f-cji ???
Chodzi mi mniej wiecej o cos takiego:
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; printf("Wpisz imiona: "); printf("\nWpisz wiek: "); zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { gets(wsk->imiona); scanf("%d",&wsk->wiek); }
w moim pierwszym poście napisałem ci przecież tego typu funkcje
@Artur Menc
Faktycznie nie zauwazyłem. Ale juz pozno było:P
Mam pytanko
Dałem f-cje co mi zwiekszac ma wartosci o 2;
#include<stdio.h> struct point { int x; int y; }*pp; void zapis(struct point *wsk,int a,int b); main() { pp=new point; printf("Wpisz X: "); scanf("%d",&pp->x); printf("\nWpisz Y: "); scanf("%d",&pp->y); zapis(pp,pp->x,pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; } void zapis(struct point *wsk, int a, int b) { wsk->x=a+2; wsk->x=(wsk->x)+2; wsk->y=b+2; }
Mozecie tylko osprawdzic czy odwołanie jest poprawne (tzn działa ). Ale dziwi mnie jedna rzecz.
Skoro pod *wsk przekazuje *pp , pod a pp->x, b pp->y. To praktycznie
powtarzam to co wykonałem w mainie.Jeszcze raz nastepuje przypisanie.
A gdy dałbym tylko tak
zapis(&pp->x,&pp->y)
a funkcje
void zapis( int *a, int *b) { a=a+2; b=b+2; }
To program już nie wykona dodawania. Mimi ze teoretycznie pod a znajduje sie pp->x ? Pewnie źle rozumuje, wiec jezeli mozna to prosze o poprawe.
I czy jest jaka róznica w wydajnosci. Tzn czy lepiej przeazywać sam wskaźnic czy tak ze poszczególne odwołania ( w tym wypadku takze a i B)?
Odnosnie drugiej f-cji. To faktycznie działa.
Ale w programie pierw wyswietli mi sie "podaj imie" i odrazu potem 'podaj wiek'.
jezeli wpisze poprawnie dane to zadziała ale potencjalny user wpisze wiek i nie bedzie wiedzial co zrobić dalej :)
Chodzi mi o to aby zrealizowac cos na wzor takie f-cji:
void zapis(struct point *wsk) { printf("Wpisz imiona: "); fgets(wsk->imiona,20,stdin); printf("\nPodaj nazwisko: "); fgets(wsk->nazwisko,20,stdin); printf("\nPodaj numer telefonu"); scanf("%d",&(wsk->telefon)); printf("\nPodaj date urodzin: "); scanf("%d",&(wsk->urodziny)); }
Z tym ze printf'y sa w mainie a pobieranie w f-cji . Jezeli to w ogole jest wykonalne:)
Użytkownik Crisu edytował ten post 30 grudzień 2005, 18:48
już tyle Ci napisaliśmy, przeczytaj jakiś opis wskaźników, poćwicz najpier na prostszych przykładach i musisz to zrozumiećprzynajmniej trochę.
Użytkownik Artur Menc edytował ten post 30 grudzień 2005, 19:02
1) Twoje rozumowanie jest poprawne, ale funkcja musi operować na wartościach, na które wskaźniki wskazują, a nie na adresach. Tak więc popraw funkcję:
void zapis( int *a, int *b) { a=a+2; b=b+2; }
na taką:
void zapis( int *a, int *b) { *a=*a+2; *b=*b+2; }
Pełny kod może wyglądać tak:
#include<stdio.h> #include<stdlib.h> struct point { int x; int y; }*pp; void zapis(int *a, int *b); main() { pp=malloc(sizeof(struct point)); printf("Wpisz X: "); printf("\nWpisz Y: "); zapis(&pp->x,&pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); free(pp); return 0; } void zapis( int *a, int *b) { scanf("%d %d", a, b); *a=*a+2; *b=*b+2; }
2) Przecież podałem ci już kod, w którym pobieranie jest w funkcjach, a printf'y w main. Ale jak chcesz, to wkleję jeszcze raz:
#include<stdio.h> #include<stdlib.h> struct point { char imiona[20]; int wiek; }*pp; void zapis_i(struct point *wsk); void zapis_w(struct point *wsk); main() { pp=malloc(sizeof(struct point)); printf("Wpisz imiona: "); zapis_i(pp); printf("\nWpisz wiek: "); zapis_w(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); free(pp); return 0; } void zapis_i(struct point *wsk) { fgets(wsk->imiona, 20, stdin); } void zapis_w(struct point *wsk) { scanf("%d", &wsk->wiek); }
Powodzenia ;)
P.S. Jeszcze jedno: błagam cię, używaj w kodach które wklejasz na forum funkcji malloc() i free() z stdlib.h, bo za każdym razem jak sprawdzam twój kod to muszę zmieniać :P
Użytkownik Balcerowicz edytował ten post 30 grudzień 2005, 21:57
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Kiedyś już miałem z tym problem, olałem ale teraz widze, ze jednak sie bez tego nie obejdzie.
Otóż potrzebuje sie odwołac do struktury przez wskaźnik:
Dałem tak:
#include<stdio.h> struct point { int x; int y; }; struct point *pp; main() { printf("Wpisz x: "); scanf("%d",pp->x); printf("\nWpisz y: "); scanf("%d",pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); return 0; }
Pewnie zapomniałem a jakims znaczku bo program juz na początku sie wywala zanim wpisze jakąkolwiek daną.
I pytanie dwa, w jaki sposób zrobić funkcje która by pobierała ode dwa punkty xy i zapisywała w strukturze. czytam sporo ale jak na razie to jest to tak pogmatwane ze mało rozumiem:/
moze tak
struct point { int x; int y; }; struct point *pp = new point; main() { printf("Wpisz x: "); scanf("%d",&pp->x); printf("\nWpisz y: "); scanf("%d",&pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; }
i ta funkcjia:
void SetPoint(int a, int b, point* P) { P->x = a; P->y = b; }
Użytkownik Artur Menc edytował ten post 29 grudzień 2005, 22:16
Gra i buczy ale pytanko:P
Czyli rozumiem ze jak daje wskaźnik do struktury (*pp) to musze ją(strukture) uprzednio jakby stworzyć tym new?
tak;)
niestety tak B)
//EDIT: trochę się spóźniłem
Użytkownik comp123 edytował ten post 29 grudzień 2005, 22:26
Ok.
Wiem ze nie na miejscu jest prosić o gotowy kod, ale czy moglibyscie napisac jak zrobić teraz funkcje która mi by pobierała owe punkty.
I pytanko dwa:)
Teraz chciałem pobrać string i int .
Dałem tak:
#include<stdio.h> struct point { char imiona; int wiek; }; struct point *pp=new point; main() { printf("Wpisz imiona: "); gets(&pp->imiona); printf("\nWpisz wiek: "); scanf("%d",&pp->wiek); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; }
Nie wiem czemu ale wywala się przy wyświetlaniu imion?
Gra i buczy ale pytanko:P
Czyli rozumiem ze jak daje wskaźnik do struktury (*pp) to musze ją(strukture) uprzednio jakby stworzyć tym new?

struct point { char imiona[30]; int wiek; }; struct point *pp=new point; main() { printf("Wpisz imiona: "); scanf("%s",&pp->imiona); printf("\nWpisz wiek: "); scanf("%d",&pp->wiek); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; }
Użytkownik Artur Menc edytował ten post 29 grudzień 2005, 22:44
Tak się zapytam bo po przeczytaniu tego tamatu czegoś nierozumiem i czuje się zmieszany. Od kiedy w C jest new?
Użytkownik reVis edytował ten post 29 grudzień 2005, 22:44
Tak się zapytam bo po przeczytaniu tego tamatu czegoś nierozumiem i czuje się zmieszany. Od kiedy w C jest new?

heh, nie spojrzałem dokłądnie na temat, ale autorowi nie przeszkadzało pierwsze new to może nie ma to dla niego różnicy czy pisze w c czy w c++

jeśli chcesz bezpośrednio umieścić obiekt na stercie powinieneś użyć funkcji malloc() i free() - dostępnych w C
Sprawdź:
1. http://galaxy.uci.ag...s/C/malloc.html
2. http://galaxy.uci.ag...res/C/free.html
Użytkownik comp123 edytował ten post 29 grudzień 2005, 23:02
Po pierwsze dziekuje za konstruktywną krytykę. Faktycznie ciągle się mecze ze wskaźnikami.
Faktycznie powinienem uzywac malloc ale wygodniej jest na new:)
Co do samego programu
Po długich męczarniach udało mi sie stworzyć (metodą prób i błędów) f-cje:)
(tak sie pochwale zeby na totalnego lenia nie wyjsc:)
#include<stdio.h> struct point { int x; int y; }*pp; void zapis(struct point *wsk); main() { int x=0,y=0; pp=new point; printf("Wpisz X: "); scanf("%d",&pp->x); printf("\nWpisz Y: "); scanf("%d",&pp->y); zapis(pp); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; } void zapis(struct point *wsk) { wsk->x=(wsk->x)+2; wsk->y=(wsk->y)+2; }
Nie wiem czy do końca tak wygladaja funkcje do struktur? Ale działa. jezeli moj kod jest nie wlasciwy prosze o uwage
Nie bede edytował coby było bardziej czytelnie:)
Otóż chciałem teraz zrobić funkcje pobierającą. Niby prosta sprawa
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { printf("Wpisz imiona: "); gets(wsk->imiona); printf("\nWpisz wiek: "); scanf("%d",&wsk->wiek); }
Działa ( nie wiem czy zapis poprawny ale działą)
A czy jest możliwe zrobienie takiego tricku, ze imie i wiek podaje w mainie a samo przypisanie następuje w f-cji ???
Chodzi mi mniej wiecej o cos takiego:
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; printf("Wpisz imiona: "); printf("\nWpisz wiek: "); zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { gets(wsk->imiona); scanf("%d",&wsk->wiek); }
Nie bede edytował coby było bardziej czytelnie:)
Otóż chciałem teraz zrobić funkcje pobierającą. Niby prosta sprawa
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { printf("Wpisz imiona: "); gets(wsk->imiona); printf("\nWpisz wiek: "); scanf("%d",&wsk->wiek); }
Działa ( nie wiem czy zapis poprawny ale działą)
A czy jest możliwe zrobienie takiego tricku, ze imie i wiek podaje w mainie a samo przypisanie następuje w f-cji ???
Chodzi mi mniej wiecej o cos takiego:
#include<stdio.h> struct point { char imiona[20]; int wiek; }*pp; void zapis(struct point *wsk); main() { pp=new point; printf("Wpisz imiona: "); printf("\nWpisz wiek: "); zapis(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); delete pp; return 0; } void zapis(struct point *wsk) { gets(wsk->imiona); scanf("%d",&wsk->wiek); }

w moim pierwszym poście napisałem ci przecież tego typu funkcje
@Artur Menc
Faktycznie nie zauwazyłem. Ale juz pozno było:P
Mam pytanko
Dałem f-cje co mi zwiekszac ma wartosci o 2;
#include<stdio.h> struct point { int x; int y; }*pp; void zapis(struct point *wsk,int a,int b); main() { pp=new point; printf("Wpisz X: "); scanf("%d",&pp->x); printf("\nWpisz Y: "); scanf("%d",&pp->y); zapis(pp,pp->x,pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); delete pp; return 0; } void zapis(struct point *wsk, int a, int b) { wsk->x=a+2; wsk->x=(wsk->x)+2; wsk->y=b+2; }
Mozecie tylko osprawdzic czy odwołanie jest poprawne (tzn działa ). Ale dziwi mnie jedna rzecz.
Skoro pod *wsk przekazuje *pp , pod a pp->x, b pp->y. To praktycznie
powtarzam to co wykonałem w mainie.Jeszcze raz nastepuje przypisanie.
A gdy dałbym tylko tak
zapis(&pp->x,&pp->y)
a funkcje
void zapis( int *a, int *b) { a=a+2; b=b+2; }
To program już nie wykona dodawania. Mimi ze teoretycznie pod a znajduje sie pp->x ? Pewnie źle rozumuje, wiec jezeli mozna to prosze o poprawe.
I czy jest jaka róznica w wydajnosci. Tzn czy lepiej przeazywać sam wskaźnic czy tak ze poszczególne odwołania ( w tym wypadku takze a i B)?
Odnosnie drugiej f-cji. To faktycznie działa.
Ale w programie pierw wyswietli mi sie "podaj imie" i odrazu potem 'podaj wiek'.
jezeli wpisze poprawnie dane to zadziała ale potencjalny user wpisze wiek i nie bedzie wiedzial co zrobić dalej :)
Chodzi mi o to aby zrealizowac cos na wzor takie f-cji:
void zapis(struct point *wsk) { printf("Wpisz imiona: "); fgets(wsk->imiona,20,stdin); printf("\nPodaj nazwisko: "); fgets(wsk->nazwisko,20,stdin); printf("\nPodaj numer telefonu"); scanf("%d",&(wsk->telefon)); printf("\nPodaj date urodzin: "); scanf("%d",&(wsk->urodziny)); }
Z tym ze printf'y sa w mainie a pobieranie w f-cji . Jezeli to w ogole jest wykonalne:)
Użytkownik Crisu edytował ten post 30 grudzień 2005, 18:48
już tyle Ci napisaliśmy, przeczytaj jakiś opis wskaźników, poćwicz najpier na prostszych przykładach i musisz to zrozumiećprzynajmniej trochę.
Użytkownik Artur Menc edytował ten post 30 grudzień 2005, 19:02
1) Twoje rozumowanie jest poprawne, ale funkcja musi operować na wartościach, na które wskaźniki wskazują, a nie na adresach. Tak więc popraw funkcję:
void zapis( int *a, int *b) { a=a+2; b=b+2; }
na taką:
void zapis( int *a, int *b) { *a=*a+2; *b=*b+2; }
Pełny kod może wyglądać tak:
#include<stdio.h> #include<stdlib.h> struct point { int x; int y; }*pp; void zapis(int *a, int *b); main() { pp=malloc(sizeof(struct point)); printf("Wpisz X: "); printf("\nWpisz Y: "); zapis(&pp->x,&pp->y); printf("\n X : %d",pp->x); printf("\n Y : %d",pp->y); free(pp); return 0; } void zapis( int *a, int *b) { scanf("%d %d", a, b); *a=*a+2; *b=*b+2; }
2) Przecież podałem ci już kod, w którym pobieranie jest w funkcjach, a printf'y w main. Ale jak chcesz, to wkleję jeszcze raz:
#include<stdio.h> #include<stdlib.h> struct point { char imiona[20]; int wiek; }*pp; void zapis_i(struct point *wsk); void zapis_w(struct point *wsk); main() { pp=malloc(sizeof(struct point)); printf("Wpisz imiona: "); zapis_i(pp); printf("\nWpisz wiek: "); zapis_w(pp); printf("\n Imie : %s",pp->imiona); printf("\n Wiek : %d",pp->wiek); free(pp); return 0; } void zapis_i(struct point *wsk) { fgets(wsk->imiona, 20, stdin); } void zapis_w(struct point *wsk) { scanf("%d", &wsk->wiek); }
Powodzenia ;)
P.S. Jeszcze jedno: błagam cię, używaj w kodach które wklejasz na forum funkcji malloc() i free() z stdlib.h, bo za każdym razem jak sprawdzam twój kod to muszę zmieniać :P
Użytkownik Balcerowicz edytował ten post 30 grudzień 2005, 21:57