Probleme mit Strukturen

Hi @ all…

Momentan studiere ich angewandte Informatik. Bereits beim Fachabi lernte ich c++, und konnte es soweit auch ganz gut. Leider bekommt man hier wieder vieles neu beigebracht, arbeitet mit einer neuen Version etc. Es ist auch schon des längeren her weshalb ich sicherlich sehr viele Fehler gemacht habe, die mir peinlich sind hehe.

Das Problem ist bei mir, (so war es bisher auch beim Studium), manchmal durchblicke ich etwas gar nicht. Dann stehe ich irgendwie auf den Schlauch, wenn ich dann aber es einmal verstanden habe, kann ich es auch in allen Variationen anwenden.

Momentan sind wir wieder bei Strukturen. Fand ich nie schwierig, aber durch die Aufteilung auf Dateien ist es mir momentan wieder zu hoch. Ich hoffe mir kann jemand anhand meines Quellcodes erklären wie ich vorzugehen habe…


rational.h

#ifndef RATIONAL_H

#define RATIONAL_H
//////////////////////////////////////////////////////

struct rational
{
long int numerator;
long int denominator;
};

struct rational eins;
struct rational zwei;

int add(struct rational eins);
int sub(struct rational eins);
void mul(struct rational *);
int div(struct rational eins);

///////////////////////////////////////////////////////
#endif


main.cpp

#include
#include
#include
#include
#include „rational.h“
using namespace std;

void main()
{
//Wertedeklaration
char wahl, menu;

do
{

cout>wahl;

switch(wahl)
{
case ‚1‘: cout>eins.numerator;
cout>eins.denominator;

cout>zwei.numerator;
cout>zwei.denominator;

mul(rational);

break;
default:break;
}
cin>>menu;
}while(menu!=‚n‘);

}


rational.cpp

#include „rational.h“

void mul(struct rational *)
{

long int zahl;
long int nenn;

cout>zwei.numerator;
cout>zwei.denominator;

zahl=eins.nominator*zwei.nominator;
nenn=eins.denominator*zwei.denominator;

eins.nominator=zahl;
eins.denominator=nenn;

return(rational);

}

Die Aufgabenstellung ist soweit nicht wichtig, da ich das Programm selbst natürlich selbst schreiben möchte. Allerdings muss ich dazu ist verstehen wie ich es richtig angehe…

(Da das Programm noch nicht fertig ist, nicht wundern das z.B. Funktionen unverwendet sind.)

Danke schonmal im Vorraus.

MFG
Bio

Hi,
die Aufteilung in Datei ist ganz einfach.
Du hast einen Teil von dem Programmcode den du nicht in Main brauchst in eine

Header-Datei ausgelagert.

#ifdef…FOO_H->Am Anfang des Headers

#defin…FOO_H->Am Ende des Headers

Das dient nur dazu dem Compiler zu sagen das er bitte diesen Dateiname FOO_H definiert wird und er sich doch bitte diesen Header merken soll.

Mit dem #include "foo.h"Befehl bindest du diesen Header foo.h in deine Main ein. Der Compiler weiß dann (auch durch die Definition im Header selbst) was der Header an Funktionen und Strukturen beinhaltet. Diese kannst du dann direkt verwenden als hättest du sie in deiner Main geschrieben das ist quasi nur eine Referenz auf ein Teil deines Programmes.

Hoffe konnte dir weiterhelfen.

nice GreetZ

Hardrocker

Danke schonmal für die Antwort :smile:

Ein wenig konntest du mir schon helfen. Sofern ich das richtig verstanden habe, muss ich Strukturen also nicht an Funktionen übergeben sondern kann sie einfach dort „überschreiben“? Also ohne Übergabe, und Rückgabewert? Und wie würde ich die Funktion dann aufrufen, ohne einen Parameter zu Übergeben?
Oder habe ich das falsch verstanden?

Hallo Bio,

#include funktioniert noch auf Textebene.
Der Präprozessor kopiert einfach an diese Stelle denjenigen Text welcher in dieser Datei steht.

Wozu nun das Ganze ?

Grössere Programme werden übersichtlicher wenn man sie auf mehrere Module verteilt oder du verwendest eine eine Bibliothek.

Nehmen wir mal eine Bibliothek an.
Und als Funktion

char *strcpy( char *strDestination, const char *strSource );

Um die Funktion zu verwenden musst du in deinem Programm eine Vorwärtsdeklaration machen.
Obige kannst du im Prinzip einfach in dein main.c schreiben. Funktioniert problemlos.

Jetzt nehmen wir mal an, dass du auch noch die Bibliothek, welche strcpy() enthält, als Sourcecode hast und etwas daran ändern willst.

Geht ja auch erst mal ohne Probleme.
Compilieren geht auch Fehlerfrei, aber beim Linken klemmt es dann, wenn die Vorwärtsdeklaration in main.c nicht mehr passt !

Also musst du das in main.c auch anpassen. Bei einem Modul geht das ja noch, aber bei 20 Modulen die strcpy() verwenden wird es aufwändig.

Deshalb lagert man die Vorwärtsdeklaration von strcpy() z.B. in string.h ab.
Hinzu kommt noch, dass man dann string.h auch in der Bibliothek mit einbindet. Dadurch kann der Compiler auch überprüfen ob das zusammenpasst.
Desweiteren muss man die Vorwärtsdeklaration nur an einer Stelle ändern. Der Compiler kann dann im Sourcecode überprüfen ob da alles zusammenpasst und gibt andernfalls eine Meldung aus.

MfG Peter(TOO)

nein du übergibst grundsätzlich eine ganze Struktur sonder bei C immer nur einen Pointer auf die Struktur.

Beispiel
Das ist dein Header
#ifdef FOO_

struct typ{
int i = 0;
int j = 0;
int result
};

#def FOO_

das ist deine Main.cpp

#include „Foo“;

int main(){

/**
*Der Compiler weis jetzt das du diese Struktur vom header Foo.h verwenden willst *und bindet diese dann ein.
//Zeiger auf Struktur die du im Header deiniert hast
typ* t = mallaoc(typ*)sizeof(typ);

//i hat jetzt den Wert 5
t->i = 5;
//j hat jetzt den Wert 6
t->j = 6;
//Funktion liefert einen Pointer vom Typ der Struktur
t = berechen(t);

//t->result hat jetzt den Wert 6

}

typ* berechne(typ* typ_){

return t->result = t->i + t->j;

}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

#endif
Hallo Leute,

#ifdef…FOO_H->Am Anfang des Headers
#defin…FOO_H->Am Ende des Headers

Ich kenne das nur so:

// beide am Anfang des Headers:
#ifndef FOO\_H // wenn nicht schon deklariert
#define FOO\_H // dann aber jetzt, bitte

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
 Hier kommen Strukturen, Funktionen, etc.
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

// am Ende des Headers:
#endif // FOO\_H // bei langen Dateien hilfreich

Ohne dem kann es passieren, dass der Compiler ein zweites Mal versucht, das auszuwerten.
Das gibt dann den Fehler „wurde schon weiter oben deklariert.“
So wie hier geschrieben erspart man sich das.

lG
Martin B