Queue mit Fließkommazahlen



  • Versteh das nicht falsch, aber bin mir sowieso nich ganz sicher ob ich die Funktion von "->" verstanden habe und dann benutzt du es gleich doppelt.
    Das was du mit den Print-Befehlen meintest ist nachvollziehbar muss ich aber wohl nicht unbedingt haben. Es würde mir ertsmal reichen, wenn die Zahlen in die Queue gebracht würden und dann auch gelöscht werden könnten.
    Und wenn ich das jeweils erste Element der Queue anzeigen lassen könnte.

    Mfg
    Neuerneuneu



  • Neuerneuneu schrieb:

    Wäre euch sehr dankbar, wenn ich möglichst nachvollziebare Eklärungen bekomen würde.

    naja, der code ist ziemlicher mist, voller bugs und so. nimm am besten ein array, einen schreib- und einen lesezeiger. einfügen kannste, wenn (schreibzeiger+1) != lesezeiger und auslesen, wenn lesezeiger != schreibzeiger ist. bei jedem zugriff dann schreib- bzw. lesezeiger (+1) mod arraygrösse weiterwandern lassen.
    🙂



  • Das mit dem Array lass lieber sein. Es ist einfach falsch. Wenn du das return in die dequeue-Funktion packst funktioniert es schon.



  • nwp2 schrieb:

    Das mit dem Array lass lieber sein. Es ist einfach falsch.

    garnicht. komplett malloc-los, schnell und zuverlässig.
    🙂



  • Es ist deutlich weniger mächtig weil weniger Elemente möglich sind und verschwendet reichlich Speicher der wegen dem hin und hergeswappe auch die Performance drückt. Aber gut, da hier alle denken dass malloc böse ist hat es keinen Sinn.



  • nwp2 schrieb:

    Aber gut, da hier alle denken dass malloc böse ist hat es keinen Sinn.

    mach doch endlich mal den pro/contra malloc-thread auf (hat doch schon mal einer hier vorgeschlagen), dann können wir und genüsslich darüber auslassen.
    🙂



  • Mach doch selber :p





  • Danke für die bisherigen Einträge. Das return hab ich eingefügt. Jedoch wird mir bei allen "->" Operatoren in der dequeue-Funktion vom Compiler invalid type of argument ausgegeben.
    Zudem zeigt mir der Compiler bei der front-Fuktion an, dass das mit ptr->erst nicht geht. Was heißt denn genau mein erstes Element in der Queue?

    MfG
    Neuerneuneu



  • ich hab wenig lust mir das anzuschauen wenn du willst das ich da mal drüber schau beschäftige dich mal mit deinem Programmierstil einen anfangs link findest

    http://de.wikipedia.org/wiki/Programmierstil
    http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil

    wenn du damit fertig bist und nen sauberen quellcode hast dann poste den doch nochmal. dann geht sicher was vorwärts...

    kleine anmerkungen über du dir gedanken machen solltest
    1. Fliesskommazahl wird nirgends beschrieben
    float Fliesskommazahl;

    2. rückgabe von malloc wird nicht gecastet und nicht überprüft ob es NULL ist
    erst->next=(struct Queueelement 😉 malloc(sizeof(struct Queueelement));



  • achso und ptr->erst gibt es nicht...

    und sowas geht auch nicht
    printf("Die erste Zahl in der Queue ist die %f.",ptr->erst);

    eher
    printf("Die erste Zahl in der Queue ist die %f.",ptr->Fliesskommazahl);



  • aber das machst am besten alles nochmal neu...

    lg lolo



  • ich war mal so nett und hab das für dich übernommen auch wenns nicht das gelbe vom ei ist und ;fricky sicher nicht gefällt 🤡

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _fifoNode{
    	float value;
    	struct _fifoNode *next;
    }fifoNode;
    
    typedef struct _fifo{
    	fifoNode *first;
    	fifoNode *last;
    }fifo;
    
    int push(fifo *stack,float data){
    	fifoNode *n = malloc(sizeof(fifoNode));
    	if(n!=NULL){
    		n->next = NULL;
    		n->value = data;
    		if(stack->last==NULL){
    			stack->last = stack->first = n;
    		}else{
    			stack->last->next = n;
    			stack->last = n;
    		}
    		return 1;
    	}
    	printf("buffer overrun");
    	return 0;
    }
    
    float pop(fifo *stack){
    	fifoNode *n = stack->first;
    	float ret = 0;
    	if(n!=NULL){
    		stack->first = n->next;
    		if(stack->first == NULL)
    			stack->last = NULL;
    		ret = n->value;
    		free(n);
    	}else{
    		printf("buffer underrun");
    	}
    	return ret;
    }
    
    int main(void) {
    	fifo stack;
    	stack.first = NULL;
    	stack.last = NULL;
    	push(&stack,1.0);
    	push(&stack,2.0);
    	push(&stack,3.0);
    	push(&stack,4.0);
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	push(&stack,1.0);
    	push(&stack,2.0);
    	push(&stack,3.0);
    	push(&stack,4.0);
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	return 0;
    }
    


  • noobLolo schrieb:

    ...und ;fricky sicher nicht gefällt

    hihi, was mir nicht gefällt ist: du schreibst 'stack' und 'fifo', dabei ist ein stack doch eigentlich ein 'lifo' *fg* und eigentlich hast du eine queue aus verketteten listen gebaut.
    aber wenigstens castest du 'malloc' nicht und testest sogar auf 0. *daumen_hoch*
    🙂



  • Vielen Dank für deinen Einsatz nooblolo.
    Leider ist nur die Struktur, die ich hatte, mit:

    struct Queue{};
    struct Queueelement{};
    struct Queue q;

    void enqueue(struct Queue *q, float z);
    float dequeue(struct Queue *q);
    float front(struct Queue q);

    schon vorgegeben.
    Ich verzweifle einfach an der Aufgabe.

    MfG
    Neuerneuneu



  • Neuerneuneu schrieb:

    Leider ist nur die Struktur, die ich hatte, mit:
    ...
    schon vorgegeben.

    dann nimm doch noobLolos code und tausch' einfach die bezeichner aus.
    🙂



  • Das wäre einen Versuch Wert.
    Nur weiß ich nich genau, wo nooblolo:
    struct Queue q;
    benutzt.

    Außerdem zeigt mir der Compiler hier:

    int push(fifo *stack,float data){ 
        fifoNode *n = malloc(sizeof(fifoNode));
    

    einen Fehler an: invalid conversion from `void*' to `fifoNode*'.

    MfG
    Neuerneuneu



  • Neuerneuneu schrieb:

    Nur weiß ich nich genau, wo nooblolo:
    struct Queue q;
    benutzt.

    das macht er am anfang der main:

    int main(void) 
    {
       fifo stack;  // <--- Queue q 
       ...
    

    Neuerneuneu schrieb:

    ...einen Fehler an: invalid conversion from `void*' to `fifoNode*'.

    du benutzt wahrscheinlich einen c++-compiler, das typsystem von C++ hat hier eine leicht hirnrissige einschränkung. benenn deinen code in .C um, dann sollte deine IDE den C-compiler anwerfen.
    🙂



  • ;fricky schrieb:

    du schreibst 'stack' und 'fifo', dabei ist ein stack doch eigentlich ein 'lifo'

    😮 das hatte ich irgendwie falsch in erinnerung dachte ein stack kann entweder fifo oder lifo sein

    Neuerneuneu schrieb:

    Außerdem zeigt mir der Compiler hier: ... invalid conversion from `void*' to `fifoNode*'.

    du quälst meinen code aber nicht durch nen c++ compiler oder?



  • Sry war mein Fehler.
    Jetzt funktionierts!!!!
    Vielen Dank Jungs, habt mir echt sehr geholfen!
    Guten Rutsch!^^

    MfG
    Neuerneuneu


Anmelden zum Antworten