Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » createStack

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 ]
000
18.10.2008, 10:45 Uhr
KFC Embryo
Ein Huhn


Hallo,

ich habe ein Problem die folgende Funktion soll einen Stack erstellen, ich möchte ihn auch noch mit Null initialisieren.

Wenn ich Compilieren möchte kommt folgender Fehler:


Code:
error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung möglich)




Code:

Stack* createStack(unsigned int n){

    unsigned int i;
    Stack * s;
    
    s = (Stack *) malloc(n*(sizeof(Stack *)));
    
    for (i=0;i<=n;i++){
        s[i]=0;
    }
}



mfg
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.10.2008, 18:49 Uhr
0xdeadbeef
Gott
(Operator)


Benutz calloc statt malloc, das macht das für dich. Oder halt mit memset.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.10.2008, 20:16 Uhr
KFC Embryo
Ein Huhn



Code:

Stack* createStack(unsigned int n){

    unsigned int i;
    Stack * s;
    
    s = (Stack *) calloc(n*(sizeof(Stack *)));
    return s;
}




Wenn ich so mache wie du sagst dann bekomme ich die Fehlermeldung:


Code:

error C2661: 'calloc': Keine überladene Funktion akzeptiert 1 Argumente



--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2008, 20:37 Uhr
0xdeadbeef
Gott
(Operator)


Äh...ich bin jetzt schon davon ausgegangen, dass du vorher mal in die Doku kuckst. calloc nimmt zwei Parameter:

C++:
s = calloc(n, sizeof(Stack));


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.10.2008, 21:03 Uhr
KFC Embryo
Ein Huhn


Ah ok das funktioniert jetzt.
Habe aber schon die nächste Frage:

Ich möchte dieses Array nun füllen ungefähr so:


Code:

        push(s, 'a');
    push(s, 'b');
    push(s, 'c');
    push(s, 'd');






Code:
void push(Stack *s, char c){
    
    s[0]=c;
}



Allerdings bekomme ich den Fehler:


Code:
Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'char' akzeptiert (oder keine geeignete Konvertierung möglich)


--
An nescis, mi fili, quantilla prudentia mundus regatur?

Dieser Post wurde am 18.10.2008 um 21:03 Uhr von KFC Embryo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2008, 23:29 Uhr
Lensflare



Wenn du das so machen willst, dann muss "Stack" den "=" Operator überladen.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 18.10.2008 um 23:31 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.10.2008, 03:21 Uhr
ao

(Operator)


Zeig mal die Definition von Stack, bitte.

Stack * s = (Stack *) malloc(n*(sizeof(Stack *)));

Das hier macht überhaupt keinen Sinn. Entweder ist "Stack" ein typedef für den Datentyp, den der Stack aufnehmen soll (char in deinem Beispiel), dann muss der aber so geholt werden:

s = (Stack *) malloc(n*(sizeof(Stack))); // ohne *

Oder Stack ist eine Klasse, dann ist es Unsinn, n Pointer auf diese Klasse zu allozieren - oder hast du wirklich vor, dort noch n Stack-Objekte reinzuhängen?

Außerdem hab ich den Verdacht, dass das ein C++-Programm ist, und da hat malloc eigentlich nix drin verloren.

Dieser Post wurde am 19.10.2008 um 03:22 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.10.2008, 12:10 Uhr
KFC Embryo
Ein Huhn


Hallo,

@ao: Ich denke deine Aussage bezieht sich auf die erste Frage oder?

Hier mal die Definition des Struct Stack:


Code:
struct Stack{
    unsigned int depth;
    char         *content;
    unsigned int top;
};



Und der Funktionskopf:


Code:
void push(Stack *, char);



@Lebensflare: Ich verstehe nicht ganz was du meinst, weiß nicht was du mit = überladen meinst.

gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?

Dieser Post wurde am 19.10.2008 um 12:10 Uhr von KFC Embryo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.10.2008, 16:07 Uhr
Lensflare




Zitat:
Ich verstehe nicht ganz was du meinst, weiß nicht was du mit = überladen meinst.

Stichwort Operatorüberladung.
Man kan damit zum Beispiel definieren, was passieren soll, wenn man zwei Objekte miteinander addiert oder ein char einem Objekt zuweist usw...

Naja du brauchst das in dem Fall nicht wirklich. Ich weiss nicht einmal ob es bei structs geht

Der Inhalt deines Stacks sind ja chars.
Also musst du Platz für chars reservieren.

C++:
(char *) malloc(n*(sizeof(char)));


Wie ao bereits gesagt hat, ohne * in sizeof

Ich nehme an, dass "depth" die maximale Anzahl der Elemente im Stack ist und dass "top" die Position des obersten Elements repräsentiert (beginnend mit 0).

Probier mal diese pushfunktion.

C++:
void push(Stack *s, char c){
    if(s->top == s->depth-1) //Wenn stack voll...
        return;  //... nicht weiter machen

    s->content++; //Nächste Stelle im Stack "einstellen"
    s->*content = c;  //c auf die nächste Stelle schreiben
    s->top++;       //Position der nächsten Stelle merken
}


--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 19.10.2008 um 16:14 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.10.2008, 20:16 Uhr
0xdeadbeef
Gott
(Operator)


Jungs...Operatorüberladung in C? Ich glaube nicht. Und wenn es sich hier um C++-Code handeln sollte, wäre sowohl die Verwendung von malloc als auch die von calloc grob fahrlässig und funktioniert, wenn überhaupt, nur zufällig. Immerhin gibt's in C++ ja new[] für so was.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


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: