hallo,
ich habe ein Programm für ein Wartezimmer, die Funktion um neue Personen
aufzunehmen findet ihr im Bild.
Ich lege einen neuen Pointer (neu) an und reserviere Speicher für die
nächste Struktur.
Dann gebe ich die Infos ein und will diese mit neu->... abspeichern.
Allerdings gibt es hier Probleme!
Bei neu-> age funktioniert das noch, aber bei den anderen beiden kommt
die Fehlermeldung, dass der Ausdruck ein änderbarer ivalue sein muss.
Hoffe ihr könnt mir sagen, was ich ändern muss
Fragant schrieb:> ich habe ein Programm für ein Wartezimmer, die Funktion um neue Personen> aufzunehmen findet ihr im Bild.
das ist schon das Problem. Compiler und auch wir können keine Bilder
parsen und den Inhalt verstehen.
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C>Arrays sind in C keine vollwertigen Datentypen, z. B. ist es nicht>möglich, einem Array in einem Rutsch ein anderes Array zuzuweisen oder 2>Arrays miteinander zu vergleichen. Genau das möchte man aber in der>Stringverarbeitung häufig.
Ja, heilig's Blechle!
Wie doch immer wieder einer auf die Idee kommt, Programm/texte/ als JPG
zu posten?
Ach, ich habs, das sind die ohne C-Buch. Klar. Stirnklatzsch.
Mach Deine Sch... hausaufgaben alleine.
Peter II schrieb:> Compiler und auch wir können keine Bilder> parsen und den Inhalt verstehen.
Also ich kann Text in Bildern schon "parsen". Wobei die Verwendung von
JPG hier total ungeangebracht ist.
Peter II schrieb:> Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie> strcmp.
Ich denke du meinst strcpy. Mit strcmp kann man nichts kopieren oder
zuweisen.
---------------------------------------------------------------
Ok ich weiß jetzt, dass man bei strings nicht einfach -> benutzen kann,
kann mir aber immer noch nicht vorstellen, wie man es dann machen soll.
> ... kann mir aber immer noch nicht vorstellen, wie man es dann machen soll.
Das gibt sich. Einfach immer weiter blättern. Das schwarze Gekräusel
sind die Buchstaben.
1 char für den Namen und 1 char für den Namen der Krankheit? Wie heissen
deine Patienten? 'X' und 'Y'? Und die leiden an 'A' oder 'B'?
Weisst du was wirklich seltsam ist. Da versucht sich wer an dynamischen
Datenstrukturen, konkret verketteten Listen. Das ist ein Thema, das man
ca. nach frühestens einem Dreiviertel Jahr C Programmierung angeht und
keineswegs trivial ist. Und dann scheitert er an Dingen, die er
eigentlich nach 2 Monaten C-Programmierung alle schon beherrschen
sollte.
Fragant schrieb:> Ok ich weiß jetzt, dass man bei strings nicht einfach -> benutzen kann,
Doch, kann man.
Aber = kann man nicht benutzen!
Das eine hat mit dem anderen aber schon sowas von gar nichts zu tun.
Also so wie ich es verstanden habe, wird strcpy benutzt um Stellen von
einem auf den anderen String zu übertragen.
Aber was ich gesucht habe, war wie ich einen string eingeben kann. Und
wie schaffe ich es dann, diesen string in die struktur zu übertragen,
auf die der zeiger neu zeigt.
Fragant schrieb:> Aber was ich gesucht habe, war wie ich einen string eingeben kann. Und> wie schaffe ich es dann, diesen string in die struktur zu übertragen,> auf die der zeiger neu zeigt.
Erst mal musst du einen haben!
Bis jetzt hast du noch keinen String! Bis jetzt hast du nur eine
Variable, die 1 (in Worten: ein) Character aufnehmen kann. 1 Character
ist aber kein String!
1
charname[20];
2
3
scanf("%s",name);
jetzt hast du einen String!
Und denn kann man kopieren. Zb in ein anderes char Array
1
chartmp[20];
2
3
strcpy(tmp,name);
oder in ein char-Array, welches in einem Struktur-Objekt steckt
1
structperson
2
{
3
charname[20];
4
};
5
6
intmain()
7
{
8
structpersonpers;
9
10
...
11
12
strcpy(pers.name,name);
13
...
14
}
oder in ein char-Array, welches in einem Struktur-Objekt steckt, auf das
man lediglich einen Pointer hat
1
structperson*pers;
2
3
pers=malloc(.....
4
...
5
6
strcpy(pers->name,name);
7
...
8
}
Ehrlich. C-Buch. Durcharbeiten. Dringend!
String-Handling ist in C der erste Stolperstein von ca. 986 weiteren,
die noch auf dich warten. Und es ist bei weitem der einfachste zu
verstehen. Gegenüber allen anderen Stolpersteinen ist String-Handling
nur ein müder Abklatsch.
Fragant schrieb:
> Aber was ich gesucht habe, war wie ich einen string eingeben kann.
Die Frage ist, wie sollen die Strings eingegeben werden. Bei Start des
Programmes in der Shell oder zur Laufzeit über die Shell oder über eine
Textbox in einer GUI?
Grundsätzlich würde ich Teilen meiner Vorredner zustimmen, dass Du Dir
bezüglich des Themas 'Strings' einmal ein gutes C-Buch aneignen,
ausleihen und dann ansehen solltest. Das ist alles machbar und nur halb
so wild, vorausgesetzt Du hast die Lust und den Willen einige, wenige
Seiten zu lesen.
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/
Das ist gut, umsonst und sollte alle Deine Problemstellungen in Kürze
lösen können.
Matthias schrieb:> Klaus schrieb:>>> Welchen Teilen? Nicht meinem Arsch!>> Genau diesem Teil nicht. Man muss sich nicht wie ein Rotz am Ärmel> benehmen.
Muss man nicht. Aber es macht Spaß und solange jigdo noch vor sich
hinwerkelt ist diese Maschine ohnehin für alles andere unbrauchbar.
Aber ich nehme zur Kenntnis, dass Dir meine Art nicht gefällt.
Danke für eure Hilfe, hatten strings überhaupt nicht als thema und werde
es mir deshalb demnächst mal in Ruhe anschauen.
Brauche aber nochmals eure Hilfe.
------------------------------------------------------------
------------------------------------------------------------
Bei der Ausgabe kommt folgende
Fehlermeldung:
Zugriffsverletzung, Fehler beim Lesen der Zeichen der Zeichenfolge.
Könnt ihr einen Fehler erkennen?
Fragant schrieb:> Könnt ihr einen Fehler erkennen?
Unvollständiger Copypaste. Von der Funktion "einlesen" fehlt die
schließende Klammer.
Icb bin mir ziemlich sicher, dass das nicht der einzige Unterschied
zwischen dem, was du testest, und dem, was du uns zeigst, ist.
> Bei der Ausgabe kommt folgende> Fehlermeldung:> Zugriffsverletzung, Fehler beim Lesen der Zeichen der Zeichenfolge.
Ansonsten: beim Einlesen initialisierst du "next" nicht. Das muss
demnach nicht zwingend NULL sein. malloc garantiert dir keinen mit
Nullen initialisierten Speicher.
> strcpy(neu-> illness, krankheit_neu);
Soll das so sein?
Ich würde Dir den Einsatz eines Debuggers, wahlweise GDB empfehlen.
Starte gdb mit dem Executable, setze mit 'break main' einen Breakpunkt,
starte das Ganze mit 'run' und gehe Zeile für Zeile durch den Code.
Solltest Du hier Hilfe benötigen, findest Du eine kurze Referenz über
'man gdb' in der Shell.
Beim einlesen von einem String, kommt kein & beim scanf hin.
Der Name vom Array ergibt schon die Adresse vom ersten Element.
name_neu ist gleich &name_neu[0]
Beide sind vom Typ char*.
Bedenke abei, dass scanf bei %s Whitespace als Trennzeichen nimmt und
somit das Einlesen abbricht. Auch wäre eine Längenbegrenzung besser: