diff options
| author | Paul Buetow <git@mx.buetow.org> | 2021-05-01 18:36:52 +0100 |
|---|---|---|
| committer | Paul Buetow <git@mx.buetow.org> | 2021-05-21 05:11:04 +0100 |
| commit | 70106fd5e0540300d2262caa8df546828cab9825 (patch) | |
| tree | 70dfd71dcbdd210ab597c2cc0a70015ffd630e29 /content/html/gemfeed/2016-11-20-methods-in-c.html | |
| parent | 1868ce207fef00c512be78830ba1fd87da5d90dc (diff) | |
add methods in c post
Diffstat (limited to 'content/html/gemfeed/2016-11-20-methods-in-c.html')
| -rw-r--r-- | content/html/gemfeed/2016-11-20-methods-in-c.html | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/content/html/gemfeed/2016-11-20-methods-in-c.html b/content/html/gemfeed/2016-11-20-methods-in-c.html new file mode 100644 index 00000000..5de22d33 --- /dev/null +++ b/content/html/gemfeed/2016-11-20-methods-in-c.html @@ -0,0 +1,82 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<title>buetow.org - Having fun with computers!</title> +<meta charset='utf-8'> +<link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> +<style> +body { background-color: #282c34; color: #dfdfdf; margin: auto; max-width: 900px; } +img { display: block; max-width: 70%;} +pre { color: #ecbe7b; } +blockquote { color: #ecbe7b; } +a { color: #c678dd; text-decoration: none; } +a.textlink:before { content: " > "; padding-left: 2px; } +a:hover { color: #51afef; text-decoration: underline; } +h1 { color: #ff6c6b; } +h2, h3, h4, h5, h6 { color: #51afef; } +li { color: #98be65; } +</style> +</head> +<body> +<pre>Written by Paul Buetow 2016-11-20</pre> +<a class="textlink" href="../">Go back to the main site</a><br /> +<h1>Methods in C</h1> +<p>You can do some sort of object oriented programming in the C Programming Language. However, that is very limited. But also very easy and straight forward to use.</p> +<h2>Example</h2> +<p>Lets take a look at the following sample program. Basically all you have to do is to add a function pointer such as "calculate" to the definition of struct "something_s". Later, during the struct initialization, assign a function address to that function pointer:</p> +<pre> +#include <stdio.h> + +typedef struct { + double (*calculate)(const double, const double); + char *name; +} something_s; + +double multiplication(const double a, const double b) { + return a * b; +} + +double division(const double a, const double b) { + return a / b; +} + +int main(void) { + something_s mult = (something_s) { + .calculate = multiplication, + .name = "Multiplication" + }; + + something_s div = (something_s) { + .calculate = division, + .name = "Division" + }; + + const double a = 3, b = 2; + + printf("%s(%f, %f) => %f\n", mult.name, a, b, mult.calculate(a,b)); + printf("%s(%f, %f) => %f\n", div.name, a, b, div.calculate(a,b)); +} +</pre> +<p>As you can see you can call the function (pointed by the function pointer) the same way as in C++ or Java via:</p> +<pre> +printf("%s(%f, %f) => %f\n", mult.name, a, b, mult.calculate(a,b)); +printf("%s(%f, %f) => %f\n", div.name, a, b, div.calculate(a,b)); +</pre> +<p>However, that's just syntactic sugar for:</p> +<pre> +printf("%s(%f, %f) => %f\n", mult.name, a, b, (*mult.calculate)(a,b)); +printf("%s(%f, %f) => %f\n", div.name, a, b, (*div.calculate)(a,b)); +</pre> +<p>Output:</p> +<pre> +pbuetow ~/git/blog/source [38268]% gcc methods-in-c.c -o methods-in-c +pbuetow ~/git/blog/source [38269]% ./methods-in-c +Multiplication(3.000000, 2.000000) => 6.000000 +Division(3.000000, 2.000000) => 1.500000 +</pre> +<p>Not complicated at all, but nice to know and helps to make the code easier to read!</p> +<h2>Taking it further</h2> +<p>If you want to get a bit further type "Object-Oriented Programming with ANSI-C" into your favourite internet search engine, you will find some crazy stuff. Some go as far as writing a C preprocessor in AWK, which takes some object oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is actually similar to how the C++ language had its origins.</p> +<p>E-Mail me your throughts at comments@mx.buetow.org!</p> +</body> +</html> |
