C/Funkcje: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Sotiale (dyskusja | edycje)
Reverted 1 edit by 157.158.41.3 (talk) to last revision by Sotiale (TwinkleGlobal)
Znacznik: Anulowanie edycji
m Update syntaxhighlight tags - remove use of deprecated <source> tags
Linia 144:
Załóżmy, że chcemy napisać prostą funkcję, która dajmy na to, mnoży wszystkie swoje argumenty (zakładamy, że argumenty są typu int). Przyjmujemy przy tym, że ostatni argument będzie 0. Będzie ona wyglądała tak:
 
<sourcesyntaxhighlight lang="C">
#include <stdarg.h>
Linia 158:
return iloczyn;
}
</syntaxhighlight>
</source>
 
va_list oznacza specjalny typ danych, w którym przechowywane będą argumenty, przekazane do funkcji. "va_start" inicjuje arg do dalszego użytku. Jako drugi parametr musimy podać nazwę ostatniego znanego argumentu funkcji. Makropolecenie <code>va_arg</code> odczytuje kolejne argumenty i przekształca je do odpowiedniego typu danych. Na zakończenie używane jest makro <code>va_end</code> - jest ono obowiązkowe!
Linia 215:
A oto działający przykład, który demonstruje wiadomości podane powyżej:
 
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
Linia 229:
return 0;
}
</syntaxhighlight>
</source>
 
==Zwracanie wartości==
Linia 267:
 
Przykład <ref>[http://rosettacode.org/wiki/Return_multiple_values#C| Przykład z rosettacode]</ref>
<sourcesyntaxhighlight lang=c>
 
#include<stdio.h>
Linia 297:
return 0;
}
</syntaxhighlight>
</source>
 
Przykład z SO<ref>[https://stackoverflow.com/questions/10370047/passing-struct-to-function stackoverflow question : passing-struct-to-function]</ref>
Linia 308:
 
Funkcja swap wczytuje 2 wartości i zamienia je miejscami
<sourcesyntaxhighlight lang=c>
#include <stdio.h>
// gcc s.c -Wall
Linia 331:
 
}
</syntaxhighlight>
</source>
 
Wynik programu :
Linia 348:
 
 
<sourcesyntaxhighlight lang=c>
// https://www.tutorialspoint.com/cprogramming/c_passing_arrays_to_functions.htm
 
Linia 357:
void myFunction(int param[]) //Formal parameters as an unsized array −
 
</syntaxhighlight>
</source>
 
Ponieważ nazwa tablicy jest wskaźnikiem do jej pierwszego elementu, to możemy korzystać z tablic w ten sposób:<ref>[http://www.java2s.com/Tutorial/C/0140__Array/Passarraytofunction.htm Pass array to function at java2s]</ref>
 
<sourcesyntaxhighlight lang=c>
#include<stdio.h>
 
Linia 390:
return 0;
}
</syntaxhighlight>
</source>
 
Funkcje nie tylko mają dostęp do tablicy, ale i mogą ją zmieniać.
Linia 434:
Jeśli program nie wczytuje &nbsp;żadnych argumentów to : <ref>[http://stackoverflow.com/questions/693788/is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo?rq=1 stackoverflow question : is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo?rq=1]</ref>
 
<sourcesyntaxhighlight lang=c>
int main(int argc, char **argv)
{
Linia 441:
return 0;
}
</syntaxhighlight>
</source>
 
 
Linia 481:
Warto też zauważyć, że funkcje rekurencyjne czasami mogą być znacznie wolniejsze niż podejście nierekurencyjne (iteracyjne, przy użyciu pętli). Flagowym przykładem może tu być funkcja obliczająca wyrazy [[w:Ciąg Fibonacciego|ciągu Fibonacciego]]:
 
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
Linia 518:
return 0;
}
</syntaxhighlight>
</source>
 
W tym przypadku funkcja rekurencyjna, choć łatwiejsza w napisaniu, jest bardzo nieefektywna.