Diese Meldung heißt übersetzt so viel wie: "Avast taugt - wie alle anderen Antivirenprogramme auch - überhaupt nichts, und muss mithilfe von Drückermethoden jeden Pups so weit aufblähen, damit naive Leute für diesen Müll auch noch Geld ausgeben" :)

...zur Antwort

Ich kaufe mir immer die "offiziellen" Arduinos im Familienpack und dazu den ganzen Elegoo-Kram einzeln.

Das ist in der Summe billiger, man Unterstützt die Firma Arduino, und man kann sich genau zusammen stellen, was man alles haben möchte. :)

...zur Antwort

Also nehmen wir mal an, du hast eine Smiley-Datenbank in Form einer Textdatei, mit folgendem Inhalt:

😀 smiley
😁 happy
😇 angel
😈 devil
😞 sad
😠 angry
😮 oh
😱 munch
😴 sleep

(Ich weiß, es gibt noch viel mehr, aber das soll jetzt nur ein Beispiel sein!)

Dann kannst du mit folgendem Codeschnipsel Smileys durch Textrepräsentation und umgekehrt in einem Text ersetzen:

import codecs

smiley_text = {}
text_smiley = {}

with codecs.open('smileys.txt', 'r', 'utf-8', 'strict') as fh:
	for line in fh:
		if ' ' not in line:
			continue

		smiley, text = line.strip().split(' ', 1)
		text = ':%s:' % text

		smiley_text[smiley] = text
		text_smiley[text] = smiley

message = '''
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:
'''.strip()

print('ORIGINAL:\n%s' % message)

for text, smiley in text_smiley.items():
	if text in message:
		message = message.replace(text, smiley)

print('REPLACE A:\n%s' % message)

for smiley, text in smiley_text.items():
	if smiley in message:
		message = message.replace(smiley, text)

print('REPLACE B:\n%s' % message)

Damit erhältst du folgende Ausgabe:

ORIGINAL:
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:

REPLACE A:
Das ist das Haus, vom Nikolaus. 😁
Und das nebenan, vom Weihnachtsmann. 😀

REPLACE B:
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:

Wie du siehst, funktioniert die Ersetzung damit recht einfach. Die entsprechende Funktionalität musst du dir natürlich noch selber in eine Klasse oder schicke Funktionen verpacken, aber so siehst du erst mal, wie das im Großen und Ganzen funktioniert.

Disclaimer: Ich weiß, dass der Code nicht allzu optimal ist, aber da er möglichst auch für Anfänger ohne große Vorkenntnisse verständlich sein soll, will ich jetzt nicht übertreiben.

Aus Effizienzgründen würde ich normalerweise mit einem Iterator über "message" gehen, aber das würde den Code deutlich vergrößern.

...zur Antwort

Viele C-Programmierer machen leider den Fehler, und schreiben ihre Strukturen wie folgt in eine Datei:

struct Foo {
  int i;
  char c;
};

typedef struct Foo Foo;

/* ... */

Foo foo = { 0, 0 };
FILE *fh = fopen("file.bin", "wb");

/* ... */

fwrite(&foo, sizeof(foo), 1, fh);

Bitte beachte die letzte Zeile des Codeschnipsels: Genau SO sollte man es eben NICHT machen! :)

Das verstößt gegen den Standard, ist undefiniertes und damit nicht portables Verhalten, und reißt Datenlecks bzw. Sicherheitslücken auf.

Der einzige richtige Weg, Strukturen zu schreiben, ist Member für Member:

fwrite(&foo.i, sizeof(foo.i), 1, fh);
fwrite(&foo.c, sizeof(foo.c), 1, fh);

Wer sich für Details interessiert: Falls ich mich nicht irre, hat sowohl Cert-C als auch MISRA-C eine Guideline dazu, und im Buch "Secure Coding in C and C++" gibt es ein Unterkapitel zu dem Thema ... falls ich nicht gerade den Buchtitel mit einem anderen verwechsel.

Auf jeden Fall hat es enorm viele Nachteile und ist genau genommen ein Bug, wenn man Strukturen als Ganzes, und nicht Elementweise schreibt. Und Packing ist sowieso nicht portabel, also am besten entsprechende #pragma oder __attribute__ Direktiven verkneifen, es sei denn, man möchte sich an einen einzigen Compilerhersteller binden. :)

...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.