Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Simple. Kann mir jemand struct's erklären?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
25.02.2004, 16:06 Uhr
~Benny
Gast


Fazit ?

In den Funktionen sprech ich meine Variablen mit -> Operator an und in meiner main über den .
?

Wenn zahl1 ein Array ist, verhält sich das ganze gleich? Nehm mal an nicht, zwecks Pointer, worauf muss ich bei Array Variablen im Struct achten?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.02.2004, 16:11 Uhr
~Benny
Gast


OK, ich bin ruhig. Ich habs glaub ich verstanden, hoffe das jetzt auf mein Programm anwenden zu können, melde mich bestimmt gegen wochenende wieder, da es ein paar Dateien sind, dich ich umkrämpeln muss.

Danke für deine Geduld.

Grüßer Benny
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.02.2004, 16:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

In den Funktionen sprech ich meine Variablen mit -> Operator an und in meiner main über den .
?


äh nein pauschale aussage ist so nicht richtig...
auch innerhalb einer funktion bzw auch direkt in main kannst du . und -> verwenden.

Es kommt nur darauf an mit welcher art von variablentyp du gerade arbeitest.
in deinem beispiel war es in main konkret eine instanz von zahlen also mit dem . auf die members zugreifen und in der funktion war es halt ein pointer auf eine instanz, dann halt mit -> drauf zugreifen.
Es kommt also nicht drauf an wo du das machst sondern mit welchem typ variable du arbeitest. bei nem pointer halt -> verwenden sonst .




Zitat:

Wenn zahl1 ein Array ist, verhält sich das ganze gleich? Nehm mal an nicht, zwecks Pointer, worauf muss ich bei Array Variablen im Struct achten?


beim array brauchst du eigentlich nicht weiter auf irgendwas zu achten. du kannst mit einem struktarray genauso arbeiten wie mit einem normalen z.b. integerarray


C++:
my2dpunkt my2dpunkt_array[10];

my2dpunkt_array[0].x=37;my2dpunkt_array[0].y=35;
my2dpunkt_array[1].x=45;my2dpunkt_array[1].y=31;
.
.
.



--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.02.2004 um 16:13 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
25.02.2004, 16:20 Uhr
~Benny
Gast


OK, vielleicht doch noch nicht 100% verstanden.

Nochmal zu meiner Pauschalaussage. Verwende ich in Funktionen nicht immer Pointer?


C++:
my2dpunkt my2dpunkt_array[10];

my2dpunkt_array[0].x=37;my2dpunkt_array[0].y=35;
my2dpunkt_array[1].x=45;my2dpunkt_array[1].y=31;
.
.



d.h. das sind meine "Datensätze" oder?
und in den Datensätzen kann ich meine Variablen event. auch Arrays deklarieren?


C++:
struct
{
int a;
char b[20];
}
my2dpunkt;

my2dpunkt abc[10];



Aber eins versteh ich noch nicht soo ganz. Ich kann später wenn ich brauch das abc[10] auch durch def[20] ersetzen und dann hab ich eine neue "Variable", welche die Variablen des Struct beinhaltet, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
25.02.2004, 16:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


um dir mal zu erklären warum ich das als pointer übergeben habe folgendes von mir hier schon öfter im forum gepostetes beispiel

C++:
int x=3;y=5;

void swap(int x,int y){int help=x;x=y;y=help;}
//wen du es so machst wird zwar getauscht aber wenn die funktion am ende durch ist steht in x immer noch 3 und in y dir 5 weil nur mit kopien von x und y gearbeitet worden ist die am ende der funktion wieder gelöscht werden.

void swap(int *x, int *y){int help=*x;*x=*y;*y=help;}
//hierbei steht auch nach dem durchlaufen der funktion in x die 5 und in y die 3 weil nicht die variablen selber sondern die pointer kopiert wurden

//das geht nur in c++
void swap(int &x, int &y){int help=x;x=y;y=help;}
//ist ähnlich wie bei den pointer nur das du dir das dämliche dereferenzieren ersparst. es wird nicht mit kopien der variable selbst gearbeitet sondern direkt mit den addressen obwohl du die variablen ansprichst als wären sie keine adressen



so und nun um nochmal auf dein problem zurückzukommen.
wenn du einer deiner funktionen in deiner parameterliste eine variable übergibst die von der funktion verändert werden soll und die änderung auch noch nach durchlaufen der funktion bestehen soll, musst du die als pointer (oder in c++ geht auch referenz) übergeben.

wenn du die variable nur übergibst um was anderes weiterzuverabeiten ist eine übergabe per pointer nicht nötig (aber natürlich möglich) weil du den inhalt der variablen ja in der funktion nicht ändern willst...

deshalb habe ich in dem beispiel das als pointer übergeben
hoffe das ist jetzt soweit so halbwegs klar wenn nicht frag nochmal...


Zitat:

und in den Datensätzen kann ich meine Variablen event. auch Arrays deklarieren?


jo geht...

so zu deiner anderen frage...
wenn du noch nicht weiss wie gross dein array werden kann musst du den speicher dynamsich allokieren. (mit malloc und free für c bzw. mit new und delete bei c++)
falls dein array ständig wachsen soll und du noch nicht weisst wie gross es werden kann ist es wenn man c++ verwendet recht hilfreich die stl zu verwenden.
da gibt es z.b. eine container-klasse namens std::vector mit der es sich dann leichter arbeiten lässt als mit einem array das man ständig neu allokieren muss.

wenn du allerdings nur nicht weiss wie gross dein array beim programmstart ist aber es auch nciht ständig wächst (bzw. schrumpfst) sondern einfach eine erst im programm festgelelgte grösse einnimmt würde ich einfach new und delete verwenden
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.02.2004 um 16:30 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
25.02.2004, 16:36 Uhr
~Benny
Gast


Also C++ fällt bei mir schonmal weg, da ich erstmal C verstehen will bevor ich mich mit c++ beschäftige (zwecks schule auch).

Das mit Pointer und nicht Pointer mit verändern und kopieen ist klar, aber mir ist nichts bekannt wo ich mit kopien arbeite die ich änder, entweder soll es global geändert werden, oder es wird nur benutzt, dann kann ich ja nur pointer benutzen, sind doch auch sparsamer was speicher angeht, oder?

Ich hab jetzt was versucht, aber hab mal wieder einen Fehler.

C++:
typedef struct
        {
          int zahl1;
          int zahl2;
          char wort[20];
        }  zahlen;

int summe (*zahlen euz_su[2]);

int main ()
{
zahlen euz[2];

euz[0].zahl1 = 1;
euz[0].zahl2 = 2;

summe (&euz);
return 0;}

int summe (zahlen *euz_su[2])
{
int summe;

scanf ("%s",euz_su[1]->wort);
printf ("%s",euz_su[1]->wort);

summe = euz_su[0]->zahl3[0]+euz_su[0]->zahl3[1];

printf ("%d",summe); getch();
return 0;}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
25.02.2004, 16:43 Uhr
~Benny
Gast


Ups, ich hab natürlich zahl3[2] im struct deklariert.
vergessen zu notieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
25.02.2004, 16:45 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das mit dem kopien machst nicht du sondern die werden automatisch auf dem stack erstellt wenn du deine funktion aufrufst...
weil das programm dann intern mit kopien der von dir übergebenen variablen innerhalb der funktionen arbeitet ergibt sich halt das oben beschriebene problem (wenn man es denn problem nennen will)


C++:
typedef struct{int zahl1;int zahl2;char wort[20];}  zahlen;

int summe (zahlen euz_su[2]);

int main (){
zahlen euz[2];

euz[0].zahl1 = 1;
euz[0].zahl2 = 2;

summe (euz);
getch();
return 0;
}

int summe (zahlen euz[2]){ //hier ist die übergabe als pointer nicht mehr nötig weil euz selber ja schon ein arraypointer ist
int summe;
scanf ("%s",&euz[1].wort);
printf ("%s\n",&euz[1].wort);

//damit die summe einen sinn macht sollte man auch dem [1] werte zuweisen
euz[1].zahl1 = 3;
euz[1].zahl2 = 4;
summe = euz[0].zahl1+euz[0].zahl2+euz[1].zahl1+euz[1].zahl2;

printf ("%d",summe);
return 0;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
25.02.2004, 16:51 Uhr
~Benny
Gast


OK, hab ich jetzt alle möglichkeiten durchgekaut? Fällt dir noch was ein?

Wie arbeite ich mit malloc, wie mach ich das mit dem "wachsenden Array"?

Ich werde erst wieder morgen früh posten, hab jetzt dann feierabend.

Schönen Abend @ Windalf

Thanks so far
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
25.02.2004, 18:01 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Wie arbeite ich mit malloc, wie mach ich das mit dem "wachsenden Array"?



naja das läuft dann z.b. in etwa so

array "hinreichender" grösse mit malloc allokieren
und am besten zwei int variablen vorhalten eine die die aktuelle anzahl der elemente im array enthält und eine die angibt wieviel speicher reserviert worden ist.

wenn die anzahl plus der einzufügenden datensätze grösser ist muss nach allokiert werden. das geht in c dann z.b. mit realloc
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: