Forum: Compiler & IDEs push und pop in C


von maddel ihm sein kumpel (Gast)


Lesenswert?

Hi, ich versuche ein bisschen C zu lernen.
Wie kann ich die push und pop Befehle in C nachbilden?

Meine Idee:
Unsigned long int stack[50];
Unsigned char stackpointer = 0;


Stack[stackpointer++] = Bla; // push(Bla)

Bluber = stack[--stackpointer]; // pop(Bluber)

Aber wie kann ich mit #define das so schreiben :
    Push(bla)

    Pop(Bluber)

also das ich die Original Asssembler-Syntax habe?

von Peter II (Gast)


Lesenswert?

maddel ihm sein kumpel schrieb:
> Wie kann ich die push und pop Befehle in C nachbilden?

wozu?

man schreibt ja C damit man sich nicht damit beschäftigen muss.

von Dr. Sommer (Gast)


Lesenswert?

maddel ihm sein kumpel schrieb:
> also das ich die Original Asssembler-Syntax habe?
1
asm ("push r2");
So hast du die komplette ASM-Syntax.

von A. H. (ah8)


Lesenswert?

Tu's in eine struct und mach Funktionen:
1
struct long_int_stack {
2
  unsigned char pointer;
3
  unsigned long int data[50];
4
};
5
6
void long_int_push(struct long_int_stack *stack, long int value) {
7
  stack->data[stack->pointer++] = value;
8
}
9
10
long int long_int_pop(struct long_int_stack *stack) {
11
  return stack->data[--stack->pointer];
12
}

Besser: Nimm statt dem Array nur einen Pointer in die struct:
1
struct long_int_stack {
2
  unsigned char pointer;
3
  unsigned long int *data;
4
};

Dann machst Du noch eine init Funktion (der Rest bleibt gleich):
1
struct long_int_stack long_int_stack_init(long int data[]) {
2
  struct long_int_stack stack = { 0, data };
3
  return stack;
4
}

und du kannst jedes long int Array in einen Stack verwandeln:
1
unsigned long int my_array[50]
2
struct long_int_stack my_stack = long_int_stack_init(my_array);
3
4
long_int_push(&my_stack, Bla);
5
Bluber = long_int_pop(&my_stack);

Noch besser: Nimm gleich einen Pointer als Stackpointer:
1
struct long_int_stack {
2
  unsigned long int *pointer;
3
  unsigned long int *data;
4
};
5
6
struct long_int_stack long_int_stack_init(long int data[]) {
7
  struct long_int_stack stack = { data, data };
8
  return stack;
9
}
10
11
void long_int_push(struct long_int_stack *stack, long int value) {
12
  *(stack->pointer++) = value;
13
}
14
15
long int long_int_pop(struct long_int_stack *stack) {
16
  return *(--stack->pointer);
17
}

Du wirst aber mindestens noch ein Funktion benötigen, die prüft, ob der 
Stack leer ist und irgendwie sicher stellen, dass der Stack nicht 
überläuft, was wiederum erfordert, dass Du wohl auch die Stackgröße 
irgendwo wirst mitführen müssen.

PS: Aller Code ist ungetestet!

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

1
#include <stack>
2
3
std::stack<int> myStack;
4
5
int main () {
6
  myStack.push (3);
7
  myStack.push (27);
8
  
9
  std::cout << myStack.top (); myStack.pop ();
10
  std::cout << myStack.top (); myStack.pop ();
11
}

von BattMan (Gast)


Lesenswert?

maddel ihm sein kumpel schrieb:
> Wie kann ich die push und pop Befehle in C nachbilden?

Für was brauchst Du das in C?
Der Compiler macht das für Dich! C ist ein sog. Hochsprache.
Du stellst eine Frage, die Müll ist. Denn Du hast noch nicht verstanden,
warum man in einer Hochsprache progammiert.
Deine Frage ist unlogisch!

von ich (Gast)


Lesenswert?

Tja BattMan,
dann erkläre mir doch mal bei all deinem allwissen, warum .net eine 
queue mitbringt. dein gesülze ist unlogisch. ein stack verliert absolut 
nicht seine berechtigung bei der vernwendung einer hochsprache.

von Max H. (hartl192)


Lesenswert?

Vllt. brauch er einfach für sein Programm einen LIFO-Buffer... Wusste 
gar nicht, dass man so etwas in C nicht darf und auf ASM ausweichen muss 
;-)

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Auch wenn es schon Klassen und Templates gibt: es ist immer gut auch die 
Grundlagen davon zu wissen. Von daher ist eine eigene Implementation zu 
Lernzwecken eine gute Sache. Einmal gemacht. Verstanden wie es geht. Und 
dann die vorgefertigten Teile weiter benutzt.

An Maddel: vergiss Makros. Das verwirrt Anfänger und führt nur zu 
Problemen.
Basis in C sind die Funktionen. Schreib saubere Funktionen jeweils für 
Push und Pop. Dann spielt mal damit. Debugausgaben rein. Und auch mal 
schauen was passiert, wenn man zuviel pusht/popt und wie man das 
abfängt.

von Oliver S. (oliverso)


Lesenswert?

A. H. schrieb:
> Tu's in eine struct und mach Funktionen:

Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch 
noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht 
over-engineered.

Oliver

von wursti (Gast)


Lesenswert?

zur ursprünglichen frage:
@ maddel ihm sein kumpel
schaut doch ganz gut aus!
anstatt das ganze in ein makro zu packen, schau dir mal inline 
funktionen an. der compiler macht effektiv das gleiche daraus, der code 
ist aber sauberer

von Karl H. (kbuchegg)


Lesenswert?

Oliver S. schrieb:
> A. H. schrieb:
>> Tu's in eine struct und mach Funktionen:
>
> Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch
> noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht
> over-engineered.

Die einzige Konsequenz fuer den TO kann dann aber nur sein, nach den 
bisher gelesenen 20 Seiten auch die restlichen 250 Seiten mal in Angriff 
zu nehmen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> A. H. schrieb:
>> Tu's in eine struct und mach Funktionen:
>
> Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch
> noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht
> over-engineered.

Und wenn man bis "Aliasing" gelesen hat, wird man den Code in die Tonne 
treten weil er falsch ist.

von Peter D. (peda)


Lesenswert?

Man kann durchaus in C einen LIFO programmieren.

Interesieren würe mich aber, was ist die praktische Anwendung?

von Peter Z. (Gast)


Lesenswert?

Hi,
ich würde das so machen:
1
enum{push,pop};
2
3
uint32_t Stack(uint8_t operation,uint32_t data)
4
{
5
    static uint32_t stack[100];
6
    static uint8_t pointer = 0; // ob diese Initialisierung so richtig ist?!
7
    if(operation == push)
8
    {
9
        stack[pointer++] = data;
10
        if(pointer > 99) pointer = 99;//overflow verhindern
11
    }
12
13
    if(operation == pop)
14
    {
15
        if(pointer == 0) pointer = 1;//underflow verhindern
16
        data = stack[--pointer];
17
    }
18
    return data;
19
}
Nur so Idee, ist nicht getestet!

von A. H. (ah8)


Lesenswert?

Johann L. schrieb:
> Und wenn man bis "Aliasing" gelesen hat, wird man den Code in die Tonne
> treten weil er falsch ist.

Was genau siehst Du denn für Probleme mit aliasing und, vor allem, wie 
würdest Du sie lösen?

von Oliver S. (oliverso)


Lesenswert?

Peter Zz schrieb:
> ich würde das so machen:

Ich nicht, und vermutlich auch kaum sonst jemand.

Macht aber nichts, da der TO vor Schreck schon lange das Weite gesucht 
hat, und mit all den hier genannten Lösungsvorschlägen eh nichts 
anfangen kann.

Denn seine Frage war ja nicht nach stack und push und pop, sondern: Wie 
schreibe ich eine Funktion in C, und wie rufe ich die auf, was ist das 
alles überhaupt, und überhaupt überhaupt ?

Oliver

von Udo S. (urschmitt)


Lesenswert?

Peter Dannegger schrieb:
> Interesieren würe mich aber, was ist die praktische Anwendung?

Ein Parser? z.B. für geschachtelte Ausdrücke oder XML.

von A. H. (ah8)


Lesenswert?

Oliver S. schrieb:
> A. H. schrieb:
>> Tu's in eine struct und mach Funktionen:
>
> Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch
> noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht
> over-engineered.
>
> Oliver

Ich weiß, es mag auch etwas gemein sein, ist aber ein Stück weit auch 
Methode: Man muss ja immer auch mit Leuten rechnen, die hier einfach nur 
ein paar Dumme suchen, um billig ihre Hausaufgaben gemacht zu bekommen. 
Deshalb versuche ich ganz bewusst meine Antworten immer ein Stück 
anspruchsvoller zu gestalten, als es für die Lösung der Aufgabe 
eigentlich notwendig wäre. Jemand, der wirklich am Lernen interessiert 
ist, wird das hoffentlich als willkommene Anregung verstehen. Jemand, 
der nur eigene Anstrengung vermeiden möchte, dürfte mit der Lösung 
dagegen nicht glücklich werden (und wird hoffentlich nicht dumm genug 
sein, eine Lösung, die er nicht wirklich versteht als seine eigenen zu 
verkaufen).

von Peter Z. (Gast)


Lesenswert?

A. H. schrieb:
> Ich weiß, es mag auch etwas gemein sein, ist aber ein Stück weit auch
> Methode:

Ich schau mal ob ich meinen Account hier löschen kann!

von Micha (Gast)


Lesenswert?

über die Frage des TO können wir uns wohl hier zu Tode spekulieren, es 
fehlen einfach paar Hintergrundinformationen, warum wieso weshalb...

Maddel: nimm dir die Zeit und lies mal hier rein:
http://www.c-howto.de/
Mich hats auch gehelft ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.