this post was submitted on 26 Jun 2025
45 points (95.9% liked)

ich_iel

3692 readers
650 users here now

Die offizielle Zweigstelle von ich_iel im Fediversum.

Alle Pfosten mĂŒssen den Titel 'ich_iel' haben, der Unterstrich darf durch ein beliebiges Symbol oder Bildschriftzeichen ersetzt werden. Ihr dĂŒrft euch frei entfalten!


Matrix


đŸ“± Empfohlene Schlaufon-Applikationen fĂŒr Lassmich


Befreundete Kommunen:

!wir_iel@feddit.org

!i_itrl@feddit.org

!ich_ial@lemmy.world

!zunftgemeinde@feddit.org

!ki_iel@feddit.org


Sonstiges:

Zangendeutsch-Wörterbuch


Regeln:

1. Seid nett zueinander

Diskriminierung anderer Benutzer, Beleidigungen und Provokationen sind verboten.

2. Pfosten mĂŒssen den Titel 'ich_iel' oder 'ich iel' haben

Nur Pfosten mit dem Titel 'ich_iel' oder 'ich iel' sind zugelassen. Alle anderen werden automatisch entfernt.

Unterstrich oder Abstand dĂŒrfen durch ein beliebiges Textsymbol oder bis zu drei beliebige Emojis ersetzt werden.

3. Keine HochwÀhl-Maimais oder (Eigen)werbung

Alle Pfosten, die um HochwĂ€hlis bitten oder Werbung beinhalten werden entfernt. Hiermit ist auch Eigenwerbung gemeint, z.b. fĂŒr andere Gemeinschaften.

4. Keine BildschirmschĂŒsse von Unterhaltungen

Alle Pfosten, die BildschirmschĂŒsse von Unterhaltungen, wie beispielsweise aus WasistApplikaton oder Zwietracht zeigen, sind nicht erlaubt. Hierzu zĂ€hlen auch Unterhaltungen mit KIs.

5. Keine kantigen BeitrÀge oder Meta-BeitrÀge

ich_iel ist kein kantiges Maimai-Brett. Meta-BeitrĂ€ge, insbesondere ĂŒber gelöschte oder gesperrte BeitrĂ€ge, sind nicht erlaubt.

6. Keine ÜberfĂ€lle

Wer einen Überfall auf eine andere Gemeinschaft plant, muss diesen zuerst mit den Mods abklĂ€ren. Brigadieren ist strengstens verboten.

7. Keine Ü40-Maimais

Maimais, die es bereits in die WasistApplikation-Familienplauderei geschafft haben oder von RĂŒdiger beim letzten Stammtisch herumgezeigt wurden, sind besser auf /c/ichbin40undlustig aufgehoben.

8. ich_iel ist eine humoristische Plattform

Alle Pfosten auf ich_iel mĂŒssen humorvoll gestaltet sein. Humor ist subjektiv, aber ein Pfosten muss zumindest einen humoristischen Anspruch haben. Die AtmosphĂ€re auf ich_iel soll humorvoll und locker gehalten werden.

9. Keine Polemik, keine KöderbeitrÀge, keine Falschmeldungen

BeitrĂ€ge, die wegen Polemik negativ auffallen, sind nicht gestattet. Desweiteren sind Pfosten nicht gestattet, die primĂ€r Empörung, Aufregung, Wut o.Ä. ĂŒber ein (insbesonders, aber nicht nur) politisches Thema hervorrufen sollen. Die Verbreitung von Falschmeldungen ist bei uns nicht erlaubt.


Bitte beachtet auch die Regeln von Feddit.org

founded 1 year ago
MODERATORS
 

Die berĂŒhmten letzten Worte eines Programmierers: Das sollte eigentlich schnell gehen.

Ich wollte doch nur eine super simple Methode um ein paar Variablen in mein C-Skript zu bekommen, damit im nachhinein der Endnutzer nicht im Code rumpfuschen muss. Nun sitze ich seit 2h hier und lerne von Grund auf neu C (ich habe das vorher nur fĂŒr die Programmierung eines Arduinos genutzt).

Wenigstens werde ich fĂŒr den Kram bezahlt.

top 26 comments
sorted by: hot top controversial new old
[–] LeFrog@discuss.tchncs.de 17 points 4 days ago* (last edited 4 days ago)

Zerlegung Schuld

Uff da musste ich zweimal lesen

AngelsÀchsischSegmentation Fault

[–] python@lemmy.world 17 points 4 days ago (1 children)

Die berĂŒhmten letzten Worte eines Programmierers: Das sollte eigentlich schnell gehen.

weint in JavaSchrift

[–] SkaveRat@discuss.tchncs.de 9 points 4 days ago

Wir machen es nicht weil es einfach ist. Sondern weil wir dachten, dass es einfach ist

[–] Randelung@lemmy.world 16 points 4 days ago

Wir tun es nicht, weil es einfach ist, sondern weil wir dachten, dass es einfach sei.

  • Credo des Programmierers
[–] d_k_bo@feddit.org 11 points 4 days ago (2 children)

Nun sitze ich seit 2h hier und lerne von Grund auf neu C

Du könntest auch einfach Rost 🩀 lernen und das Programm wiederschreiben. Dann lĂ€uft es dank Nullkostenabstrahierungen auch lodernd schnell 🚀

[–] elvith@feddit.org 13 points 4 days ago

Dann aber auch regelmĂ€ĂŸig anwenden - nicht, dass das Programmierwissen sonst... einrostet

[–] cows_are_underrated@feddit.org 5 points 4 days ago (3 children)

Mit Sicherheit nicht. Außerdem keine Ahnung ob Rost mit Arduinos so gut funktioniert.

[–] jenesaisquoi@feddit.org 13 points 4 days ago

Funktioniert ausgezeichnet.

Quelle: Mein Arduino oxidiert.

[–] excral@feddit.org 4 points 4 days ago (2 children)

Arduinos sollte man eigentlicher eh nicht mehr verwenden. Im Gegensatz zu z.B. den Raspberry Pico oder den ESP32 sind die komplett eingestaubte obsolete Technik. Der ATmega 328 ist ein ĂŒber 15 Jahre alter 8 Bit (!) Controller. Und selbst wenn man die Arduino Plattform verwenden möchte, kann man das auch mit dem Pico oder ESP32 Controllern. Aber spĂ€testens wenn man anfĂ€ngt mit Interrupts zu spielen wĂŒrde ich von der Arduino Plattform abraten

Ich lese jetzt nicht wirklich raus, was dagegen spricht einen Arduino verwenden, wenn einen die limitierte Hardware nicht einschrĂ€nkt. Das war bei denen ja aber gefĂŒhlt schon immer so. Es ist halt ein sehr begrenzter Mikrocontroller, aber mit niedriger Einstiegsschwelle und fĂŒr wahnsinnig viele Anwendungen absolut ausreichend. Ein ESP32 braucht auch ungefĂ€hr 100mal so viel Strom wie ein ATmega328. Es gibt mMn keinen Grund, die fĂŒnf Arduinos, die man noch in einer Kiste liegen hat, nicht mehr zu benutzen.

[–] polle@feddit.org 1 points 4 days ago

Durch die alte Technik flahst der Controller dafĂŒr auch sehr viel schneller. Ein esp32 finde ich deswegen extrem mĂŒhsam.

[–] d_k_bo@feddit.org 2 points 4 days ago (1 children)

Ich habe was eingebettet angeht bisher nur mit einem ESP32-C3 gearbeitet. Geht es? Ja. Macht es Spaß? Nur so semi. Gerade Blauzahn NE ist noch ausbaufĂ€hig, aber da geschieht aktuell auch viel.

[–] jenesaisquoi@feddit.org 2 points 4 days ago

Mir machte es Spaß. Kabelloses Netzwerk funktioniert einfach so aus der Kiste. Und Botschaft ist toll. Außerdem freue ich mich ĂŒber RISIKO 5 - je mehr Konkurrenz fĂŒr das amd64/aarch64 Duopol desto besser!

[–] cows_are_underrated@feddit.org 7 points 4 days ago* (last edited 4 days ago) (5 children)

Falls wer von euch zufĂ€lligerweise einen funktionierenden Code hat mit dem ich mir einfach die Werte von Variablen aus meiner config Datei ziehen kann wĂŒrde ich mich darĂŒber freuen.

Syntax meiner config:

Wert1 = 1
Wert2 = 2.5

Will das ganze dann irgendwie so implementieren:

int Wert1 = getValue("Wert1");

[–] jenesaisquoi@feddit.org 5 points 4 days ago

Schritt 1 ist es in Rost zu reimplementieren.

[–] excral@feddit.org 4 points 4 days ago (1 children)

Ist die Syntax deiner config-Datei fix? Sonst könntest du auch einfach eine C-Header-Datei als config-Datei verwenden und diese ganz normal includen.

[–] cows_are_underrated@feddit.org 1 points 4 days ago (1 children)

Könnte ich machen, aber will eher ungerne den User in einer C-Header Datei rum spielen lassen.

[–] anton@lemmy.blahaj.zone 1 points 1 day ago

Auf dem Arduino kannst du keine Dateien lesen, es sei den du willst die ĂŒber serial senden, deshalb musst du die Werte in dein Programm kompilieren.

will eher ungerne den User in einer C-Header Datei rum spielen lassen

Dann lass deine user deine config schreiben und generiere eine header Datei daraus.
Ich habe mal meine C-Kenntnisse raus gekramt.

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>

#define BUFFER_LEN 1024
#define MIN_STRONG_SIZE 16
#define IN_FILE_DEFAULT "config.txt"
#define OUT_FILE_DEFAULT "config.h"

typedef struct String {
	size_t length;
	size_t size;
	char content[];
} String;

typedef struct Variable {
	String* name;
	int intPart;
	int fracPart;
	bool isNegative;
	bool hasFraction;
} Variable;

FILE* outFile;

void storeVariable(Variable variable) {
	fprintf(outFile, "#define VAR_%s ", variable.name->content);
	if (variable.isNegative)
		fprintf(outFile, "-");
	fprintf(outFile, "%d", variable.intPart);
	if (variable.hasFraction)
		fprintf(outFile, ".%d", variable.fracPart);
	fprintf(outFile, "\n");
	free(variable.name);
}

String* newString(size_t size) {
	if (size < MIN_STRONG_SIZE) {
		size = MIN_STRONG_SIZE;
	}
	String* string = calloc(1, sizeof(String) + size);
	if (string == NULL) {
		fprintf(stderr, "allocation error");
		exit(3);
	}
	string->size = size;
	return string;
}

String* appendToString(String* string, char c) {
	if (string == NULL) {
		fprintf(stderr, "null pointer error");
		exit(4);
	}
	if (string->length+1 >= string->size) {
		string->size *= 2;
		string = realloc(string, sizeof(String) + string->size);
		if (string == NULL) {
			fprintf(stderr, "allocation error");
			exit(3);
		}
	}
	string->content[string->length] = c;
	string->content[string->length+1] = '\0';
	string->length++;
	return string;
}


typedef enum ParseMode {
	VAR_NAME_START = 0,
	VAR_NAME,
	INTEGER_START,
	INTEGER,
	FRACTION,
} ParseMode;

void handleChar(char c);

int main(int argc, char** argv) {
	char* confFileName = IN_FILE_DEFAULT;
	char* headerFileName = OUT_FILE_DEFAULT;
	if (argc > 1) {
		if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
			printf("usage: %s config_file output_file\n", argv[0]);
			printf("if no files get specified, the defaults are: %s %s\n", IN_FILE_DEFAULT, OUT_FILE_DEFAULT);
			return 0;
		}
		confFileName = argv[1];
	}
	if (argc > 2) {
		headerFileName = argv[2];
	}

	FILE* file = fopen(confFileName, "r");
	if (file == NULL) {
		fprintf(stderr, "can't open input file %s", confFileName);
		return 1;
	}
	outFile = fopen(headerFileName, "w");
	if (outFile == NULL) {
		fprintf(stderr, "can't open output file %s", headerFileName);
		return 1;
	}

	char buffer[BUFFER_LEN];
	unsigned long amountRead = fread(buffer, 1, BUFFER_LEN, file);
	while (amountRead > 0) {
		for (int i = 0; i < amountRead; i++) {
			handleChar(buffer[i]);
		}
		amountRead = fread(buffer, 1, BUFFER_LEN, file);
	}
	handleChar('\n');
	fclose(file);
	fclose(outFile);
	return 0;
}

ParseMode mode;
Variable state = {0};

void handleChar(char c) {
	if (c == ' ') {
		return;
	}
	switch (mode) {
		case VAR_NAME_START:
			if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
				state.name = newString(20);
				state.name = appendToString(state.name, c);
				mode = VAR_NAME;
			} else {
				fprintf(stderr, "error on '%c': variable names must start with a letter", c);
				exit(2);
			}
			break;
		case VAR_NAME:
			if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || (c == '_')) {
				state.name = appendToString(state.name, c);
			} else if (c == '=') {
				mode = INTEGER;
			} else {
				fprintf(stderr, "name error on '%c': variable names consist of alphanumeric characters and underscores", c);
				exit(2);
			}
			break;
		case INTEGER_START:
			if (c == '-') {
				state.isNegative = true;
				state.intPart = 0;
			} else if ('0' <= c && c <= '9') {
				state.intPart = c - '0';
			} else {
				fprintf(stderr, "number error on '%c': expected digit or '-'", c);
				exit(2);
			}
			break;
		case INTEGER:
			if ('0' <= c && c <= '9') {
				state.intPart = state.intPart * 10 + c - '0';
			} else if (c == '\n') {
				mode = VAR_NAME_START;
				storeVariable(state);
				Variable empty = {0};
				state = empty;
			} else if (c == '.') {
				mode = FRACTION;
				state.hasFraction = true;
			} else {
				fprintf(stderr, "number error on '%c':  expected digit or '.'", c);
				exit(2);
			}
			break;
		case FRACTION:
			if ('0' <= c && c <= '9') {
				state.intPart = state.intPart * 10 + c - '0';
			} else if (c == '\n') {
				mode = VAR_NAME_START;
				storeVariable(state);
				Variable empty = {0};
				state = empty;
			} else {
				fprintf(stderr, "number error on '%c':  expected digit", c);
				exit(2);
			}
			break;
	}
}

Man sollte es wahrscheinlich in header und source aufteilen, und die strings sind vielleicht overkill, aber fĂŒr ein one-of pass es schon. Wenn die variablen nach dem parsen anders verwenden willst, musst du nur storeVariable abĂ€ndern.

[–] Flipper@feddit.org 5 points 4 days ago (1 children)

Also eine Ini Datei:

https://github.com/benhoyt/inih

Keine Ahnung ob das geht, aber war schnell gefunden.

[–] cows_are_underrated@feddit.org 1 points 4 days ago (2 children)

Könnte gehen, aber ich will nicht 300 Zeilen code nutzen um mir ein paar Variablen aus einer ini Datei zu ziehen.

[–] haerrii@feddit.org 14 points 4 days ago

Willkommen bei C?

[–] Tlf@feddit.org 5 points 4 days ago* (last edited 4 days ago)

Glaube in der Sprache der Wahl wird es nicht viel kĂŒrzer. Edit: fstream spielt nicht gerne auf Arduino, den Vorschlag das selbst zu implementieren spare ich mir daher.

[–] bleistift2@sopuli.xyz 4 points 4 days ago (1 children)

Wie wÀre es mit Umgebungsvariablen?

Wert1=1 Wert2=2.5 ./skript.o

Eher nicht, da das ganze auf einen Arduino geflasht wird und das glaube nicht so der optimale weg ist.

[–] DmMacniel@feddit.org 3 points 4 days ago (1 children)

wie wÀre es mit https://www.nongnu.org/confuse/tutorial-html/index.html was eine ausgewiesene Datei (oder eine Variable / Strom) nimmt und du darauf Werte dann als Konfiguration auslesen kannst?

Klingt nach einem Ansatz. Muss die Tage mal schauen, ob/wie ich das zum laufen bekomme.