C lernen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 01.11.2024 09:07:58

Sehr gerne, danke für das Feedback, Meillo.

Hab das mit der Telefonnummer nur mal probiert, ist bereits geändert.

Die strspn(3)-Funktionen hat ChatGPT vorgeschlagen.

Plausibilitätsprüfungen habe ich noch nicht vorgenommen, mach ich aber noch. Deine Verbesserungsvorschläge muß ich durcharbeiten, damit ich auch verstehe, was ich mache.

Was auf jeden Fall nicht gut gelöst ist, wenn es Datensätze mit dem gleichen Namen gibt, was ja schnell der Fall ist bei Müller, Meier und Co. Dann löscht er einfach den ersten gefundenen Datensatz. Da muß ich mir (oder andere) noch Gedanken zu machen. Mir war es wichtig, ein erstes praktisches Erfolgserlebnis zu haben und das ist mir ja gelungen.

Make werde ich natürlich auch gleich ausprobieren. Ich kenn bei C nur ein paar Grundlagen, Schlüsselwörter, Datentypen, was es ja auch in anderen Hochsprachen gibt. Für alles andere müßte ich mich tiefer einarbeiten.

Gruß ralli

Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 01.11.2024 09:11:40

Der Tipp mit make war goldig, habe es gerade ausprobiert, funktioniert und erspart viel Tipparbeit. Danke! Und ich hab noch viel zu lernen.

Gruß ralli

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 01.11.2024 09:59:37

ralli hat geschrieben: ↑ zum Beitrag ↑
01.11.2024 09:07:58
Was auf jeden Fall nicht gut gelöst ist, wenn es Datensätze mit dem gleichen Namen gibt, was ja schnell der Fall ist bei Müller, Meier und Co. Dann löscht er einfach den ersten gefundenen Datensatz. Da muß ich mir (oder andere) noch Gedanken zu machen. Mir war es wichtig, ein erstes praktisches Erfolgserlebnis zu haben und das ist mir ja gelungen.
Genau! So lernt man dazu: kleine Schritte, Erfolgserlebnisse, die Problemstellen verbessern, usw. :-)


Wenn du Hilfe beim Zusammenbauen den Formatstrings fuer scanf(3) brauchst, dann sag Bescheid, dann zeige ich dir wie das geht. Aber besser erst mal selbst ein bisschen rumprobieren. ;-)
Use ed once in a while!

Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 01.11.2024 10:14:13

Meillo hat geschrieben: ↑ zum Beitrag ↑
01.11.2024 09:59:37

Genau! So lernt man dazu: kleine Schritte, Erfolgserlebnisse, die Problemstellen verbessern, usw. :-)

Wenn du Hilfe beim Zusammenbauen den Formatstrings fuer scanf(3) brauchst, dann sag Bescheid, dann zeige ich dir wie das geht. Aber besser erst mal selbst ein bisschen rumprobieren. ;-)
Sehr gerne, erst will ich es mal selbst versuchen, wenn ich dann nicht weiter komme, komm ich gerne auf Dein Hilfsangebot zurück.

Gruß ralli

tobo
Beiträge: 2346
Registriert: 10.12.2008 10:51:41

Re: C lernen

Beitrag von tobo » 01.11.2024 10:18:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
01.11.2024 09:59:37
Wenn du Hilfe beim Zusammenbauen den Formatstrings fuer scanf(3) brauchst, dann sag Bescheid, dann zeige ich dir wie das geht.
Wird das dann ein offizielles Battle - Meillo vs. ChatGPT?

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 01.11.2024 10:30:06

tobo hat geschrieben: ↑ zum Beitrag ↑
01.11.2024 10:18:37
Meillo hat geschrieben: ↑ zum Beitrag ↑
01.11.2024 09:59:37
Wenn du Hilfe beim Zusammenbauen den Formatstrings fuer scanf(3) brauchst, dann sag Bescheid, dann zeige ich dir wie das geht.
Wird das dann ein offizielles Battle - Meillo vs. ChatGPT?
Noe, wieso?
Use ed once in a while!

TuxPeter
Beiträge: 2020
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: C lernen

Beitrag von TuxPeter » 01.11.2024 10:59:28

Kleines Zwischenstatement:
Ich habe ja schon einiges für Arduino in der zugehörigen IDE programmiert. Mein Wunsch ist, die dabei erworbenen Kenntnisse auf etwas solidere Füße zu stellen, vor allem systemantische Lücken in den Grundkenntnissen zu füllen (von denen man ja eventuell selber gar keine Ahnung hat), beispielsweise die Grundstrukturen der Syntax besser zu erkennen - sowas schlägt sich dann direkt in der Geschwindigkeit und Fehlerhäufigkeit eigener Entwicklungen nieder.
Ich lese also weiterhin mit Interesse mit und verfolge auch weiter das K&R-Werk, werde aber vielleicht nicht so viel direkt hier beitragen können.

Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 02.11.2024 09:27:50

michaa7 hat geschrieben: ↑ zum Beitrag ↑
18.10.2024 02:12:56
TuxPeter hat geschrieben: ↑ zum Beitrag ↑
17.10.2024 23:05:03
Danke für die Erläuterungen!
Wollte mir gerade das K&R-Buch antiquarisch für ca, 7 € bestellen, aber alle drei Zugänge zu "medimops" möchten eine Kreditkarte. Scheinen sich gegen paypal verschworen zu haben, bieten nicht mal Überweisung per Vorkasse - mögen sie auf ihrem Altpapier sitzen bleiben!! Hat halt nicht sollen sein.
Hier per Banküberweisung (Vorkasse) ab 9,40€ inkl. Versand
Danke für den Link, habe das Buch gerade bestellt.

Gruß ralli

mampfi
Beiträge: 1981
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C lernen

Beitrag von mampfi » 05.11.2024 16:18:53

Ich gebe zu: Die Lösung warum das geht bin ich noch schuldig, da ich da aber gerne mal einen Fehler tippe, such ich noch nach der Lösung in einem Mail von mir.

Damit ich da keinen Blödsinn verbreite ;-)
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: C lernen

Beitrag von Livingston » 05.11.2024 17:56:48

@mampfi:
Allein das hier geht schon nicht:

Code: Alles auswählen

geht.c: In Funktion »main«:
geht.c:10:30: Fehler: Zuweisung an Ausdruck von Arraytyp
   10 | for (i=0; i <= 9; i++) vektor=i;
Alles andere hätte mich auch gewundert.

Nachtrag:
Du meintest wahrscheinlich:

Code: Alles auswählen

#include <stdio.h>

int main(void)

{
unsigned char i;
char vektor[10];

for (i=0; i <= 9; i++) vektor[i]=i;
for (i=0; i <= 9; i++) printf("%d\n", i[vektor]); //i und vektor vertauscht, wieso geht das?

puts("Hauptprogramm Fertig");
}
Ja, das geht. Und da ich die Lösung schon lange kenne, lass ich euch alle mal weiterrätseln. :mrgreen:
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 09.11.2024 17:23:41

Mein Buch "Programmieren in C" von K&R in deutsch mit Sprachrefernz ist heute angekommen. Hat ca. 1 Woche gebraucht wegen Vorkasse von Booklooker. Obwohl fast 35 Jahre alt, ist es wie neu und so gut wie ungenutzt. Hab heute das Vorwort und Einleitung gelesen, sehr strukturiert alles, gefällt mir gut. Nun geht es an die Arbeit, Kapitel für Kapitel zu lesen und durch zu arbeiten.

Gruß ralli

TuxPeter
Beiträge: 2020
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: C lernen

Beitrag von TuxPeter » 09.11.2024 22:11:20

Jo, gefällt mir auch gut, meines sieht ungebraucht aus, oben ein leichter Vergilbungs-Streifen, man sieht genau, wo es im Regal über die benachbarten Bücher hinausgeragt hat. Möglicherweise ein Omen.

Aber die Lösung für die oben genannte "falschherum-"Indizierung i[vector] habe ich darin auch nicht gefunden. Ja, es geht, habe damit fleißig herumprobiert mit diversen Varianten, aber der Compiler hat mir auch nicht verraten, warum es funktioniert. Irgend so eine Pointer-Geschichte, vermute ich. Aber wie?? Ob uns Mr. Livingston wohl noch aus unserer Unwissenheit erlöst?

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 09.11.2024 22:50:18

Die Loesung findet sich, wenn man realisiert, dass `foo[bar]' nur Syntactic Sugar fuer eine andere Schreibweise ist.

Pointer-Arithmetik ist dabei das richtige Stichwort.
Use ed once in a while!

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: C lernen

Beitrag von Livingston » 10.11.2024 10:17:32

Es ist schon fies. Wenn man sich vor Augen hält, dass man für

Code: Alles auswählen

foo[bar]
auch

Code: Alles auswählen

*(foo+bar)
schreiben kann, dann dreht man nur noch die Reihenfolge um

Code: Alles auswählen

*(bar+foo)
und kommt am Ende bei

Code: Alles auswählen

bar[foo]
raus.

ABER das geht nur, weil die die dahintersteckenden Pointer auf Objekte gleicher Größe zeigen. Z.B. würde ein Rechnen mit char- und int-Pointern Stress bereiten. Ich gehe mal nicht ins Detail, sondern lasse euch ein wenig Zeit, dass selbst zu überprüfen.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 10.11.2024 10:28:38

Das ist die Erklaerung. Vertauschen darf man weil der Plus-Operator in C kommutativ ist.

Diese Alternativschreibweise zu verstehen ist aus meiner Sicht ein entscheidender Schritt C zu verstehen. Wenn man erstmal `*(p+i)' komplett verstanden hat, dann kann einen in C kaum noch etwas ueberraschen, weil man den Kern der Sprache begriffen hat.

Livingston hat geschrieben: ↑ zum Beitrag ↑
10.11.2024 10:17:32
ABER das geht nur, weil die die dahintersteckenden Pointer auf Objekte gleicher Größe zeigen. Z.B. würde ein Rechnen mit char- und int-Pointern Stress bereiten. Ich gehe mal nicht ins Detail, sondern lasse euch ein wenig Zeit, dass selbst zu überprüfen.
Da machst du einen kleinen Denkfehler: Es ist nur ein Pointer involviert, die andere Variable ist ein gewoehnlicher Integer, wie man z.B. an einem Ausdruck wie diesem sehen kann:

Code: Alles auswählen

p[5]
In der Form erscheint das Phaenomen dann noch seltsamer:

Code: Alles auswählen

5[p]
;-)

Das geht immer, egal was fuer ein Pointertyp `p' ist.
Use ed once in a while!

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: C lernen

Beitrag von Livingston » 10.11.2024 10:34:15

Es dämmert wieder... A pointer is not an array.
Um nicht ins Stolpern zu kommen, sollte man immer möglichst sauber programmieren. Nur, weil etwas erlaubt, ist es noch lange nicht sinnvoll. Ausnahmen bestätigen natürlich die Regel. :wink:

ERGÄNZUNG:
Kleiner Tip zum Schmökern: https://openbook.rheinwerk-verlag.de/c_ ... er_007.htm
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 10.11.2024 11:00:46

Livingston hat geschrieben: ↑ zum Beitrag ↑
10.11.2024 10:34:15
Es dämmert wieder... A pointer is not an array.
Das stimmt natuerlich, aber ich verstehe nicht recht den Wert dieser Feststellung. Wichtiger finde ich die Erkenntnis, dass ein Array letztlich nur ein Pointer ist plus eine Groesseninformation.

Vielleicht war der Spruch doch anders als du ihn in Erinnerung hast und er lautete: An array is just a pointer. Das macht IMO (wenn auch etwas vereinfachend) mehr Sinn fuer den Erkenntnisgewinn. (... und das auch noch gereimt. :lol: )
Use ed once in a while!

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: C lernen

Beitrag von Livingston » 10.11.2024 12:16:51

Was soll man über Merksätze sagen? Beide haben ihre Berechtigung. An array is just a pointer ist schön und gut, wenn ich bspw. ein Array an eine Funktion übergebe. Die Funktion greift sich die Adresse des Arrays, aber schon wird's hakelig: Die Funktion hat nicht die Fähigkeit, die Größe mitzunehmen. Die muss ich ihr meist gesondert mitgeben, sonst tut sie u.U. wilde Dinge außerhalb des Array-Bereiches. Insofern kann ich sagen, dass für mich der Merksatz A pointer is not an array wesentlich hilfreicher ist.
Hinsichtlich der Anwendbarkeit sollte man sich des Unterschiedes bewusst sein, sonst erlebt man Überraschungen.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C lernen

Beitrag von Meillo » 10.11.2024 12:30:44

Livingston hat geschrieben: ↑ zum Beitrag ↑
10.11.2024 12:16:51
Was soll man über Merksätze sagen? Beide haben ihre Berechtigung. An array is just a pointer ist schön und gut, wenn ich bspw. ein Array an eine Funktion übergebe. Die Funktion greift sich die Adresse des Arrays, aber schon wird's hakelig: Die Funktion hat nicht die Fähigkeit, die Größe mitzunehmen. Die muss ich ihr meist gesondert mitgeben, sonst tut sie u.U. wilde Dinge außerhalb des Array-Bereiches. Insofern kann ich sagen, dass für mich der Merksatz A pointer is not an array wesentlich hilfreicher ist.
Hinsichtlich der Anwendbarkeit sollte man sich des Unterschiedes bewusst sein, sonst erlebt man Überraschungen.
Ja, stimmt. In diesem Kontext ist dein Merksatz hilfreich.
Use ed once in a while!

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: C lernen

Beitrag von Livingston » 10.11.2024 12:51:12

Etwas Ähnliches kenne ich aus dem Spiel Go. Es gibt hunderte Merksätze. Zwei davon finde ich absolut bemerkenswert:
Wer alle vier Ecken beherrscht, hat gewonnen. Einfache Begründung: In den Ecken des Spielbretts kann man mit geringstem Aufwand viel Gebiet für sich beanspruchen.
Wer alle vier Ecken beherrscht, hat verloren. Ebenfalls einfache Begründung: Wer sich auf alle vier Ecken gestürzt hat, hat den gesamten Rest des Spielbrettes vernachlässigt.
Meister des Zen haben damit keine Probleme.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
ralli
Beiträge: 4380
Registriert: 02.03.2008 08:03:02

Re: C lernen

Beitrag von ralli » 13.11.2024 17:02:34

Seine voll Stärke spielt C natürlich in der Systemprogrammierung aus, weil sehr hardwarenah. Habe mal ein kleines Programm wlan_signal.c geschrieben, was die Signalstärke von wlan ermittelt und dann als Ergebnis ausgibt:

Code: Alles auswählen

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

#define BUFFER_SIZE 256

int main() {
    FILE *fp;
    char buffer[BUFFER_SIZE];
    char command[] = "nmcli -f IN-USE,SIGNAL,SSID dev wifi list | grep '*'";

    // Öffne das Kommando als Datei
    fp = popen(command, "r");
    if (fp == NULL) {
        perror("Fehler beim Ausführen des Kommandos");
        return 1;
    }

    // Lese die Ausgabe des Kommandos
    if (fgets(buffer, sizeof(buffer), fp) != NULL) {
        int signal_strength;
        sscanf(buffer, "* %d", &signal_strength);
        printf("Aktuelle WLAN-Signalstärke: %d%%\n", signal_strength);
    } else {
        printf("Keine WLAN-Verbindung gefunden\n");
    }

    // Schließe den Stream
    pclose(fp);
    return 0;
}


nmcli sollte natürlich installiert sein. Es geht hier nur um den Lernprozess.

Compilieren mit

Code: Alles auswählen

gcc wlan_signal.c -o wlan_signal
oder schneller mit

Code: Alles auswählen

make wlan_signal
Dafür muß natürlich make installiert sein.

Bei mir kommt als Ergebnis

Code: Alles auswählen

Aktuelle WLAN-Signalstärke: 68%
. Das ist in Ordnung, auch weil ich ein paar Meter vom Router, der im Wohnzimmer steht, in meinem Arbeitszimmer das wlan Signal mit einem Fritz USB Stick empfange. Leider nur mit 2452 MHz.

Viel Spaß

Gruß ralli

Antworten