Forum: PC-Programmierung Probleme bei Programm! Verkettete Listen


von Fragant (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

Fragant schrieb:
> Hoffe ihr könnt mir sagen, was ich ändern muss

Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie 
strcmp.

von Klaus (Gast)


Lesenswert?

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.

von Walter S. (avatar)


Lesenswert?

Peter II schrieb:
> Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie
> strcmp.

du meinst strcpy?

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Fragant (Gast)


Lesenswert?

-------------------------------------------------------
1
struct patient{
2
  char name[20];
3
  char illness[30];
4
  int age;
5
  struct patient *next;
6
};
7
8
struct patient *start = NULL;
9
struct patient *ende = NULL;
10
11
12
void einlesen(){
13
14
  int alter_neu;
15
  char name_neu, krankheit_neu;
16
  struct patient *neu;
17
18
  neu = (struct patient*) malloc(sizeof(struct patient));
19
20
  printf("Name des Patienten: ");
21
  scanf("%c", &name_neu);
22
  printf("Krankheit des Patienten: ");
23
  scanf("%c", &krankheit_neu);
24
  printf("Alter des Patienten: ");
25
  scanf("%d", &alter_neu);
26
27
  neu->age = alter_neu;
28
  neu->name = name_neu;
29
  neu->illness = krankheit_neu;
30
  
31
32
}
---------------------------------------------------------------

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.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

> ... 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.

von Klaus W. (mfgkw)


Lesenswert?

Fragant schrieb:
> kann mir aber immer noch nicht vorstellen, wie man es dann machen soll.

Vielleicht ein gutes Buch lesen?

von Karl H. (kbuchegg)


Lesenswert?

?
1
void einlesen(){
2
3
....
4
  char name_neu, krankheit_neu;
5
....
6
7
  printf("Name des Patienten: ");
8
  scanf("%c", &name_neu);
9
10
....
11
12
  printf("Krankheit des Patienten: ");
13
  scanf("%c", &krankheit_neu);
14
....


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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Fragant (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
  char name[20];
2
3
  scanf( "%s", name );

jetzt hast du einen String!

Und denn kann man kopieren. Zb in ein anderes char Array
1
   char tmp[20];
2
3
   strcpy( tmp, name );

oder in ein char-Array, welches in einem Struktur-Objekt steckt
1
struct person
2
{
3
  char name[20];
4
};
5
6
int main()
7
{
8
  struct person pers;
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
  struct person* 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.

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

> Grundsätzlich würde ich Teilen meiner Vorredner zustimmen, ...

Welchen Teilen? Nicht meinem Arsch!

von Matthias (Gast)


Lesenswert?

Klaus schrieb:

> Welchen Teilen? Nicht meinem Arsch!

Genau diesem Teil nicht. Man muss sich nicht wie ein Rotz am Ärmel 
benehmen.

von Klaus (Gast)


Lesenswert?

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.

von Fragant (Gast)


Lesenswert?

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.

------------------------------------------------------------
1
struct patient{
2
  char name[20];
3
  char illness[30];
4
  int age;
5
  struct patient *next;
6
};
7
8
struct patient *start = NULL;
9
struct patient *ende = NULL;
10
11
12
void einlesen(){
13
14
  int alter_neu;
15
  char krankheit_neu[30], name_neu[20];
16
  
17
  struct patient *neu;
18
19
  neu = (struct patient*) malloc(sizeof(struct patient));
20
21
  printf("Name des Patienten: ");
22
  scanf("%s", &name_neu);
23
24
  printf("Krankheit des Patienten: ");
25
  scanf("%s", &krankheit_neu);
26
27
  printf("Alter des Patienten: ");
28
  scanf("%d", &alter_neu);
29
30
  neu->age = alter_neu;
31
  strcpy(neu->name, name_neu);
32
  strcpy(neu-> illness, krankheit_neu);
33
34
35
void ausgabe(){
36
37
  struct patient *ptr_anzeige = start;
38
  while (ptr_anzeige != NULL)
39
  {
40
    printf("%s\n", ptr_anzeige->name);
41
    printf("%s\n", ptr_anzeige->illness);
42
    printf("%d\n", ptr_anzeige->age);
43
    ptr_anzeige = ptr_anzeige->next;
44
  }
45
  printf("\n");
46
47
}


------------------------------------------------------------

Bei der Ausgabe kommt folgende
Fehlermeldung:
Zugriffsverletzung, Fehler beim Lesen der Zeichen der Zeichenfolge.

Könnt ihr einen Fehler erkennen?

: Bearbeitet durch User
von foo (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

> 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.

von Dirk B. (dirkb2)


Lesenswert?

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:
1
  printf("Name des Patienten: ");
2
  scanf("%19s", name_neu);
3
4
  printf("Krankheit des Patienten: ");
5
  scanf("%29s", krankheit_neu);

von Pandur S. (jetztnicht)


Lesenswert?

Solch triviales Zeug sollte man Singlesteppen koennen. Und falls nicht, 
andere IDE, oder andere Sprache.

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.