Witam, uczę się języka C z książki "Język C - szkoła programowania" i po przeczytaniu rozdziału 9. dotyczącego funkcji, zacząłem "bawić się" wskaźnikami.
Chciałem napisać jakiś prosty program, który pobiera z funkcji main jakieś wartości, przekazuje je do funkcji, która potem wykonuje na tych wartościach jakieś obliczenia i więcej niż jeden wynik przekazuje z powrotem do funkcji main. Wybór padł na funkcję obliczająca pole i obwód prostokąta, napisałem taki programik:
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
void pole_obwod(int, int, int *, int *);
int main()
{
int a, b;
int pole, obwod;
printf("Podaj a i b, a zwroce poprzez funkcje pole i obwod prostokata:\n");
scanf(" %d %d", &a, &b);
pole_obwod(a, b, &pole, &obwod);
printf("\nPole prostokota = %d\nObwod prostokota = %d\n", pole, obwod);
return 0;
}
void pole_obwod(int x, int y, int * p, int * o)
{
*p = x*y;
*o = 2*x+2*y;
}
Programik działa, jednak mam dwa pytania:
-
Czy ten program i funkcja obliczająca pole i obwód są napisane dobrze? Chodzi mi o sposób wymiany informacji pomiędzy funkcjami, czyli przekazanie wartości a i b do argumentów formalnych funkcji, przekazanie adresów zmiennych pole i obwod do funkcji i następnie przypisanie tym adresom przez wskaźnik wyników obliczeń? Wiem, że to działa, ale czy powinienem zrobić to jakoś inaczej?
-
Na początku nie wiem dlaczego, ale wpadłem na pomysł, aby to w funkcji pole_obwód zadeklarować wskaźniki i za ich pomocą przekazać wartości do funkcji main, napisałem coś takiego:
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
void pole_obwod(int, int);
int main()
{
int a, b;
int pole, obwod;
printf("Podaj a i b, a zwroce poprzez funkcje pole i obwod prostokata:\n");
scanf(" %d %d", &a, &b);
pole_obwod(a, b);
printf("\nPole prostokota = ?\nObwod prostokota = ?\n");
return 0;
}
void pole_obwod(int x, int y)
{
int po, ob;
po = x*y;
ob = 2*x+2*y;
int * p; int * o;
p = &po;
o = &ob;
printf("\nPole prostokata = %d \n", *p);
printf("\nObwod prostokata = %d \n", *o);
}
Wyniki obliczeń są prawidłowe, jednak nie wiedziałem, jak przekazać je do funkcji main, więc potem wpadłem na sposób zaprezentowany w sposobie pierwszym. Jeżeli chciałbym napisać program sposobem drugim, to czy istnieje taka możliwość, aby przekazać do funkcji main wyniki obliczeń i w jaki sposób mogę to zrobić?
No i zastanawiam się też, czy opłaca się pisać tego rodzaju funkcje (które zwracają więcej niż jedną wartość do funkcji main) tak, jak zrobiłem to w programie pierwszym, czy lepszy jest sposób w programie drugim?
Pytam się o to wszystko, bo dopiero zagłębiam się w świat wskaźników i nie chcę wyrabiać w sobie złych nawyków.
Dziękuje za odpowiedzi, pozdrawiam.