C# Probleme mit Stukturen und Parameterübergabe

Hallo liebe Leute,

ich qüale mich seit einer Woche mit einem C# Programm und brauche dringend Rat!

Folgende Schwierigkeiten habe ich.

Zum einen habe ich eine Funktion eingabe().

Diese habe ich so deklariert:

char eingabe();

Die Funktion ist eine Standardroutine die mir eine Zeichenkette von der Tastatur einliest und in die Variable buffer vom Typ char überträgt.

Da steht dann zum Beispiel drin: nameX

Wenn ich dann eine Ausgabe in dieser Funktion mache, habe ich auch tatsächlich nameX auf dem Bildschirm.

Das ganze funktioniert aber nicht mehr, wenn ich sie mit return buffer; ins Hauptprogramm gebe mit:

//Im Hauptprogramm
name = eingabe();

name ist aber ebenfalls als char deklariert.
Im Compiler kommen die Fehlermeldungen:
[Warning] return makes integer from Pointer without a cast

und

[Warning] function returns adress of local variable

Was hat das dämliche Programm für ein Problem?
Geht das return nur mit dem Typ Integer?

Mein 2. Problem ist, ich habe eine Struktur angelegt:

// Struktur für Datensatz anlegen
struct PData
{
char dname[30];
char lname[30];
int bestand;
double preis;
};

und anschließend zugewiesen:

struct PData DS[55];

DS Steht für Datensatz, davon habe ich maximal 55.

Wenn ich in das Array DS für einen Datensatz einen Wert laden will, versuche ich das so:

DS[i].dname = name;

Ich will in DS an stelle i (Integer aus Schleife)
in dname die Variable name schreiben, die ich aus meiner Eingaberoutine von oben habe.

Aber natürlich meckert der Compiler: =)

incoompatible types in assignment

Aber was ist inkompatibel??? dname und name sind doch beides char Variablen.

Ich bin echt am verzweifeln und suche seit so vielen Stunden die Fehler. Bitte helft mir!
Wenn da ein kluger Kopf ist, der mir helfen kann, wäre das genial!

Tausend Dank schon mal!

LG Lara

Hi !

Du scheinst ein generelles Problem mit dem Verständnis von char-arrays zu haben.

Ein Char enthält genau einen Buchstaben. Willst du also 10 Buchstaben einlesen, brauchst du einen Array vom Typ Char mit 10 Feldern (11 eigenlich, für die Terminierung am Ende).

Das spiegelt sich direkt in deinem ersten und zweiten Problem wieder. Sieh dir folgendes Beispiel an:

char buffer[10];
char test;
test=buffer;

Dieser Codeschnipsel produziert einen Fehler, weil du die beiden Variablen unterschiedliche Typen haben ! test ist nur ein einzelner Char, buffer hat aber 10 Chars hintereinander.

Was man machen muss, ist jeden einzelnen Char einzelnd zu kopieren:

Char buffer[3];
Char test[3];

test[0]=buffer[0];
test[1]=buffer[1];
test[2]=buffer[2];

Weil das aber zu anstrengend ist, gibt es die Stringfunktion strcpy. Die genaue Syntax musst du selber nachschauen, aber das Ganze geht in etwa so:

strcpy(Zielarray, Quellarray, Länge);

Viel Spaß !

Hi Lara,

leider habe ich keinerlei Erfahrungen mit C# und kann Dir hier leider nicht weiterhelfen.

VG!
Friedi

Hallo Lara,

mir ist nicht klar, warum WerWeissWas Dein C#-Problem an jemenaden gibt, der als interessengebiet lediglich C++ angegeben hat, aber vielleicht hilft Dir ja folgendes weiter:

  1. Der Rückgabetyp Deiner Funktion ist anscheinend char, also ein einzelner Buchstabe. Wie soll diese also eine Zeichenkette zurückgeben können? Es scheint, dass C# automatisch versucht, Deine Zeichenkette umzuwandeln, was zu keinem sinnvollen Ergebnis führt.

  2. Außerdem scheinst Du in eingabe() den Speicherplatz für die Zeichenkette lokal anzulegen. Ich tippe mal, dass dieser Platz nach verlassen der Funktion freigegeben wird, so dass Du einen Pointer auf nicht mehr gültigen (lokalen) Speicher bekommst.

Punkt 2) ist wirklich nur Spekulation. Ich dachte bisher C# würde wie Java Objekte auf dem Heap anlegen und eine Garbage Collection sorgt dafür, dass nicht schlimmes passiert. Aber wie gesagt, C# hab ich bisher nicht angefasst.

Beste Grüße,

KH

Problem 1:
Probier die Variable „name“ vor der Zuweisung mit „new char()“ anzulegen.

Problem 2:
Statt einer Struktur solltest du eine Klasse anlegen wobei auch die Variablen irgendwo mit „new“ angelegt werden sollten.

Ich hoffe das Thema ist nicht schon veraltet.
Wie sieht denn die Deklaration deiner Funktion aus?
Du musst natürlich auch vorher sagen, dass du einen char haben willst, als Beispiel:

char eisbecher(int kugelanzahl)
Das char am Anfang sagt von welchem Typ die Wiedergabe der Funktion ist.
Hört sich so an, als würde da bei dir int eisbecher… stehen. Oder achte darauf, fals du die Funktion schon vorher deklariert hast auch da den korrekten Wiedergabe Typen anzugeben.