Möchte C Lernen

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Möchte C Lernen

Beitrag von Maik81ftl »

Moin Moin,

Habe heute meine CD endlich bekommen und mit C anzufangen. scheidere aber immer an dem Fehler... :

orginal aus dem Handbuch dazu ist der code wie folgt.

Code: Alles auswählen

void main(void)
{
}


Im selbigen Buch wird auch geschieben
Sollte Ihr Compiler einen Fehler melden, dann müssen Sie den Functionskopf int main() verwenden. Bei älteren Compilern, die die AnsiNorm nicht vollständig unterstützen, kann dann eine Warnung erscheinen, die darauf...
In diesem Fall müssen Ihre main-functionen als letzten Befehl immer return(0) besitzen.
alles wollte ich nicht abtippeln :|

was der Autor damit sagen will, kann ich mir schon denken, Habe dahingehend auch die zeilen umgeschrieben und erhalte denne via Terminal folgende Meldung.

Code: Alles auswählen

/tmp/ccdGh9Qi.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status


Der code dazu ist dieser

Code: Alles auswählen

int main()
{
return(0);
}


zugegeben auch hier wird mal im dunkeln gelassen linux-Für-Alle
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Möchte C Lernen

Beitrag von Bora4d »

Ich habe früher (>10 Jahre her) in C und C++ Programmiert. Ich sage wenn du Pascal kannst dann kannst du auch C. Die unterschiede sind sehr gering.
Für mich ist C und Pascal sind wie Geschwister wobei C unerzogenes freches Kind ist, dass man ständig von der Polizei abholen muß.

In Internet auch auf Freepascalseiten gibt's Dokumente die unterschiede zwischen Pascal und C zeigen, lies die mal durch dann kannst du vieles sparen.
Die Dokumente sind nicht irgendwelche Lobhymnen von C oder Pascal Fanatikern sondern die zeigen dir Syntaxunterschiede.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Möchte C Lernen

Beitrag von MAC »

so, ich kann zwar kein c aber ich kenn mich da ein bischen aus.
In C gibt es keine Proceduren , nur funktionen - diese müssen immer einen Rückgabe wert haben ( deswegen wurde ja int main() vorgeschlagen. --> int = integer = rückgabewert) Wenn Void davor steht heißt das soviel wie nichts, entspricht also eher einer procedure.

statt dem

Code: Alles auswählen

void main(void)
würde ich eher

Code: Alles auswählen

void main()
schreiben
Wow, man kann hier im Forum sogar C code hervorheben --> bööse :D


return ist sowas wie result.

Zum beispiel aus

Code: Alles auswählen

function a(i:integer):integer;
begin
result := i+1;
end;


wird ungefär sowas (wie gesagt ich kann kein C :) )

Code: Alles auswählen

int einefunktion(i: int) // ka ob doppelpunkt...
{
int  einevariable = 0;
einevaruable = i++;
return einevariable; // einevariable ist also der rückgabewert - ich glabe aber im gegensatzt zu pascal kann man mit reutn nicht wie mit result rechnen... (also man muss den umweg über eine variable machen)
}

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Möchte C Lernen

Beitrag von Maik81ftl »

Bora4d hat geschrieben:Ich habe früher (>10 Jahre her) in C und C++ Programmiert. Ich sage wenn du Pascal kannst dann kannst du auch C. Die unterschiede sind sehr gering.
Für mich ist C und Pascal sind wie Geschwister wobei C unerzogenes freches Kind ist, dass man ständig von der Polizei abholen muß.

In Internet auch auf Freepascalseiten gibt's Dokumente die unterschiede zwischen Pascal und C zeigen, lies die mal durch dann kannst du vieles sparen.
Die Dokumente sind nicht irgendwelche Lobhymnen von C oder Pascal Fanatikern sondern die zeigen dir Syntaxunterschiede.


dessen bin ich mir durchaus bewust, Aber mal ehrlich, wenn man schon ein buch hat "C-Lernen" und das von grund auf macht. denne läst man Pascal in meinem fall aus dem spiel.

MAC hat geschrieben:so, ich kann zwar kein c aber ich kenn mich da ein bischen aus.
In C gibt es keine Proceduren , nur funktionen - diese müssen immer einen Rückgabe wert haben ( deswegen wurde ja int main() vorgeschlagen. --> int = integer = rückgabewert) Wenn Void davor steht heißt das soviel wie nichts, entspricht also eher einer procedure.

statt dem

Code: Alles auswählen

void main(void)
würde ich eher

Code: Alles auswählen

void main()
schreiben
Wow, man kann hier im Forum sogar C code hervorheben --> bööse :D


return ist sowas wie result.

Zum beispiel aus

Code: Alles auswählen

function a(i:integer):integer;
begin
result := i+1;
end;


wird ungefär sowas (wie gesagt ich kann kein C :) )

Code: Alles auswählen

int einefunktion(i: int) // ka ob doppelpunkt...
{
int  einevariable = 0;
einevaruable = i++;
return einevariable; // einevariable ist also der rückgabewert - ich glabe aber im gegensatzt zu pascal kann man mit reutn nicht wie mit result rechnen... (also man muss den umweg über eine variable machen)
}


MAC ich hatte 200 nur 4 wochen a 2x2h C. also ehrlich kann man des unter ulk verbuchen. :D

Ne auf was ich hier überhaupt anspielen will. wenn man das schon alles sch schön schreibt, wie es im Buch steht, und dennoch ein fehler kommt. steht nirgend's, was der fehler zu sagen hat.

OK! ^^ wie ich gerade in einem anderem Forum gelesen halbe g++ statt gcc
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Möchte C Lernen

Beitrag von Keifor »

Maik81ftl hat geschrieben:

Code: Alles auswählen

/tmp/ccdGh9Qi.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status



Google weiß Bescheid. ;)
Sieht so aus als wenn dein "C" Compiler eigentlich ein "C++" Compiler ist (oder jedenfalls versucht hat das ganze als c++ zu verkaufen).

Beispiel:
Das Programm main.c

Code: Alles auswählen

int main( int argc, char *argv[]){
  return(0);
}


Compiled mit "C" (gcc c part)

Code: Alles auswählen

$ gcc -omain main.c
$ ./main


Nun der Trick... umbenennen von main.c in main.cpp

Code: Alles auswählen

$ mv main.c main.cpp
$ gcc -omain main.cpp
/tmp/ccWCyzM0.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0`
collect2: ld gab 1 als Ende-Status zurück
$ g++ -omain main.cpp
$ ./main

gcc geht nicht, das wird als c++ übersetzt und versucht als C zu linken, allerdings werden beim Übersetzen schon Abhängigkeiten für libstdc++ hinzugefügt.
g++ geht weil der linker noch die c++ Abhängigkeiten mitbekommt. Aber das ganze ist nun C++ :mrgreen:

Und nun der Trick.. (Datei umbenennen geht natürlich auch)

Code: Alles auswählen

gcc -x c -omain main.cpp

-x c macht klar das es als C übersetzt werden soll.

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: Möchte C Lernen

Beitrag von Korkenkrone »

MAC hat geschrieben:wird ungefär sowas (wie gesagt ich kann kein C :) )

Code: Alles auswählen

int einefunktion(i: int) // ka ob doppelpunkt...
{
int  einevariable = 0;
einevaruable = i++;
return einevariable; // einevariable ist also der rückgabewert - ich glabe aber im gegensatzt zu pascal kann man mit reutn nicht wie mit result rechnen... (also man muss den umweg über eine variable machen)
}


"return" ist in C keine Variable, sondern eine Anweisung, wie der Name schon andeutet. In Pascal wird "Result" beim Verlassen der Funktion zurückgegeben, in C wird die Funktion mittels "return" verlassen. Der Ausdruck hinter "return" wird zurück gegeben. Die Funktion würde also in C eher so aussehen:

Code: Alles auswählen

int eine_funktion(i: int) {
  return i+1;
}


i++ ist zudem ein Inkrement, wie die Inc- Prozedur in Pascal, wobei man beim "wunderschönen" C natürlich noch ganz dringend beachten muss, dass "i++" ein etwas seltsames Verhalten an den Tag legen kann und sich von "++i", was auch ein Inkrement ist, unterscheidet. Ich mag C nicht...

carli
Beiträge: 660
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Möchte C Lernen

Beitrag von carli »

@Topic: Wie sieht denn dein Compiler-Aufruf aus?
Ansonsten empfehle ich dir einfach, ein "-lstdc++" an ld-Zeile dranzuhängen.


@C:
Ratet mal, was folgender C-Code bewirkt:

Code: Alles auswählen

while(*b++=*a++);

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Möchte C Lernen

Beitrag von MAC »

if (++1 = 2) gibt glaub ich wahr aus weil erst addiert wird und dann geprüft wird und
if (1++ = 2) müsste false ausgeben ...
Die 1 steht da nur weil damit das einfach verständlich ist :)


Ich schätze mal das gibt ne Endlosschleife ???
oder ist * eine Pointer anweisung ???

Ich hab da keihen ahnugn ich hatte bis jetzt insgesammt 4 Stunden C ...

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Möchte C Lernen

Beitrag von Maik81ftl »

Hier scheinen ja einige zu sein, die sich mit C auskennen. :D da kann ich auch gleich mal Forumfremd Frage :D

Habe eine Function, welche eine Zeichenkette zurückübergeben soll.

weiß auch, das void keine rückgabe und int eine Integer rückgabe machen, wie kann ich dem programm nun sagen, das der die Zeichekette zurückgegen soll? wenn ich mich da nun mal net irre mit einem char?!

Die function sehen erste nur zum Test wie folgt aus.

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
 
 
char *Testfkt(const char *sValue)
{
//  int count;
  char *zeichen;
//   for (count=0; count<=7; count++)
//   zeichen[count]==+sValue[count];
  strcpy(zeichen, sValue);   /* hier erhalte ich den Speichzugriffsfehler */
  return(zeichen);
}
 
int main()
{
  char *text;
  strcpy(text, Testfkt("Hallo Otto"));
  printf("Hallo Welt : ---> \n", text);
}


Programm läuft anscheinen auch soweit. nur erhalte ich einen Speicherzugriffsfehler.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: Möchte C Lernen

Beitrag von Korkenkrone »

Du ertsellst mit "char *zeichen;" einen Pointer auf einen char. Der Pointer ist eine Adresse, die auf einen Speicherbereich zeigt. Da du dem Pointer keine Adresse zuweist, versucht er den String "irgendwohin" (undefiniert!) zu kopieren. Das geht auf jeden Fall schief, da du nichtmal einen Speicherbereich angefordert hast, an dem der String zufällig korrekt landen könnte.

Du musst also erst mit malloc() Speicher anfordern, der groß genug ist, den String zu halten.

Da der Speicher beim Verlassen der Funktion nicht wieder freigegeben wird (wäre ja auch doof, dann wäre der string wieder weg), ist er auch nach Verlassen der Funktion noch verfügbar. Weist du den Pointer nicht neu zu, dann hast du ein Speicherleck, da du keinen Zugriff mehr auf den in der Funktion allozierten Speicher hast.

In der Main-Funktion nutzt du also nicht strcpy, sondern weist dem Pointer "text" den Pointer zu, der von der Funktion zurück gegeben wird.

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
 
char *Testfkt(const char *sValue) {
  /* malloc fordert Speicher an und gibt die Adresse des Speichers zurück */
  char *zeichen = malloc(100 * sizeof (char));
 
  /* Jetzt kann der String kopiert werden, da "zeichen" eine Adresse hat, an der
     genügend Speicher reserviert ist. */

  strcpy(zeichen, sValue);
  return zeichen;
}
 
int main() {
  /* Die Adresse an der der in der Funktion reservierte Speicher mit dem kopierten
     String liegt, wird hier deinem Pointer Text zugewiesen. */

  char *text = Testfkt("Hallo Otto");
 
  printf("Hallo Welt : ---> %s\n", text);
  return EXIT_SUCCESS;
}


Wenn du es ganz sauber willst, musst du den Speicher natürlich auch wieder frei geben. Außerdem wäre es eventuell besser keine feste Menge Speicher anzufordern, sondern die, die du brauchst um den String zu halten.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Möchte C Lernen

Beitrag von Maik81ftl »

Korkenkrone hat geschrieben:Du ertsellst mit "char *zeichen;" einen Pointer auf einen char. Der Pointer ist eine Adresse, die auf einen Speicherbereich zeigt. Da du dem Pointer keine Adresse zuweist, versucht er den String "irgendwohin" (undefiniert!) zu kopieren. Das geht auf jeden Fall schief, da du nichtmal einen Speicherbereich angefordert hast, an dem der String zufällig korrekt landen könnte.

Du musst also erst mit malloc() Speicher anfordern, der groß genug ist, den String zu halten.

Da der Speicher beim Verlassen der Funktion nicht wieder freigegeben wird (wäre ja auch doof, dann wäre der string wieder weg), ist er auch nach Verlassen der Funktion noch verfügbar. Weist du den Pointer nicht neu zu, dann hast du ein Speicherleck, da du keinen Zugriff mehr auf den in der Funktion allozierten Speicher hast.

In der Main-Funktion nutzt du also nicht strcpy, sondern weist dem Pointer "text" den Pointer zu, der von der Funktion zurück gegeben wird.

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
 
char *Testfkt(const char *sValue) {
  /* malloc fordert Speicher an und gibt die Adresse des Speichers zurück */
  char *zeichen = malloc(100 * sizeof (char));
 
  /* Jetzt kann der String kopiert werden, da "zeichen" eine Adresse hat, an der
     genügend Speicher reserviert ist. */

  strcpy(zeichen, sValue);
  return zeichen;
}
 
int main() {
  /* Die Adresse an der der in der Funktion reservierte Speicher mit dem kopierten
     String liegt, wird hier deinem Pointer Text zugewiesen. */

  char *text = Testfkt("Hallo Otto");
 
  printf("Hallo Welt : ---> %s\n", text);
  return EXIT_SUCCESS;
}


Wenn du es ganz sauber willst, musst du den Speicher natürlich auch wieder frei geben. Außerdem wäre es eventuell besser keine feste Menge Speicher anzufordern, sondern die, die du brauchst um den String zu halten.


Speicherleak vermeiden??? Suber hinweis! in C versuch ich das gleich durchzusetzen. Wenn ich das Analog zu fpc vermute sicherlich der Befehl free();
Was allersings die Speichergröße angeht, die sollte schon Variabel bleiben, da die const durch eine Externe eingabe ersetzt werden soll.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: Möchte C Lernen

Beitrag von Korkenkrone »

Maik81ftl hat geschrieben:Speicherleak vermeiden??? Suber hinweis! in C versuch ich das gleich durchzusetzen. Wenn ich das Analog zu fpc vermute sicherlich der Befehl free();
Was allersings die Speichergröße angeht, die sollte schon Variabel bleiben, da die const durch eine Externe eingabe ersetzt werden soll.

Das solltest du überall versuchen gleich durchzusetzen. Auch in Pascal! Gewöhne es dir gar nicht erst an, so etwas zu ignorieren. Zum herumprobieren ist es OK, und in dem Fall räumt das Betriebssystem den Speicher schon auf, da der Prozess direkt nach dem letzten Gebrauch von dem angeforderten Speicher beendet wird. Solltest du aber in deinem Buch bei Speicherverwaltung angelangt sein, musst du auf so etwas schon genau achten. Das Gleiche gilt für Pufferüberläufe, die entstehen, wenn "Hallo Otto" auch andere Werte annehmen kann.

Du kannst ja mal versuchen die Funktionen "free" und "strlen" vernünftig einzusetzen, um den Code in diese Richtung zu verbessern. Ein gutes Tool für die Überwachung des Speichers in C ist übrigens Valgrind, das sollte in den Ubuntu Repositories verfügbar sein, wenn du es nicht sogar schon mit irgendwelchen C-Entwicklungspatterns zusammen installiert hast.

carli
Beiträge: 660
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Möchte C Lernen

Beitrag von carli »

Korkenkrone hat geschrieben:Das solltest du überall versuchen gleich durchzusetzen. Auch in Pascal! Gewöhne es dir gar nicht erst an, so etwas zu ignorieren. Zum herumprobieren ist es OK, und in dem Fall räumt das Betriebssystem den Speicher schon auf, da der Prozess direkt nach dem letzten Gebrauch von dem angeforderten Speicher beendet wird. Solltest du aber in deinem Buch bei Speicherverwaltung angelangt sein, musst du auf so etwas schon genau achten. Das Gleiche gilt für Pufferüberläufe, die entstehen, wenn "Hallo Otto" auch andere Werte annehmen kann.


Als wir im Studium C gelernt haben, hat der Tutor ausdrücklich gesagt "Für nicht freigegebenen Speicher gibt es keinen Punktabzug."

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Möchte C Lernen

Beitrag von Maik81ftl »

Korkenkrone hat geschrieben:
Maik81ftl hat geschrieben:Speicherleak vermeiden??? Suber hinweis! in C versuch ich das gleich durchzusetzen. Wenn ich das Analog zu fpc vermute sicherlich der Befehl free();
Was allersings die Speichergröße angeht, die sollte schon Variabel bleiben, da die const durch eine Externe eingabe ersetzt werden soll.

Das solltest du überall versuchen gleich durchzusetzen. Auch in Pascal! Gewöhne es dir gar nicht erst an, so etwas zu ignorieren. Zum herumprobieren ist es OK, und in dem Fall räumt das Betriebssystem den Speicher schon auf, da der Prozess direkt nach dem letzten Gebrauch von dem angeforderten Speicher beendet wird. Solltest du aber in deinem Buch bei Speicherverwaltung angelangt sein, musst du auf so etwas schon genau achten. Das Gleiche gilt für Pufferüberläufe, die entstehen, wenn "Hallo Otto" auch andere Werte annehmen kann.

Du kannst ja mal versuchen die Funktionen "free" und "strlen" vernünftig einzusetzen, um den Code in diese Richtung zu verbessern. Ein gutes Tool für die Überwachung des Speichers in C ist übrigens Valgrind, das sollte in den Ubuntu Repositories verfügbar sein, wenn du es nicht sogar schon mit irgendwelchen C-Entwicklungspatterns zusammen installiert hast.


Danke für den WInk mit der Hauswand :D

carli hat geschrieben:
Korkenkrone hat geschrieben:Das solltest du überall versuchen gleich durchzusetzen. Auch in Pascal! Gewöhne es dir gar nicht erst an, so etwas zu ignorieren. Zum herumprobieren ist es OK, und in dem Fall räumt das Betriebssystem den Speicher schon auf, da der Prozess direkt nach dem letzten Gebrauch von dem angeforderten Speicher beendet wird. Solltest du aber in deinem Buch bei Speicherverwaltung angelangt sein, musst du auf so etwas schon genau achten. Das Gleiche gilt für Pufferüberläufe, die entstehen, wenn "Hallo Otto" auch andere Werte annehmen kann.


Als wir im Studium C gelernt haben, hat der Tutor ausdrücklich gesagt "Für nicht freigegebenen Speicher gibt es keinen Punktabzug."


nur zu doof, das wir damal mit TP angefangen habe. in nachhinnein gesagt vielleicht auch ein fehler von der Berufsschule.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2281
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Möchte C Lernen

Beitrag von m.fuchs »

carli hat geschrieben:Als wir im Studium C gelernt haben, hat der Tutor ausdrücklich gesagt "Für nicht freigegebenen Speicher gibt es keinen Punktabzug."


Ernsthaft? Wenn schon an den Unis kein sauberes Arbeiten gelehrt wird, muss man sich natürlich nicht wundern.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten