C lernen
Re: C lernen
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
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
Re: C lernen
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
Gruß ralli
Re: C lernen
Genau! So lernt man dazu: kleine Schritte, Erfolgserlebnisse, die Problemstellen verbessern, usw.ralli hat geschrieben:01.11.2024 09:07:58Was 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.
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!
Re: C lernen
Sehr gerne, erst will ich es mal selbst versuchen, wenn ich dann nicht weiter komme, komm ich gerne auf Dein Hilfsangebot zurück.Meillo hat geschrieben: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.
Gruß ralli
Re: C lernen
Wird das dann ein offizielles Battle - Meillo vs. ChatGPT?Meillo hat geschrieben:01.11.2024 09:59:37Wenn du Hilfe beim Zusammenbauen den Formatstrings fuer scanf(3) brauchst, dann sag Bescheid, dann zeige ich dir wie das geht.
Re: C lernen
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.
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.
Re: C lernen
Danke für den Link, habe das Buch gerade bestellt.michaa7 hat geschrieben:18.10.2024 02:12:56Hier per Banküberweisung (Vorkasse) ab 9,40€ inkl. VersandTuxPeter hat geschrieben:17.10.2024 23:05:03Danke 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.
Gruß ralli
-
- Beiträge: 1981
- Registriert: 16.08.2005 18:15:29
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: münchen
Re: C lernen
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
Damit ich da keinen Blödsinn verbreite
Es gibt viele Foren und eine Welt ausserhalb
- 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
@mampfi:
Allein das hier geht schon nicht:
Alles andere hätte mich auch gewundert.
Nachtrag:
Du meintest wahrscheinlich:
Ja, das geht. Und da ich die Lösung schon lange kenne, lass ich euch alle mal weiterrätseln.
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;
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");
}
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
Douglas Adams
Re: C lernen
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
Gruß ralli
Re: C lernen
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?
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?
Re: C lernen
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.
Pointer-Arithmetik ist dabei das richtige Stichwort.
Use ed once in a while!
- 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
Es ist schon fies. Wenn man sich vor Augen hält, dass man für auch schreiben kann, dann dreht man nur noch die Reihenfolge um und kommt am Ende bei 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.
Code: Alles auswählen
foo[bar]
Code: Alles auswählen
*(foo+bar)
Code: Alles auswählen
*(bar+foo)
Code: Alles auswählen
bar[foo]
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
Douglas Adams
Re: C lernen
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.
In der Form erscheint das Phaenomen dann noch seltsamer:
Das geht immer, egal was fuer ein Pointertyp `p' 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.
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:Livingston hat geschrieben:10.11.2024 10:17:32ABER 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.
Code: Alles auswählen
p[5]
Code: Alles auswählen
5[p]
Das geht immer, egal was fuer ein Pointertyp `p' ist.
Use ed once in a while!
- 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
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.
ERGÄNZUNG:
Kleiner Tip zum Schmökern: https://openbook.rheinwerk-verlag.de/c_ ... er_007.htm
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.
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
Douglas Adams
Re: C lernen
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. )
Use ed once in a while!
- 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
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.
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
Douglas Adams
Re: C lernen
Ja, stimmt. In diesem Kontext ist dein Merksatz hilfreich.Livingston hat geschrieben:10.11.2024 12:16:51Was 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.
Use ed once in a while!
- 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
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.
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
Douglas Adams
Re: C lernen
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:
nmcli sollte natürlich installiert sein. Es geht hier nur um den Lernprozess.
Compilieren mit
oder schneller mit
Dafür muß natürlich make installiert sein.
Bei mir kommt als Ergebnis. 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
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;
}
Compilieren mit
Code: Alles auswählen
gcc wlan_signal.c -o wlan_signal
Code: Alles auswählen
make wlan_signal
Bei mir kommt als Ergebnis
Code: Alles auswählen
Aktuelle WLAN-Signalstärke: 68%
Viel Spaß
Gruß ralli