Forum: PC-Programmierung [C] String an main übergeben


von Mücahit (Gast)


Lesenswert?

Hallo,
ich haette eine kleine Frage und zwar habe ich versucht eine 
Zeichenkette vom UP ans HP zu übergeben aber irgendwie hat es nicht 
funktioniert. Ich hoffe ihr helft mir da weiter.

Zum Beispiel:

int main()
{
  printf(" %s ", UP() ) ;
}

char UP()
{
  char string[10];

  strcpy(string, "Hallo");

  return string[10];
}

Habe irgendwo gelesen, dass ich es mit Zeigern machen sollte, wenn ich 
mich nicht irre oder sollte es eigentlich auch so gehen?

Und wenn es nur mittel Zeigern geht, wie genau soll ich eine 
Zeichenkette als String deklarieren kenne mich leider noch nicht so gut 
aus.

Danke :)

von Mücahit (Gast)


Lesenswert?

Mücahit schrieb:
> Und wenn es nur mittel Zeigern geht, wie genau soll ich eine
> Zeichenkette als String deklarieren kenne mich leider noch nicht so gut
> aus.

Ich meinte natuerlich als Zeiger deklarieren..

von MAD (Gast)


Lesenswert?

Dir direkt eine fertig Lösung zu Deiner Frage zu geben ist aus meiner 
Sicht nicht gut.
Du sollest dich mal etwas näher mit der Sprache C befassen. Schau mal 
nach dem Buch von K&R oder für den schnellen Einstieg "C für Dummies", 
das heisst wirklich so und soll keine Beleidigung sein.

MAD

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MAD schrieb:
> Dir direkt eine fertig Lösung zu Deiner Frage zu geben ist aus meiner
> Sicht nicht gut.

Das hast Du schön zurückhaltend formuliert. Und, ja, Du hast recht.

"Mücahit" sollte wirklich jetzt sofort ein C-Buch lesen. Wenigstens den 
Anfang, die ersten paar Kapitel ...

So unverständlich und schlecht ist der K&R von 1989 gar nicht.

von Hank P. (hp67)


Lesenswert?

1
#include <stdio.h>
2
#include <string.h>
3
4
char *UP()
5
{
6
        static char string[10]="Hallo"; /* static, sonst geht es nach Funktionsaufruf verloren */
7
        return string;
8
}
9
10
int main()
11
{
12
          printf(" %s ", UP() ) ;
13
}

von Mücahit (Gast)


Lesenswert?

Koennt ihr mir Tipps geben zumindest einen Lösungsweg wie man Strings 
übergibt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das war keine gute Idee.

Meinst Du, "Mücahit" hat damit verstanden, was seine diversen Probleme 
sind?

von Mücahit (Gast)


Lesenswert?

Ok danke werde es mit dem versuchen schaut gut aus.. Ich versuche C zu 
lernen und habe auch einiges darüber gelesen aber so mit Zeigern bin ich 
noch nicht so gut vertraut aber werde mich hoffentlich verbessern. Danke

von Mücahit (Gast)


Lesenswert?

Ich denke, dass ich es verstanden habe ich muss einfach die Adresse der 
Zeichenkette übergeben im VERgleich zu einer Zahl kann man anscheined es 
nicht einfach so übergeben

von F. F. (foldi)


Lesenswert?

Sehr gut und verständlich geschriebenes C-Buch.
http://www.amazon.de/gp/product/3499600749/ref=oh_details_o02_s01_i00?ie=UTF8&psc=1

Mein K&R konnte jemand wohl besser gebrauchen.
Irgendwie muss wohl doch wieder die "Verleihnix Datenbank" aktiviert 
werden.
Keiner bringt was wieder.

von Stefan R. (srand)


Lesenswert?

Mücahit schrieb:
> Ich denke, dass ich es verstanden habe ich muss einfach die Adresse der
> Zeichenkette übergeben

Hast du verstanden, wofür das static ist? Ist es wichtig? Geht es auch 
ohne? Wenn es auch ohne geht, ist es ohne auch richtig?

von Mücahit (Gast)


Lesenswert?

Ich habe ein also Programm geschrieben und es funktioniert auch fast, 
jedoch wenn ich dann im HP die Strings ausgebe:

printf("Ihre Bestellung:   %s,   %s,   %s...", steak(), Garung(), 
Belage() );

dann gibt er mir nicht nur die Strings, die ich übergebe aus sondern 
durchläuft die Unterprogramme ein zweites mal. Woran koennte es liegen 
kann mir da jemand helfen? Danke

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Mücahit schrieb:
> Woran koennte es liegen
> kann mir da jemand helfen? Danke

solange du nicht das ganze Programm postest, ist das alles rum-unkerei.

von Karl H. (kbuchegg)


Lesenswert?

http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C#Wie_schreibt_man_eine_Funktion.2C_die_einen_String_liefert.3F

Wie schon gesagt: Du BRAUCHST Literatur!

Ja, in C stößt man schnell in Bereiche vor, die man mit 20% Halbwissen, 
die man sich auf diversen Webseiten und Foren zusammenschnorrt, nicht 
mehr vernünftig mit Try and Error lernen kann.

Daher: Buch durcharbeiten!

von Mücahit (Gast)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Mücahit schrieb:
>> Woran koennte es liegen
>> kann mir da jemand helfen? Danke
>
> solange du nicht das ganze Programm postest, ist das alles rum-unkerei.

Das ist also mein Programm und bei der Ausgabe werden die Strings die 
ich übergebe nicht einfach ausgegeben sondern nochmal durchlaufen.. 
verstehe ich nicht:
1
# include <stdio.h>
2
# include <conio.h>
3
# include <ctype.h>
4
# include <string.h>
5
6
char *steak();
7
char *Garung();
8
char *Belage();
9
void ausgabe();
10
11
int main()
12
{
13
  int c;
14
  printf("Guten Tag, was haetten Sie gerne zum Essen\? \nWenn Sie moechten kann ich Ihnen alles aufzaehlen (betaetigen Sie \"j\") "
15
       "und wenn Sie schon informiert sind, was es heute gibt, dann betaetigen Sie ein anderes Zeichen:\n");
16
  c=getchar();
17
  toupper(c);
18
  if(c=='j')
19
  {
20
    printf("\nVerfuegbare Steaks: \nT-bone\nSirloin steak\nRib eye\n\nDie verschiedenen Garungszustände sind:\nrare\nmedium rare\nwell done\n\nAls Beilagen gibt es:\nBrot\nErdaepfel\n\tPommes Frites"
21
        "\n\tWedges\n\tgebacken\nmit Knoblauchsauce\nmit French-Dressing\nmit Butter");
22
  }
23
  else printf("Ok gut, dass Sie es wissen\n");
24
25
26
  
27
  steak();
28
  Garung();
29
  Belage();
30
31
  ausgabe();
32
  
33
34
  getch();
35
  return 0;
36
}
37
38
char *steak()
39
{
40
  int eingabe;
41
  static char steakwahl[10];
42
43
  printf("Waehlen Sie bitte den Steak: \n1. T-bone\n2. Sirloin\n3. Rib eye\n");
44
45
  scanf("%d", &eingabe);
46
47
  switch (eingabe)
48
  {
49
  case 1: strcpy(steakwahl,"T-bone");
50
    //  steakwahl[6]='\0';
51
      break;
52
  case 2: strcpy(steakwahl,"Sirloin");
53
    //  steakwahl[7]='\0';
54
      break;
55
  case 3: strcpy(steakwahl,"Rib-eye");
56
    //  steakwahl[7]='\0';
57
      break;
58
  default: printf("Falsche Eingabe");
59
    
60
  }
61
  printf("Sie haben %s gewaehlt", steakwahl);
62
63
  return steakwahl;
64
65
  
66
67
}
68
69
char *Garung()
70
{
71
  int eingabe;
72
  static char garwahl[12];
73
74
  printf("\n\nWaehlen Sie bitte den Garungszustand: \n1. rare\n2. medium rare\n3. well done\n");
75
76
  scanf("%d", &eingabe);
77
78
  switch (eingabe)
79
  {
80
  case 1: strcpy(garwahl,"rare");
81
    //  garwahl[4]='\0';
82
      break;
83
  case 2: strcpy(garwahl,"medium rare");
84
      //garwahl[11]='\0';
85
      break;
86
  case 3: strcpy(garwahl,"well done");
87
    //  garwahl[9]='\0';
88
      break;
89
  default: printf("Falsche Eingabe");
90
    
91
  }
92
  printf("Sie haben %s gewaehlt", garwahl);
93
  return garwahl;
94
95
}
96
97
char *Belage()
98
{
99
  int eingabe, Erdaepfel, sauce;
100
  static char belwahl[35];
101
102
  printf("\n\nWaehlen Sie bitte die Beilage: \n1. Brot\n2. Erdaepfel\n \tPommes(1), Wedges(2)\n\tsauce: Knoblauchsauce(1)\nFrench-Dressing(2)\nButter(3)");
103
104
  scanf("%d", &eingabe);
105
106
  switch (eingabe)
107
  {
108
  case 1: strcpy(belwahl,"Brot");
109
      belwahl[4]='\0';
110
      break;
111
  case 2: strcpy(belwahl,"Erdaepfel");
112
      
113
      printf("\n Pommes (1) oder Wedges(2)\? ");
114
        scanf("%d", &Erdaepfel);
115
        if(Erdaepfel==1)
116
          strcat(belwahl, "-Pommes");
117
        else
118
          strcat(belwahl, "-Wedges");
119
120
        printf("Welche Sauce\? Knoblauchsauce(1), French-Dressing(2) oder einfach mit Butter(3)\? ");
121
        scanf("%d", &sauce);
122
        if(sauce==1)
123
        {
124
          strcat(belwahl, "-Knoblauchsauce");
125
          //belwahl[11]='\0';
126
        }
127
        else if (sauce==2)
128
        {
129
          strcat(belwahl, "-French-Dressing");
130
          //belwahl[11]='\0';
131
        }
132
        else if(sauce==3)
133
        {
134
          strcat(belwahl, "-Butter");
135
          //belwahl[11]='\0';
136
        }
137
        
138
      break;
139
140
141
  default: printf("Falsche Eingabe");
142
  
143
    
144
  }
145
146
  printf(" %s gewaehlt\n", belwahl);
147
148
  return belwahl;
149
150
}
151
152
void ausgabe()
153
{
154
    printf("Ihre Bestellung:   %s,   %s,   %s...", steak(), Garung(), Belage() );
155
}

von Oberlehrer (Gast)


Lesenswert?

Mücahit schrieb:
> bei der Ausgabe werden die Strings die
> ich übergebe nicht einfach ausgegeben sondern nochmal durchlaufen.

Du rufst die Funktionen (z. B. steak()) auch zweimal auf:
1. in main ()
2. in ausgabe ()

Ergo werden sie zweimal durchlaufen. Alles Ok, alles wie programmiert.

von Karl H. (kbuchegg)


Lesenswert?

Mücahit schrieb:

> Das ist also mein Programm und bei der Ausgabe werden die Strings die
> ich übergebe nicht einfach ausgegeben sondern nochmal durchlaufen..
> verstehe ich nicht:

Dann geh dein Programm mit dem Debugger in Einzelschritten durch.

Hier
>
1
> ...
2
>   else printf("Ok gut, dass Sie es wissen\n");
3
> 
4
> 
5
> 
6
>   steak();
7
>   Garung();
8
>   Belage();
9
> ...

werden die Funtkionen aufgerufen und gehen ihre Logik durch.
Und hier

>
1
> ...
2
>   ausgabe();
3
> ...

und damit in weiterer Folge hier
>
1
>
2
> void ausgabe()
3
> {
4
>     printf("Ihre Bestellung:   %s,   %s,   %s...", steak(), Garung(), 
5
> Belage() );
6
> }
7
>

gleich nochmal.
Die Funktionen steak(), ... machen eben nicht NUR die Ausgabe, sondern 
auch die entsprechenden Abfragen. Und daher siehst du die alle doppelt. 
Denn die Funktionen werden ja 2 mal aufgerufen.

Freunde dich mit deinem Debugger an. Du wirst ihn noch lieben lernen.

von Jörg E. (jackfritt)


Lesenswert?

Vielleicht wird es ja ein 2 mal durchlaufen weil das Steak noch nicht 
gar ist und die Beilagen fehlen? ;)

Wo ist der Programmcode?

von Jörg E. (jackfritt)


Lesenswert?

Ups zu langsam ;)

von Mücahit (Gast)


Lesenswert?

Und wie kann ich NUR die übergebebnen Strings ausgebenohne sie nochmal 
zu durchlaufen?
Danke

von Mücahit (Gast)


Lesenswert?

Jörg Esser schrieb:
> Vielleicht wird es ja ein 2 mal durchlaufen weil das Steak noch nicht
> gar ist und die Beilagen fehlen? ;)

jaa genau haha :D

von Oberlehrer (Gast)


Lesenswert?

Mücahit schrieb:
> Und wie kann ich NUR die übergebebnen Strings ausgebenohne sie nochmal
> zu durchlaufen?

Du musst die strings zur Verwendung speichern. Oder du übergibst strings 
per parameter und lässt sie in steak() und Co. füllen.

von Karl H. (kbuchegg)


Lesenswert?

Mücahit schrieb:
> Und wie kann ich NUR die übergebebnen Strings ausgebenohne sie nochmal
> zu durchlaufen?
> Danke

Indem du dir klar machst, dass du 2 Teilaufgaben hast:
* Bestimmen der notwendigen Strings
* Ausgaben der Strings

Und diese beiden Teilaufgaben werden voneinander getrennt. Aufgabe der 
Funktion steak() ist es NICHT, sich um die Ausgabe zu kümmern. Die soll 
feststellen was der Benutzer will. DIe Funktion liefert dieses Ergebnis, 
welches sich der Aufrufer merken muss.
Der Aufrufer gibt dann dieses gemerkte an die Ausgabe weiter, welche 
dann die Ausgabe durchführt. Dazu braucht aber keiner mehr die Funktion 
steak(), denn die ist ja für die Ausgabe nicht zuständig.

Wenn dir das nicht klar ist, dann bist du in deinem Lerntempo zu schnell 
vor gegangen. Geh noch mal ein paar Stufen zurück und kauf dir ein 
C-Lehrbuch, welches dir systematisch auch grundlegende 
Programmstrukturen beibringt.

Und: Dir schwant vielleicht schon, warum man derartige Dinge selten 
dadurch macht, dass man Strings durch die einzelnen Funktionen schiebt, 
sondern indem man für alles Codezahlen vereinbart.
Die Funktion für die Beilage liefert zb die Codezahl 5 (einen int) wenn 
der Benutzer Kartoffeln ausgewählt hat, und erst die Funktion für die 
Ausgabe schreibt dann anhand der 5 den Text "Wedges" auf die Anzeige.

von Mücahit (Gast)


Lesenswert?

Oberlehrer schrieb:
> Du musst die strings zur Verwendung speichern.

Was meinst du genau mit zur Verwendung speichern?

Es hat doch vorher immer ganz leicht funktioniert wenn jz ein UP einfach 
was gerechnet hat und ich mit zb printf("%d", adiieren()); ausgegeben 
habe, hat er das UP nicht nochmal durchlaufen irgendwie verstehe ich 
nicht warum er das hier so macht...

von Karl H. (kbuchegg)


Lesenswert?

Mücahit schrieb:
> Oberlehrer schrieb:
>> Du musst die strings zur Verwendung speichern.
>
> Was meinst du genau mit zur Verwendung speichern?

Na speichern eben!

Eine Variable anlegen und die kriegt einen Wert!
1
int foo()
2
{
3
  return 5;
4
}
5
6
int main()
7
{
8
  int j;
9
10
  j = foo();   // Das Ergebnis, welches foo liefert, wird in j gespeichert.
11
12
  printf( "%d\n", j );
13
}


> Es hat doch vorher immer ganz leicht funktioniert

Tu dir selbst einen Gefallen, kauf dir ein C-Buch und fang von vorne an 
das durchzuarbeiten. Mit deinem 5% Wissen kommst du nicht weit. Man 
merkt, dass dir hinten und vorne fast alles an Wissen fehlt und dein 
Denkmodell komplett daneben ist.

>  irgendwie verstehe ich nicht warum er das hier so macht...

In Kurzform: Weil das genau das ist, was du programmiert hast!

von Oberlehrer (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und: Dir schwant vielleicht schon, warum man derartige Dinge selten
> dadurch macht, dass man Strings durch die einzelnen Funktionen schiebt,
> sondern indem man für alles Codezahlen vereinbart.
> Die Funktion für die Beilage liefert zb die Codezahl 5 (einen int) wenn
> der Benutzer Kartoffeln ausgewählt hat, und erst die Funktion für die
> Ausgabe schreibt dann anhand der 5 den Text "Wedges" auf die Anzeige.

Das kommt darauf an! Hier könnte wahlfreier Text zur Anzeige gebracht 
werden. Deine Variante wird genutzt, wenn die Eingabemenege begrenzt ist 
und nur eine Auswahl darstellt. Was aber i. d. R. so ist.
;-)))

von Mücahit (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> int foo()
> {
>   return 5;
> }
>
> int main()
> {
>   int j;
>
>   j = foo();   // Das Ergebnis, welches foo liefert, wird in j
> gespeichert.
>
>   printf( "%d\n", j );
> }

Gut, danke jz funktionierts, jedoch verstehe ich trotzdem nicht ganz 
warum die UP nochmal durchlaufen wurden und nicht ganz normal ausgegeben 
wurden.
void ausgabe()
{
  char *steak1, *garung, *beilage;
  steak1=steak();
  garung=Garung();
  beilage=Belage();

    printf("Ihre Bestellung:   %s,   %s,   %s...", steak1, garung, 
beilage);
}


Aber danke

von Karl H. (kbuchegg)


Lesenswert?

Mücahit schrieb:

> Gut, danke jz funktionierts, jedoch verstehe ich trotzdem nicht ganz
> warum die UP nochmal durchlaufen wurden

Weil du sie 2 mal aufrufst!

Du hast einen Aufruf in main() UND du hast einen Aufruf in ausgabe().

Ich versteh im Gegenzug nicht, was es daran  nicht zu verstehen gibt! 2 
Aufrufe der Funktion, daher wird die Funktion auch 2 mal abgearbeitet!

> void ausgabe()
> {
>   char *steak1, *garung, *beilage;
>   steak1=steak();
>   garung=Garung();
>   beilage=Belage();
>
>     printf("Ihre Bestellung:   %s,   %s,   %s...", steak1, garung,
> beilage);
> }

keine gute Lösung.
Sieh dir noch mal den Link an
http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C#Wie_schreibt_man_eine_Funktion.2C_die_einen_String_liefert.3F

von Karl H. (kbuchegg)


Lesenswert?

Du scheinst irgendwie zu denken, dass eine Funktion nur einmal 
abgearbeitet wird, wenn man sie aufruft und danach greift man immer 
wieder nur auf das Ergebnis der Funktion zu.
Dem ist nicht so!

Wird eine Funktion aufgerufen, dann wird sie auch abgearbeitet.
Hast du einen Aufruf in main() und einen Aufruf in ausgabe(), dann wird 
die Funktion auch 2 mal abgearbeitet und führt den Code in ihr bei jedem 
Aufruf erneut aus. Und das ist auch gut so!

von Mücahit (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> void ausgabe()
>> {
>>   char *steak1, *garung, *beilage;
>>   steak1=steak();
>>   garung=Garung();
>>   beilage=Belage();
>>
>>     printf("Ihre Bestellung:   %s,   %s,   %s...", steak1, garung,
>> beilage);
>> }
>
> keine gute Lösung.

Wieso keine gute Läsung?
   char* meinezeile1;
   char* meinezeile2;

   meinezeile1 = uart_get_line();
   printf( "gelesen1: %s", meinezeile1 ); // gibte erste Zeile aus
   meinezeile2 = uart_get_line();
   printf( "gelesen2: %s", meinezeile2 ); // gibte zweite Zeile aus

Der macht das ja auch so...

von Karl H. (kbuchegg)


Lesenswert?

Mücahit schrieb:
>
> Der macht das ja auch so...

Hast du auch die Texte dazu gelesen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mücahit schrieb:
> Der macht das ja auch so...

Und das ist auch bei ihm ein Griff ins Klo. Was meinst Du wohl, was 
"meinezeile1" nach dem zweiten Aufruf von uart_get_line enthält?

Aufgabe für Dich:

Probier mal das hier aus:
1
   char* meinezeile1;
2
   char* meinezeile2;
3
4
   meinezeile1 = uart_get_line();
5
   meinezeile2 = uart_get_line();
6
   printf( "gelesen1: %s", meinezeile1 ); // gibte erste Zeile aus
7
   printf( "gelesen2: %s", meinezeile2 ); // gibte zweite Zeile aus
Ich habe hier nur zwei Zeilen untereinander vertauscht. Mehr nicht.

Was passiert?

Und ... warum passiert das?


(An alle anderen: Diese Fragen muss "Mücahit" selbst beantworten. Keine 
Hilfestellung geben!)

von Stefan R. (srand)


Lesenswert?

Rufus Τ. Firefly schrieb:
> An alle anderen: Diese Fragen muss "Mücahit" selbst beantworten. Keine
> Hilfestellung geben!

Er hat ja schon meine Fragen zu static ignoriert. Warum glaubst du, daß 
er etwas lernen will?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan Rand schrieb:
> Warum glaubst du, daß er etwas lernen will?

Das ist eine etwas boshafte Fragestellung, meinst Du nicht?

von Stefan R. (srand)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Stefan Rand schrieb:
>> Warum glaubst du, daß er etwas lernen will?
>
> Das ist eine etwas boshafte Fragestellung, meinst Du nicht?

Ja, ist es.

Aber gerechtfertigt, nachdem er meinen Versuch, ihm die Problematik der 
Rückgabe einer lokalen Variablen zu erklären, ignoriert hat.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ohne ihn verteidigen zu wollen (nichts läge mir ferner), glaube ich, daß 
Deine Frage ihn schlichtweg komplett überfordert hat. Ihm fehlen so 
grundlegende Dinge, daß er mit Deiner Frage recht sicher nichts 
anfangen kann.

Wäre es mein Job, Leuten Dinge beizubringen, ich hätt' guten Grund für 
Depressionen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Stefan Rand schrieb:
> ihm die Problematik der
> Rückgabe einer lokalen Variablen zu erklären, ignoriert hat.

vielleicht hat er auch (noch) gar nicht verstanden, worauf du hinaus 
wolltest

von Stefan R. (srand)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> vielleicht hat er auch (noch) gar nicht verstanden, worauf du hinaus
> wolltest

Davon gehe ich aus. Deswegen die Reihe von Fragen.

Er hätte auch gleich die erste mit "nein" beantworten können, dann hätte 
man ihm dazu was erklären können und die zweite Frage wiederholen. 
Undsoweiter.

Aber es kam - gar nichts.


Warum erwartet also irgendjemand, daß auf eine andere Frage was kommen 
könnte.

von Mücahit (Gast)


Lesenswert?

Es tud mir leid, dass ich nicht geantwortet habe, hab nämlich jetzt erst 
nachgeschaut wieder und mein Studium hat heute begonnen und ich hoffe, 
dass ich nach der Zeit alles besser begreifen werde.. brauche nur 
bisschen Zeit aber ich glaube es kommt alles mit der Zeit :)
Danke an alle

von Karl H. (kbuchegg)


Lesenswert?

> nachgeschaut wieder und mein Studium hat heute begonnen und ich hoffe,
> dass ich nach der Zeit alles besser begreifen werde.. brauche nur
> bisschen Zeit aber ich glaube es kommt alles mit der Zeit :)

Du brauchst vor allen Dingen ein Buch!
Eines, das du durcharbeiten kannst. Und zwar von vorne! Und welches 
Lernbeispiele und Übungen am Ende jedes Kapitels hat.

Mit anlassbezogenem Erfragen von 1/8 Wissen in Foren hat noch nie jemand 
ordentlich C gelernt. Zumindest kenn ich keinen. Dafür gibt es in C zu 
viele Fallen.

von Mücahit (Gast)


Lesenswert?

Ja, du hast recht..
Welches Buch könntest du mir zum Beispiel empfehlen?

von cppler (Gast)


Lesenswert?

Nimm den Stroustrup und lerne C++, C lernst Du dabei automatisch mit.
Es reicht auch erstmal wenn Du im WWW die vielen C und C++ Tutorials 
durchgehst, da gibt es auch viele mit Aufgaben am Ende.
Reines C würde ich heute niemandem mehr empfehlen auch nicht für µCs.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

cppler schrieb:
> Es reicht auch erstmal wenn Du im WWW die vielen C und C++ Tutorials
> durchgehst, da gibt es auch viele mit Aufgaben am Ende.

Nein. Das ist gar keine gute Idee.

> Reines C würde ich heute niemandem mehr empfehlen auch nicht für µCs.

Auch das sehe ich anders. Der K&R (2. Ausgabe) ist trotz seines hohen 
Alters nach wie vor empfehlenswert, weil er mit einem Bruchteil des 
Umfanges des Stroustrup auskommt und trotzdem die Sprache vollständig 
beschreibt (mit der Einschränkung, nichts neueres als C90 zu kennen, 
aber das ist für den Anfang wirklich nicht relevant).

von cppler (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Auch das sehe ich anders. Der K&R (2. Ausgabe) ist trotz seines hohen
> Alters nach wie vor empfehlenswert, weil er mit einem Bruchteil des
> Umfanges des Stroustrup auskommt und trotzdem die Sprache vollständig
> beschreibt (mit der Einschränkung, nichts neueres als C90 zu kennen,
> aber das ist für den Anfang wirklich nicht relevant).

Damit lernt er aber kein OO und schaue Dir doch bitte mal die Tutorials 
zu C++ im Netz an da gibt es sehr viele sehr ausführliche und gute.
Mir scheint eher das Du C++ "verteufelst" was ich nicht verstehen kann ?
Ihr könnt ja z.B. mal hier vorbei schauen:

http://www.c-plusplus.de/cms/index.php

Und da könnte man dann diese Tutorials durcharbeiten:

http://www.c-plusplus.de/cms/modules.php?op=modload&name=Downloads&file=index&req=viewsdownload&sid=2

Viel Spaß :-P

von pst (Gast)


Lesenswert?

cppler schrieb:
> Mir scheint eher das Du C++ "verteufelst" was ich nicht verstehen kann ?

Ich bin selbst ueberzeugter C++-Mikrocontroller-Entwickler und ich kann 
bei seinem Statement ueberhaupt nichts erkennen, was gegen C++ waere. Im 
Gegenteil, er hat voellig Recht - der beste Weg zu C++ geht ueber C.

von cppler (Gast)


Lesenswert?

pst schrieb:
> der beste Weg zu C++ geht ueber C.

Nein, dann bekommst Du massive Probleme Dich in OO einzuarbeiten.
Ich kenne mehr als genügend Leute die OO und damit das Konzept hinter 
C++ nicht verstanden haben und statt objektorientiert an Probleme 
heranzugehen das ganze mit prozeduralen Prototypen erschlagen wollen 
ohne die Vorzüge der Vererbung, Templates und Standardbibliotheken 
überhaupt zu erkennen.
Kannst Du denn OO und hat sich jemand die Tutorials im Web überhaupt mal 
angesehen ?

von F. F. (foldi)


Lesenswert?

Ich wollte ursprünglich mit C++ beginnen und hab dann auf die 
Empfehlungen hier gehört doch besser erstmal C zu lernen.
Was mir einleuchtete war, dass die meisten Programme in C geschrieben 
wurden, die auf einen µC laufen.
Macht doch nichts, dann stehen die tausend Seiten noch eine Weile im 
Schrank.
Dran kommen sie auf jeden Fall.
Aber ich muss sagen, schon bei den ersten Seiten des Buches musste ich 
feststellen, dass mir C++ sehr zu liegen scheint, denn alles war so klar 
und logisch für mich. Aber vielleicht liegt es auch nur am guten Buch!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

cppler schrieb:
> Damit lernt er aber kein OO

Bevor ein Kind zu laufen anfängt, krabbelt es. Und um überhaupt zu 
begreifen, warum und wozu objektorientierte Programmierung verwendet 
wird, ist es sehr hilfsreich, überhaupt irgendetwas programmieren zu 
können.

> und schaue Dir doch bitte mal die Tutorials
> zu C++ im Netz an da gibt es sehr viele sehr ausführliche und gute.

Ich halte nichts von Tutorials im Netz. Die bringen nur 
Oberflächlichkeit, und woran erkennt jemand, der sich mit einer Materie 
überhaupt nicht auskennt, ob ein Tutorial tatsächlich gut ist?

> Mir scheint eher das Du C++ "verteufelst" was ich nicht verstehen kann ?

Das läge mir fern. Ich verdiene seit über 20 Jahren meinen 
Lebensunterhalt mit C und C++. Ja, auch jetzt noch mit C.

cppler schrieb:
> Nein, dann bekommst Du massive Probleme Dich in OO einzuarbeiten.

Das halte ich für einen Irrglauben. Nein, ich halte es sogar für sehr 
sinnvoll, vor OO-Ansätzen erst mal mit einfachem C zu arbeiten. Dann 
nämlich kann man die "Kosten" eines Funktionsaufrufs, die "Kosten" einer 
Zuweisung oder des Gebrauchs eines Operators eher begreifen lernen.

Wann werden wo wieviele Daten durch die Gegend kopiert, wie lange ist 
ein Objekt (auch im nicht-objektorientierten Sinne) sichtbar etc.

Zu begreifen, was ein Pointer ist, ist auch nicht wirklich schlecht.

von cppler (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das halte ich für einen Irrglauben. Nein, ich halte es sogar für sehr
> sinnvoll, vor OO-Ansätzen erst mal mit einfachem C zu arbeiten. Dann
> nämlich kann man die "Kosten" eines Funktionsaufrufs, die "Kosten" einer
> Zuweisung oder des Gebrauchs eines Operators eher begreifen lernen.


Wir sind hier bei PC-Programmierung da spielen "Kosten" keine große 
Rolle heutzutage.
Von prozeduralen Ansätzen auf objektorientierte umzusteigen ist schwer, 
denn man lernt eben KEINE Kapselung und macht das jeweils zu Fuß OHNE 
das man vorhandenen Code vererben und Funktionen überschreiben könnte, 
die Konstrukte die dann folgen sind meistens schwer wartbar.
Und in C kann man keinen Operator überladen um z.B. + eine komplexe Zahl 
addieren zu lassen.
Wenn es um die Grundlagen geht kann man auch BASIC nehmen, da ist dann 
die Syntax anders als in C oder PASCAL oder EIFFEL oder ...
Es gibt sehr viele Programmiersprachen von denen einige sehr speziell 
sind aber die meisten haben immer eines gemeinsam.
Und OO macht meiner Meinung nach am meisten Sinn.

Rufus Τ. Firefly schrieb:
> Ich halte nichts von Tutorials im Netz. Die bringen nur
> Oberflächlichkeit, und woran erkennt jemand, der sich mit einer Materie
> überhaupt nicht auskennt, ob ein Tutorial tatsächlich gut ist?

Dann hast Du nicht den Link den ich angegeben habe verfolgt und 
verifiziert.
Und wenn jemand sich nicht auskennt kann derjenige in diversen Foren 
nachfragen respektive ausprobieren wann der Compiler meckert und solange 
herumprobieren bis es paßt.
Dabei lernt man zwar nicht sinnvolle Programmierung, weiß danach aber 
wann der Compiler meckert und kann danach gezielt fragen.

Und damit beende ich die Diskussion um den Sinn OO vs. C ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.