Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

10.04.2016, 19:09

Gab es nicht mal ein Compilerflag der ANSI C erzwingt?

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

12

10.04.2016, 19:13

Zum Glück bleibt es nur bei dieser Aufgabe. Wir nutzen im Unterricht eigentlich nur Java :fie:
Ich nehme an, dass ich mit folgendem Code die Aufgabe ("Schreibe eine Warteschlange in Standard C Code!") gelöst habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef US_QUEUE_H
#define US_QUEUE_H

typedef struct Queue Queue_t;

Queue_t*    createQueue();
void        destroyQueue(Queue_t* pQueue);

void        enque(Queue_t*  pQueue, void* pData);
void*       deque(Queue_t*  pQueue);

#endif  // US_QUEUE_H


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <Queue.h>
#include <assert.h>
#include <stdlib.h>

//---------------------------------------------------------------------------------
//  IMPLEMENTATION DETAILS
//---------------------------------------------------------------------------------

typedef struct Node Node_t;
struct Node{
  Node_t*   pNextNode;
  void*     pData;  
};

Node_t*     createNode(void* pData){
    Node_t* pNode       = (Node_t*) malloc(sizeof(Node_t));
    pNode->pNextNode    = 0;
    pNode->pData        = pData;
    return  pNode;
}

void        appendNode(Node_t* pParent, Node_t* pNodeToAppend){
    assert(0 != pParent);
    if(0 != pParent->pNextNode)
        appendNode(pParent->pNextNode, pNodeToAppend);
    else
        pParent->pNextNode  = pNodeToAppend;
}

void        deleteLine(Node_t*  pNode){
    if(0 != pNode->pNextNode)
        deleteLine(pNode->pNextNode);
    free(pNode);
}

//---------------------------------------------------------------------------------
//  ACTUAL IMPLEMENTATION
//---------------------------------------------------------------------------------

struct Queue{
    Node_t* pFirstNode;
    Node_t* pLastNode;  
};

Queue_t*    createQueue(){
    Queue_t* pQueue     = (Queue_t*) malloc(sizeof(Queue_t));
    pQueue->pFirstNode  = 0;
    pQueue->pLastNode   = 0;
    return pQueue;
}

void        destroyQueue(Queue_t*   pQueue){
    assert(0 != pQueue);
    if(0 != pQueue->pFirstNode)
        deleteLine(pQueue->pFirstNode);
    free(pQueue);
}

void        enque(Queue_t*  pQueue, void* pData){
    assert(0 != pQueue);
    Node_t* pNode = createNode(pData);
    appendNode(pQueue->pLastNode, pNode);
    pQueue->pLastNode = pNode;
}

void*       deque(Queue_t*  pQueue){
    assert(0 != pQueue);
    
    if(0 == pQueue->pFirstNode)
        return 0;
    
    Node_t* pNode = pQueue->pFirstNode;
    void*   pData = pNode->pData;
    pQueue->pFirstNode = pQueue->pFirstNode->pNextNode;
    free(pNode);
    return pData;
}


LG Julién

P.S.: Mir ist bewusst, dass der Code nicht gerade gut ist. Aber gut genug für den "Lehrversuch" von Informatik in der 12ten.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (10.04.2016, 19:46)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

10.04.2016, 19:42

Enqueue und dequeue ;) und warum deleteLine statt deleteNode? Zudem sollte das Lesen aus einer leeren Queue einen Fehler verursachen. Es fehlt eine Funktion zum Abfragen, ob die Queue leer ist.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

14

10.04.2016, 19:48

Oh, Danke. Hatte gerade eben ein Post Scriptum angefügt :)
Die Rechtschreibfehler sollten dennoch nicht passiert haha.

Meinst du mit leere Queue "pQueue = NULL" oder das kein Element gerade in der Queue ist?

EDIT:
'deleteLine' statt 'deleteNode' weil ich dachte, dass es nicht wirklich eindeutig sein könnte,
sollte ich den Code tatsächlich wieder ausgraben. Man könnte anfangs denken, dass nur EIN Node gelöscht wird.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

10.04.2016, 20:25

Das Problem ist, dass du deinen C Code offenbar durch den C++ Compiler schickst. Verwend eben den C Compiler (Dateiendung .c oder /Tc Flag in den Properties > C/C++ > Advanced > Compile As).

Eine Frage bleibt natürlich: Wieso um alles in der Welt musst du reines C verwenden?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

16

11.04.2016, 10:59

Eine Frage bleibt natürlich: Wieso um alles in der Welt musst du reines C verwenden?

An der Uni ist es durchaus üblich, Grundlagen von C zu lernen, um die Mechanik hinter vielen Dingen zu verstehen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

17

11.04.2016, 13:54

Von der Uni bin ich noch etwa 10 Wochen entfernt. Das war jetzt für den normalen Informatikunterricht in der 12ten.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

11.04.2016, 15:37

OK, in dem Fall hast du ja keine Wahl und findest die Lösung für dein Problem in meiner Antwort oben. Ich frag nur nach, weil rein prinzipiell der einzige rationale Grund heutzutage noch C zu verwenden der ist, dass es für eine Zielplattform keinen vernünftigen C++ Compiler gibt (und solche Plattformen trifft man heutzutage auch eher nur extrem selten an)... ;)

Werbeanzeige