kategoria: ANSI C
[#1] Początki programowania w C
Założę taki ogólnie zatytułowany wątek, w którym będę nękał Was pytaniami i problemami, które napotkam podczas nauki programowania w C ;)
Uczę się C i C++ w wersji na PC Win i mam trochę problemów przy przeniesieniu tej wiedzy na Amigę. Będę pytał o podstawy, więc proszę o wyrozumiałość.

Pierwsze pytanie mam takie:
Jak wyświetlić wartość, którą zwróciła funkcja?
Konkretnie wygląda to tak:

int main()
{
dodawanie();
printf("Wynik dodawania to: (tu chcę wyświetlić "c" zwrócone przez funkcję "dodawanie'') n'');
return(0);
}
int dodawanie(a,b)
{
c=a+b;
return(c);
}

EDIT:
Już doszedłem. Znalazłem w jednej ze szkółek PPA na temat C.
printf("Wynik dodawania to: %dn",dodawanie(a,b));



Ostatnia modyfikacja: 03.05.2011 20:40:37
[#2] Re: Początki programowania w C

@frywolny_marian, post #1

Jeśli korzystasz ze standardowej biblioteki języka C (a widzę, że tak) to podstawy programowania w C są identycznie na Amidze i Windowsie (i każdym innym OS).

Btw. Nie wiem z jakiej książki uczysz się C, ale polecam "Język ANSI C", Kernighana i Ritchiego. Nie popełniłbyś takich trywialnych błędów ucząc się z niej.

Poprawny kod:
#include 

int dodawanie(int a, int b);

int main() 
{
        printf("Wynik dodawania to: %d n", dodawanie(1,2));
        return(0);
}

int dodawanie(int a, int b) 
{
        int c=a+b;
        return(c);
}


Jeśli spojrzysz na definicję funkcji printf, to zobaczysz, że wartość do wyświetlenia musi być jednym z parametrów tej funkcji...



Ostatnia modyfikacja: 03.05.2011 20:42:46
[#3] Re: Początki programowania w C

@strim, post #2

Dzięki. Nie wpisywałem kodu w całości, tylko fragment, którego pytanie dotyczyło ;)
EDIT:
Już widzę błędy, które popełniłem.



Ostatnia modyfikacja: 03.05.2011 20:49:12
[#4] Re: Początki programowania w C

@strim, post #2

A gdybym chciał wynik dodawania z funkcji "dodawanie" przekazać jako zmienną z powrotem do "main", to jak mogę to zrobić?

int dodawanie(int a, int b);
{
int SUMA=a+b;
return SUMA;
}

w C++ w Win byłoby to:

int main()
{
cout << SUMA << endl;
return(0);
}

[#5] Re: Początki programowania w C

@frywolny_marian, post #4

Tego typu operacje najlepiej wykonywać przez wskaźnik.

Na Amidze C++ jest niezbyt popularne. Jeśli nie znasz dobrze C lepiej nie zabieraj się za C++, tylko zagmatwa Ci obraz sytuacji ;). Najpierw poznaj dobrze programowanie proceduralne/strukturalne w C.

Podobna konstrukcja z użyciem wskaźnika mogłaby wyglądać tak:
void dodawanie(int a, int b, int *o) {
        *o=a+b;
}

int main(void) {
        int a = 1, b = 2, out = 0;
        dodawanie(a,b,&out);
        printf("Wynik: %dn", out);
}


[#6] Re: Początki programowania w C

@frywolny_marian, post #4

nie, pod win i c++ wcale by tak nie bylo.

[#7] Re: Początki programowania w C

@strim, post #5

a co to za potwor??

1: w pooprzednim poscie jest blad bo zmienna SUMA nie jest wcale globalna
2: zawsze myslalem, ze zwrocenie wyniku przez return jest najbardziej oczywiste...

[#8] Re: Początki programowania w C

@kiero, post #7

W przypadku 1 wartości owszem, a jak trzeba 2? Np. wynik dzielenia i resztę? :>
[#9] Re: Początki programowania w C

@kiero, post #7

a co to za potwor??

Normalne zwrócenie wyniku funkcji przez wskaźnik, całkiem użyteczne w pewnych zastosowaniach.

Ad 1. Pomyślałem, że ten fragment nie został przeklejony.
Ad 2. Jak widać frywolny_marian już się nauczył zwracać przez return i szuka innych możliwości.

[#10] Re: Początki programowania w C

@abcdef, post #8

nie bylo to tematem pytania. nauki nie rozpoczyna sie od komplikowania sobie zycia.

[#11] Re: Początki programowania w C

@strim, post #9

w przykladzie zwrocil przez return. ja tam nigdzie nie widzialem powodu zeby emulowac &zmienna z c++. z mojej strony koniec bo widze, ze sami sobie swietnie radzicie

[#12] Re: Początki programowania w C

@kiero, post #11

Przykład podany przez Strima jest nie trafiony, bo zwracanie wartości w ten sposób jest przydatne tylko gdy zwracamy co najmniej dwie wartości. Jeśli funkcja ma coś zwracać to oczywiście powinna przez return. Jeśli funkcja ma zwracać więcej niż jedną wartość używamy i return i wskaźników.

[#13] Re: Początki programowania w C

@kiero, post #11

emulowac &zmienna z c++

Operator & nie ma nic wspólnego z C++.

z mojej strony koniec

Nie rozumiem o co Ci chodzi, jeśli źle zinterpretorwałem jego pytanie to niech sam napisze, że nie o to pytał... :/

[#14] Re: Początki programowania w C

@strim, post #13

Operator & nie ma nic wspólnego z C++.


Kierowi chodzi o przekazywanie parametrów przez referencję w C++. Do tego używa się znaku &. Wtedy nie jest tworzona kopia lokalna parametru i możemy też w ten sposób zwracać wartości.



Ostatnia modyfikacja: 03.05.2011 21:49:43
[#15] Re: Początki programowania w C

@Minniat, post #12

Jeśli funkcja ma coś zwracać to oczywiście powinna przez return

Taki przykład podałem w poście numer 2!

[#16] Re: Początki programowania w C

@strim, post #13


&zmienna jako referencja do zmiennej na liscie parametrow:

void dodaj(int a, int b, int &wynik) i wywolanie dodaj(10,10,c); to jak najbardziej dotyczy c++ i twoje rozwiazanie emuluje wlasnie takie zachowanie.

[#17] Re: Początki programowania w C

@strim, post #13

Właśnie o coś takiego mi chodziło. Poduczę się jednak jeszcze trochę. Zdobyłem książkę Kernighana i Ritchiego, którą polecałeś. Do tego jeszcze "Learning C - Programing Graphics on the Amiga and Atari ST" Sugiyamy i Metcalfa i "Inside Amiga Graphics" Leemona. Może jeszcze jakieś tytuły byś polecił? Może być w języku angielskim.

[#18] Re: Początki programowania w C

@frywolny_marian, post #17

Czy mógłbyś zdradzić gdzie zdobyłeś te książki "Learning C - Programming Graphics on the Amiga and Atari ST" oraz "Inside Amiga Graphics"?

[#19] Re: Początki programowania w C

@frywolny_marian, post #17

Kernighan i Ritchie zdecydowanie - podstawy C, do tego bardzo przejrzyście wyłożone i z mnóstwem przykładów
Stosunkowo fajna jest książka "Amiga OS od środka". Jest tam trochę o exec.library, i sporo o tworzeniu GUI zgodnego z AmigaOS3.1 (intuition). Trochę więcej na ten temat było w odcinkowym kursie o C w Amiga Magazynie (autor K. Iskra). Generalnie do stworzenia topornego (mam na myśli estetykę GUI), ale 100% zgodnego z OS jak znalazł (a więc chodzącego pod AOS 68k, PPC czy MOS).
Polecam też kurs programowania pod MUI autorstwa Krashana - znajdziesz na PPA (nie chodzi o ten nowy kurs MUI MOSowego, no chyba że pod mosowe MUI4 chcesz pisać; tylko o stary kurs o MUI3.x dla 68k).
No i oczywiście CD z "Amiga References...." z opisem wszystkich funkcji systemowych bibliotek OS3.1.



Ostatnia modyfikacja: 03.05.2011 22:24:14
[#20] Re: Początki programowania w C

@frywolny_marian, post #17

jakieś tytuły byś polecił?

W zasadzie pozycje które wymienił wali7 są sensowne, ale nie miałem styczności ze wszystkimi.

Ja bym zaczął od "Języka ANSI C", później zabrał się za Amiga ROM Kernel Reference Manual (RKRM), to podstawa jeśli chodzi o programowanie pod AmigaOSem. Dość dobra jest książka "Algorytmy w C" (K. Loudon) - wiele przykładów implementacji algorytmów, które są potrzebne w każdej większej aplikacji.

[#21] Re: Początki programowania w C

@Minniat, post #18

Niestety nie w księgarni ;) Sprawdź pocztę.
EDIT:
Masz ukryty adres.



Ostatnia modyfikacja: 03.05.2011 22:38:45
[#22] Re: Początki programowania w C

@wali7, post #19

@wali, strim
Dzięki. Dam radę zdobyć większość tych źródeł, a kilka z nich nawet mam.

[#23] Re: Początki programowania w C

@frywolny_marian, post #21

Masz ukryty adres.


Właśnie to zmieniłem. Możesz słać info.

[#24] Re: Początki programowania w C

@wali7, post #19

Generalnie do stworzenia topornego (mam na myśli estetykę GUI)


ee tam, zaraz toporne, jak ladnie poskinowac to wyglada jak talala

[#25] Re: Początki programowania w C

@strim, post #2

Witam

Pozwolę sobie na sugestie. W C++, można nawet tak (nie testowałem, a'vista):

#include

int dodawanie(int, int);

int main()
{
printf("Wynik dodawania to: %d n", dodawanie(1,2));
};

// return 0; nie jest już wymagane, zgodnie ze standardem domyślnie jest return 0, czyli zwraca informację do systemu, że nie było błędu

int dodawanie(int a, int b)
{
return a+b;
};

Szczerze, to na Amidze jeszcze w C nie pisałem, głównie swego czasu asembler (demoscena, itp.).

Co do zwracania wskaźnika to wykorzystuje się go jedynie po to by łączyć kaskadowo operacje w stylu a = b +c +d +...., albo a = b = c = 1, Wtedy trzeba zwracać wskaźnik.

Jeśli ma być trywialne a = b+c, nie ma potrzeby zabawy ze wskaźnikami. A tym bardziej wynik umieszczać we wskaźniku. Funkca po prostu ma zwrócić wynik, w najczystszej postaci, a dopiero potem z tym wynikiem robimy co chcemy. Możemy go nawet wpisać do wskaźnika (pod adres).

Pozdrawiam

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem