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/gemtext/gemfeed | |
| parent | 1868ce207fef00c512be78830ba1fd87da5d90dc (diff) | |
add methods in c post
Diffstat (limited to 'content/gemtext/gemfeed')
| -rw-r--r-- | content/gemtext/gemfeed/2016-11-20-methods-in-c.gmi | 76 | ||||
| -rw-r--r-- | content/gemtext/gemfeed/atom.xml | 13 |
2 files changed, 88 insertions, 1 deletions
diff --git a/content/gemtext/gemfeed/2016-11-20-methods-in-c.gmi b/content/gemtext/gemfeed/2016-11-20-methods-in-c.gmi new file mode 100644 index 00000000..88315d23 --- /dev/null +++ b/content/gemtext/gemfeed/2016-11-20-methods-in-c.gmi @@ -0,0 +1,76 @@ +> Written by Paul Buetow 2016-11-20 + +=> ../ Go back to the main site + +# Methods in C + +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. + +## Example + +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: + +``` +#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)); +} +``` + +As you can see you can call the function (pointed by the function pointer) the same way as in C++ or Java via: + +``` +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)); +``` + +However, that's just syntactic sugar for: + +``` +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)); +``` + +Output: + +``` +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 +``` + +Not complicated at all, but nice to know and helps to make the code easier to read! + +## Taking it further + +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. + +E-Mail me your throughts at comments@mx.buetow.org! diff --git a/content/gemtext/gemfeed/atom.xml b/content/gemtext/gemfeed/atom.xml index 8d28fd1d..1403a85e 100644 --- a/content/gemtext/gemfeed/atom.xml +++ b/content/gemtext/gemfeed/atom.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>2021-05-01T13:24:15+01:00</updated> + <updated>2021-05-01T18:36:51+01:00</updated> <title>buetow.org feed</title> <subtitle>Having fun with computers!</subtitle> <link href="gemini://buetow.org/gemfeed/atom.xml" rel="self" /> @@ -29,6 +29,17 @@ </author> </entry> <entry> + <title>Methods in C</title> + <link href="gemini://buetow.org/gemfeed/2016-11-20-methods-in-c.gmi" /> + <id>gemini://buetow.org/gemfeed/2016-11-20-methods-in-c.gmi</id> + <updated>2021-05-01T18:36:51+01:00</updated> + <summary>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.. .....to read on please visit my site.</summary> + <author> + <name>Paul Buetow</name> + <email>comments@mx.buetow.org</email> + </author> + </entry> + <entry> <title>Offsite backup with ZFS (Part 2)</title> <link href="gemini://buetow.org/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.gmi" /> <id>gemini://buetow.org/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.gmi</id> |
