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

Hallo Lara,

nun erstmal ist dies ein Forum fuer C und C++, nicht fuer C#, das gibt es etwas weiter unten …

char eingabe();
Da steht dann zum Beispiel drin: nameX

In einem char steht niemals nameX drinnen. Was du hier brauchst ist der String Typ, der als alias im .NET Framework auch geschickterweise „string“ heisst, sofern ich mich korrekt erinnere. strings kannst du auch zuweisen, was dein zweites Problem loesen sollte.

Gruss
norsemanna

Hallo!
Ich werde aus Deiner Frage nicht so recht schlau - Du postest im C/C++ Brett eine Frage zu C# (die damit ins .NET Brett gehörte), dennoch ist in den Compilermeldungen etwas von Pointern zu lesen?
Was ist es nun? C# oder C++?

Auch würde der tatsächliche Code Deiner Funktion eingabe() helfen.

Zum Problem mit der Struktur: Du weist einem char[] einen char zu - das kann natürlich nicht klappen.
char ist ein einzelnes Zeichen.
char* ist ein Zeiger auf ein Zeichen (das erste einer Zeichenkette).
char[] ist ein Array (fester Länge) mit einzelnen Zeichen.
Eine saubere Unterscheidung der Typen ist das A und O.

Gruß,
Martin

Erst einmal Danke für Eure Mühe und schnelle Antwort!

OK Entschuldigung, mir war nicht bewusst, dass C# etwas anderes als C ist.
Ich programmiere mit C. Ohne Sharp. =)

Ich verstehe das Problem mit char und den Arrays.
Ich muss also ein Array aus der Funktion zurückgeben und alles auch so entsprechend deklarieren?!

Der Code der Funktion ist folgender:

char Eingabe()
{
char buffer[31];
int i, ch;

printf( "Text Eingeben: " );

// Lese eine Zeile von der Tastatur
for( i = 0; (i

Hallo, ich habe glaube ich gerade das Problem wegen Parameterübegabe gelöst/umgangen. *freu*

Anstatt der Ausleseroutine benutze ich jetzt gets

Also im Hauptprogramm:

char buff[30];
gets(buff);
DS[i].dname = buff;

Ohne das ganze in DS[1] spielen zu wollen, gibt es auch keine Probleme beim kompilieren. Das scheint wohl so zu gehen.

Nur diese Zeile gefällt ihm nach wie vor nicht…

DS[i].dname = buff;

Wie kriege ich die Tastaturauslesung in meine Strukturvariable?
dname ist ja auch als char[30] deklariert…

Danke schon mal!

Hallo!
Das Problem am ursprünglichen Code ist, dass Du in der Deklaration sagst, dass Du EIN char zurückgibst, aber dann ein char[] zurückgibst.
Wenn Du einen Compiler mit vernünftigen Warnungen verwendest, müsste der eigentlich meckern.
Was Du zurückgibst, ist eine lokal in der Funktion deklarierte Variable.
Außerhalb der Funktion verliert die Variable ihre Gültigkeit.
Bei einem skalaren Wert wäre das egal, weil Du ja letztlich beim return den Wert auf den Stack legst und die aufrufende Funktion den Wert darüber erhält.
So wird aber auf ein char[] verwiesen, dessen Speicher beim Verlassen der Funktion nicht mehr zur Verfügung steht.

Üblicherweise gibt es für solche elementaren Dinge wie Eingeben von Strings vorgegebene Funktionen (scanf), so dass Du nicht das Rad neu erfinden musst.

Gruß,
Martin

Hey Leute,

jetzt geht es, ich hab es hinbekommen!
Ohne euch wäre ich wohl noch eine Ewigkeit vor dem Problem gesessen… =)

Vielen, vielen Dank für eure Tipps und Erklärungen!

Ich hoffe ich war nicht zu schwer von Begriff…

LG Lara