Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » arraystack und rückgabe eines feldes

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 ]
000
16.01.2009, 11:54 Uhr
nieselfriem



Hallo!

Wir haben eine Aufgabe aus einer Vorgabe eines Arraystacks die Operationen push pop und top implementieren
Jedoch soll dazu erst einmal der stack erzeugt werden
dazu gibt es eine Funktion create()
Hier mal der Code:

C++:
struct TStackA {
  void** info;
  int maxGroesse;
  int pos;
};
TStackA create()
{
        TStackA stack[10]; //Arraystack mit Platz für 10 einträgen
        return *stack; //rückgabe der adresse des stacks so das ich mit info auf die adresse des stack zugreifen kann
}
...
int main(int argc, char* argv[])
{
  int* val;
  char command[8];
  TStackA stack;
  
  stack = create();
...
}


ich wolle ersteinmal fragen ob ich mit der funktion create auf dem richtigen weg bin. Denn mit zeiger und zeiger auf zeiger hab ich noch nicht so die erfahrung.

Gruß niesel

Dieser Post wurde am 16.01.2009 um 11:55 Uhr von nieselfriem editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.01.2009, 12:37 Uhr
~krrronos
Gast


1.: *stack ist der Inhalt des Zeigers stack, also das erste Element des Arrays. Es wird also ein Kopie des ersten Elements zurückgegeben. Wenn du den ganzen Array willst, musst du auch stack zurückgeben, dein Rückgabetyp ist dann ein Zeiger auf TStackA, also ein *TStackA.

2.: Der Array ist nur innerhalb der Funktion create gültig, wenn du ihn so anlegst. Wenn du das wirklich in einer Funktion machen willst, musst du den Speicher mit malloc reservieren (unter der Annahme, dass das C sein soll und nicht C++) , d.h.
C++:
TStackA* stack = malloc(10*sizeof(TStackA));

Wenn du malloc benutzt musst du den Speicher später wieder freigeben:

C++:
free(stack);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.01.2009, 12:38 Uhr
~krrronos
Gast


Kleine Korrektur:

C++:
TStackA* stack = (TStackA*) malloc(10*sizeof(TStackA));

Dieser Post wurde am 16.01.2009 um 13:21 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.01.2009, 13:09 Uhr
nieselfriem



naja wir dürfen die vorgaben leider nicht ändern. das bedeutet. wie kann ich ein arraystack erzeugen wenn ich den rückgavetypen nicht verändern darf. ich nehme an du meinst due funktion müsste dann so aussehen


C++:

*TStackA create()
{
        TStackA* stack = (TStackA*) malloc(10*sizeof(TStackA));
        return stack;
}



gruß niesel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.01.2009, 13:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ~krrronos:
Kleine Korrektur:

C++:
TStackA* stack = [b](TStackA*)[/b] malloc(10*sizeof(TStackA));



"you shall not cast void" - wenn du den cast brauchst, hast du keinen C-Compiler sondern einen C++-Compiler, und dann nimmt man new/delete.

Ansonsten:


C++:
TStackA *create()
{
        TStackA* stack = malloc(10*sizeof(TStackA)); /* wie gesagt, wenn der cast notwendig ist, hast du keinen C-Compiler */
        return stack;
}



und irgendwo auch ein:


C++:
void cleanup(TStackA *stack)
{
   free(stack);
}



um den speicher wieder aufzuräumen.

Weiterhin muss es dann in der main:


C++:
TStackA *stack;
  
stack = create();

/* ... */

cleanup(stack);



heißen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.01.2009, 13:36 Uhr
ao

(Operator)


Schreib mal, was alles vorgegeben ist und was nicht. Die Struktur TStackA z.B., ist die so vorgegeben? Wenn ja, warum ist info ein void** (also Doppelpointer), das ergibt schon mal keinen Sinn (oder steh ich aufm Schlauch?).

Außerdem würde ich es sinnvoll finden, wenn bei create die Stacklänge als Parameter angegeben würde.

Was für Datentypen soll der Stack speichern? Zahlen? chars?

Und welche Sprache soll das sein, C oder C++? Es sieht aus wie C++ (andernfalls müsste überall, wo ein Objekt vom Typ TStackA deklariert wird, das Wörtchen "struct" dabeistehen), andererseits ist eine Stack-Implementierung ohne class und mit malloc in C++ extrem blödsinnig, wenn ich das mal so sagen darf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.01.2009, 13:52 Uhr
nieselfriem



ok die vorgaben

C++:
#include <stdio.h>
#include <stdlib.h>

struct TStackA {
  void** info;
  int maxGroesse;
  int pos;
};

TStackA create()
{
        
}

TStackA push(void* info, TStackA oldStack)
{
}

TStackA pop(TStackA oldStack)
{
}

void* top(TStackA stack)
{
}

/*******************************************************************************
* Das Ein-/Ausgabeverhalten der main-Funktion darf nicht verändert werden.
* e <Enter>         beendet das Programm.
* p <Zahl>  <Enter> speichert <Zahl> auf dem Stapel.
* o <Enter>         entfernt das oberste Element vom Stapel.
* t <Enter>         Gibt den Integerwert an der Stapelspitze aus.
*******************************************************************************/

int main(int argc, char* argv[])
{
  int* val;
  char command[8];
  TStackA stack;
  
  stack = create();
  while(*command != 'e')
  {
    printf("cmd? ");
    scanf("%s",command);
   ...
  }
}





gruß niesel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.01.2009, 14:18 Uhr
ao

(Operator)


Aua, so ne Aufgabenstellung tut ja richtig weh. Für welches Leerinstitut ist das?

Also, erstmal sind alle auf dem Holzweg, die irgendwas nach dem Muster "return malloc (sizeof (TStackA))" vorgeschlagen haben, denn TStackA ist die Stack-BESCHREIBUNG, TStackA.info IST der Stack, und der muss alloziert werden.

Es muss in die Richtung

C++:
TStackA stack;
stack.info = malloc (N * sizeof (void **));
stack.maxGroesse = N;
stack.pos = 0;
return stack;


gehen.

Außerdem warte ich noch auf eine eindeutige Antwort, ob wir in C oder in C++ programmieren, der Code da oben lässt Schlimmes vermuten.

Dieser Post wurde am 16.01.2009 um 14:19 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.01.2009, 14:25 Uhr
nieselfriem



legen wir uns mal auf c fest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.01.2009, 14:50 Uhr
ao

(Operator)


Dann wär das jetzt ein guter Zeitpunkt für einen eigenen Ansatz, sprich: Programmvorschlag von dir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: