summaryrefslogtreecommitdiff
path: root/content/gemtext/gemfeed
diff options
context:
space:
mode:
authorPaul Buetow <git@mx.buetow.org>2021-05-01 18:36:52 +0100
committerPaul Buetow <git@mx.buetow.org>2021-05-21 05:11:04 +0100
commit70106fd5e0540300d2262caa8df546828cab9825 (patch)
tree70dfd71dcbdd210ab597c2cc0a70015ffd630e29 /content/gemtext/gemfeed
parent1868ce207fef00c512be78830ba1fd87da5d90dc (diff)
add methods in c post
Diffstat (limited to 'content/gemtext/gemfeed')
-rw-r--r--content/gemtext/gemfeed/2016-11-20-methods-in-c.gmi76
-rw-r--r--content/gemtext/gemfeed/atom.xml13
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>