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 :)
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..
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
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.
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
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
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?
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
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
voidausgabe();
10
11
intmain()
12
{
13
intc;
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"
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
case1:strcpy(steakwahl,"T-bone");
50
// steakwahl[6]='\0';
51
break;
52
case2:strcpy(steakwahl,"Sirloin");
53
// steakwahl[7]='\0';
54
break;
55
case3: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
returnsteakwahl;
64
65
66
67
}
68
69
char*Garung()
70
{
71
inteingabe;
72
staticchargarwahl[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
case1:strcpy(garwahl,"rare");
81
// garwahl[4]='\0';
82
break;
83
case2:strcpy(garwahl,"medium rare");
84
//garwahl[11]='\0';
85
break;
86
case3: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
returngarwahl;
94
95
}
96
97
char*Belage()
98
{
99
inteingabe,Erdaepfel,sauce;
100
staticcharbelwahl[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
case1:strcpy(belwahl,"Brot");
109
belwahl[4]='\0';
110
break;
111
case2: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)\? ");
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.
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
>elseprintf("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
>
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.
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.
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.
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...
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
intfoo()
2
{
3
return5;
4
}
5
6
intmain()
7
{
8
intj;
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!
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.
;-)))
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
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
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!
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!)
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?
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.
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.
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
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.
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
> 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.
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.
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).
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
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.
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 ?
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!
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.
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 ...