WinFuture-Forum.de: Struct Und Funktionen In C - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Struct Und Funktionen In C hilfe


#1 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 04. März 2008 - 14:18

Hallo!
Möcht jetzt gerne die Void Funktion mit dem Inhalt der Struktur ausgeben, wie mache ich das
also mit nur print(); geht es nicht .Auch bei print(struct Student Person1); nicht.
Wie muss ich die Funktion aufrufen damit ich eine Ausgabe bekomme?
Danke schon mal für eure Hilfe. :) :)



struct Student

{
long int ID;
short int Semester;
char Abschluss;
};


void print(struct Student Person1);

int main ()
{

struct Student Person1;

Person1.ID=10007741;
Person1.Semester=0;
Person1.Abschluss="Hello";
print(struct Student Person1);

return 0;
}



void print(struct Student Person1)

{

printf("Person1.ID:%li \n\Semester.Person1:%i\n\Person1.Abschluss:%c\n\ ",Person1.ID,Person1.Semester,Person1.Abschlus
s);
printf("hallo ");
}

Dieser Beitrag wurde von centro bearbeitet: 04. März 2008 - 14:22

0

Anzeige



#2 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 04. März 2008 - 14:42

Ich kann jetz kein C aber ich denke mal das die Syntax ähnlich wie bei C++, wenn nicht dann meinen Post einfach ignorieren ^^

1.
struct Student Person1;

sollte glaub ich
 Student Person1
sein

2.
void print(struct Student Person1);

auch hier das struct weg

3.
 print(struct Student Person1);

sollte wohl so aussehen
 print(Person1);


4.
void print(struct Student Person1)

{

printf("Person1.ID:%li \n\Semester.Person1:%i\n\Person1.Abschluss:%c\n\ ",Person1.ID,Person1.Semester,Person1.Abschlus
s);
printf("hallo ");
}

sieht für mich auch bisschen komisch aus aber hierzu sag ich nix weiter weil ich nich genau weiss obs in C vllt richtig is
greetz skelle

Dieser Beitrag wurde von skelle bearbeitet: 04. März 2008 - 14:43

0

#3 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 04. März 2008 - 15:40

Wie man eine Struktur anlegt ist mir klar , was ich nur wissen will ist :
Ich habe eine Struktur und will den Inahlt ausgeben mit Hilfe einer Funktion.
Die Ausgabe ohne Funktion ist kein Problem.
Die Werte der Funktion werden in der main mit Hilfe des . übergeben ok.
die Person1 nach der geschleiften Klammer ist nichts anderes also struct Student Person1;
Was ich in der main brauche um die werte der Struktur zu übergeben .Wenn ich an Stelle der Funktion
eine printf(); Anweisung schreibe funktioniertes. Nur nicht wenn ich die Werte an eine Funktion
übergeben will.
Also mögliche Fehler Funtktionkopf falsch deklariet , printf Anweisung in der Funktion (ist aber richtig),
aufruf der Funtkion in der main Augabe(Person1);
Viel bleibt da nicht mehr oder ?
Also wo liegt der Fehler? Ich persönlich glaube bei der Übergabe der Werte an die Funktion.Aber Wo?




struct Student




{
long int ID;
short int Semester;
char Abschluss;
}Person1;
void Ausgabe( struct Student Person1){
printf("Person1.ID:%li ",Person1.ID);

}


int main()


{



Person1.ID=10007741;
Person1.Semester=8;
Person1.Abschluss="Hellos";
Augabe(Person1);

return 0;


}

Dieser Beitrag wurde von centro bearbeitet: 04. März 2008 - 15:42

0

#4 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 04. März 2008 - 15:42

void Ausgabe( struct Student Person1){

muss denn da das "struct" stehen ?

weil normalerweise schreibt man nur den Datentyp und den Variablennamen da hin

das meinte ich
0

#5 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 15:50

@skelle

Das mit

struct Student Person1;

ist in C schon vollkommen richtig; das ist einer der subtilen Unterschiede zwischen C und C++. Obiges müsste aber zumindest auch von einem C++-Compiler akzeptiert werden.

@centro

Ich werde Dir jetzt nicht die fertige Lösung vorsetzen, damit mir keiner vorwirft, ich würde hier anderer Leute Hausaufgaben machen, daher nur ein paar Hinweise (ich habe jetzt nur Dein erstes Post gelesen):

  • #include <stdio.h> fehlt
  • Student.Abschluss muss als char-Array deklariert werden.
  • char-Arrays kann man nicht auf diese Weise zuweisen; entweder Du initialisierst die Struktur gleich bei der Definition oder Du benutzt die Funktion strcpy().
  • beim Aufruf Deiner Funktion print() gibst Du nur das eigentliche Argument an (in diesem Fall Student1), aber nicht den Typ. Denn der steht ja schon in der Funktionsdefinition bzw. im Funktionsprototyp.
  • printf wird anders benutzt, siehe z.B. http://www.galileocomputing.de/openbook/c_...40026411F04B18C
  • außerdem sind in deinem printf-Aufruf ein paar Backslashes zu viel vorhanden.


Hoffe das hilft Dir erstmal.

Gruß
Def
0

#6 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 04. März 2008 - 16:25

Habe es geschafft! das du mir nicht die Lösung verraten hast ist ok ,denn das Problem wurde ja recht begrenzt . Hoffe aber bei kommenden komplexeren Problemen auf tatkräftige Unterstützung im schlimmsten Fall die Lösung . Also danke auch an den User der nur C++ kann,
Hier meine Lösung die ich gerne noch mit euch besprechen will um es zu reflektieren.
Falls Interesse vorhanden ist .


struct Student

{
long int ID;
short int Semester;
char Abschluss;
};
void Ausgabe( struct Student x)
{
printf("Person1.ID:%li ",x.ID);
}




int main()

{


struct Student Person1;



Person1.ID=10007741;
Person1.Semester=0;
Person1.Abschluss="Hellos";
Ausgabe( Person1);

system ("Pause");
return 0;


}




#include habe ich nicht kopiert da noch andere Programme oberhalb sind die ich mit /* */ trenne .

Dieser Beitrag wurde von centro bearbeitet: 04. März 2008 - 16:26

0

#7 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 04. März 2008 - 16:28

ok denn nochmal sorry :)
0

#8 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 04. März 2008 - 17:00

warum sorry
0

#9 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 17:04

Hi centro,

Glückwunsch, das sieht ja schon mal ganz gut aus.
Wenn Du noch Student.Abschluss mit einbauen willst, müsstest Du Dich ein bisschen mit char-Arrays beschäftigen.
Zumindest bei den ersten Übungsprogrammen ist es ja üblich, erstmal eine ungefähre Speichermenge zu reservieren (wobei man als Programmierer selbst darauf achten muss, diese nicht zu überschreiten), z.B. so:

struct Student
{
long int ID;
short int Semester;
char Abschluss[80]; /* reserviert 79 Zeichen plus das abschliessende NULL-Zeichen */
};

und dann kann man entweder die Struktur gleich mit den passenden Werten initialisieren oder in zwei Schritten, also erst die Struktur definieren und dann die Werte hineinschreiben. Im letzteren Fall benötigt man für Student.Abschluss die Funktion strcpy()

Viel Erfolg noch
Def

Dieser Beitrag wurde von def bearbeitet: 04. März 2008 - 17:05

Eingefügtes Bild
0

#10 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 04. März 2008 - 17:26

Wenn ich dich jetzt richtig Verstanden habe brauche ich strcpy , wenn ich anstelle eines Buchstaben einen Text ausgeben will ist das so richtig ?.
Das Programm liefert mir jetzt erataml nur einen Buchstaben.Werde mich jetzt mal an die Arbeit machen um strcpy einzubauen.


struct Student


{
long int ID;
short int Semester;
char Abschluss[3];
};
void Ausgabe( struct Student x)
{
printf("Person1.ID:%li\n\ ",x.ID);

printf("Person1.Semester:%i\n\ ", x.Semester);
printf("Person1.Abschluss:%c\n\ ", x.Abschluss[2]);

}




int main()

{


struct Student Person1;



Person1.ID=10007741;
Person1.Semester=0;
Person1.Abschluss[2]='D';
Ausgabe( Person1);

system ("Pause");
return 0;


}
0

#11 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 17:47

Beitrag anzeigenZitat (centro: 04.03.2008, 17:26)

Wenn ich dich jetzt richtig Verstanden habe brauche ich strcpy , wenn ich anstelle eines Buchstaben einen Text ausgeben will ist das so richtig ?.

Streng genommen nein, denn mit der Ausgabe hat das nichts zu tun. Du kannst eine Struktur entweder erstmal nur definieren, so wie Du es bisher ja auch getan hast:

struct Student Person1;

und dann die Werte hineinschreiben wie bisher:

Person1.ID=10007741;
Person1.Semester=0;
usw.

aber das geht so nicht mit einem char-Array. Stattdessen musst Du in diesem Fall schreiben:

strcpy(Person1.Abschluss, "Hello");

und am Anfang der Datei #include <string.h> einfügen.

Wenn Du aber von Anfang an weißt, was in der Struktur drinstehen soll, kannst Du die Struktur auch gleich initialisieren (also beim Definieren gleich noch mit Werten versehen), so wie bei anderen Variablen auch:

struct Student Person1 = {10007741, 0, "Hello"};

strcpy() bräuchtest Du dann nur noch, wenn Du das char-Array im späteren Programmverlauf ändern willst.

Was die Ausgabe angeht: Um ein char-Array, also sozusagen einen String (Zeichenkette) auszugeben, braucht printf den Format-Modifizierer %s.

Alles klar?

Gruß
Def
Eingefügtes Bild
0

#12 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 04. März 2008 - 18:55

ja das habe ich auch so gemacht wie du es beschreibtst hatte nur das include vergessen
0

#13 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 04. März 2008 - 19:04

#include <stdio.h>
#include <stdlib.h>
#include <string.h>








struct Student

{
long int ID;
short int Semester;
char Abschluss[5];
};
void Ausgabe( struct Student x)
{
printf("Person1.ID:%li\n\ ",x.ID);

printf("Person1.Semester:%i\n\ ", x.Semester);
printf("Person1.Abschluss:%s\n\ ", x.Abschluss);

}




int main()

{


struct Student Person1;



Person1.ID=10007741;
Person1.Semester=0;
strcpy(Person1.Abschluss, "Hello" );

Ausgabe( Person1);

system ("Pause");
return 0;


}
So meine Lösung war noch was essen deswegen hat es etwas länger gedauert .:huh:
0

#14 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 04. März 2008 - 19:14

Was ich an dieser Stelle noch sagen möchte ist das es sich bei C-Strings um Felder handelt somit darf man nicht schreiben Person1.Name= "tom".Warum?
Weil der reine Bezeichner Name ein Pointer auf ein Feld (Adresse des ersten Elements)ist.
Mit der definition char Name [256] wird ein Feld angelegt, und hierauf festgelegt.Somit kann man Name nicht verändern, was mit einer Anweisung Person1.Name="tom"; geschehen würde, nämlich auf ein neues feld mit dem konstanten Inhalt "tom".Somit wäre der ursprüngliche speicher verloren und es würden weitere Probleme aufteten.
Fals ich jetzt falsch liege sorry?

Dieser Beitrag wurde von centro bearbeitet: 04. März 2008 - 22:18

0

#15 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 19:37

Jau, das sieht schon sehr gut aus. Jetzt sind's hauptsächlich nur noch ein paar Kleinigkeiten, die mich stören. Aber erstmal noch ein ganz fieser, versteckter Fehler:

char Abschluss[5];

Du darfst jetzt nur 4 (!) Zeichen benutzen, denn das 5. Zeichen wird intern mit dem NULL-Zeichen belegt (Endmarkierung für Zeichenketten in C). Das Gemeine ist, dass das Programm vielleicht jahrelang perfekt läuft, weil die Speicherstelle hinter "Hello" im Speicher zufällig sowieso NULL ist, aber irgendwann ist es das mal nicht, und printf schreibt den Inhalt des Speichers auf den Bildschirm (irgendwelchen nicht richtig darstellbaren Müll), Hunderte oder Tausende von Zeichen vielleicht, bis es endlich auf eine NULL-Markierung trifft. Oder es stürzt ab, weil dieser Bereich von einem anderen Programm genutzt wird und das Betriebssystem den Zugriff unterbindet. Auf jeden Fall ist es ein Programmierfehler.

Bei einer Kette von fünf Zeichen musst Du mindestens 6 Zeichen reservieren, also:

char Abschluss[6];

Weitere Sachen:

Nach dem \n (Newline) sollte kein \ mehr kommen, und auch das Leerzeichen danach ist überflüssig. Mein Compiler warnt mich deswegen sogar. :huh:
Außerdem ist der Format-Modifizierer für short int %hi und nicht %i. Bei dem Wert 0 (so wie jetzt) spielt es wahrscheinlich keine Rolle, ob %i oder %hi da steht, aber bei anderen Werten (oder anderen Compilern, Betriebssystemen, Hardwareplattformen...) vielleicht schon. Auf jeden Fall ist es ein Fehler.

Zum Vergleich Deine Version:

---
void Ausgabe( struct Student x)
{
printf("Person1.ID:%li\n\ ",x.ID);

printf("Person1.Semester:%i\n\ ", x.Semester);
printf("Person1.Abschluss:%s\n\ ", x.Abschluss);

}
---

Und so wäre es richtig:

---
void Ausgabe(struct Student x)
{
printf("Person1.ID: %li\n", x.ID);
printf("Person1.Semester: %hi\n", x.Semester);
printf("Person1.Abschluss: %s\n", x.Abschluss);
}
---

Letzter Punkt:
#include <stdlib.h> kann, so weit ich das sehe, wegfallen.

Gruß
Def
Eingefügtes Bild
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0