Toon posts:

[C] Queue in Turbo C 2.0

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik moet wegens een schoolopdracht een queue maken in Turbo C 2.0 (moet draaien onder PC-Xinu). Nou heb ik het volgende probleem, ik wil de queue maken als dubbel gelinkte lijst. Ik heb de volgende code (definitie van structs voor de queue):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct 
{
   int procId;
   int prioriteit;
   int time;
} Job;

struct QueueItem
{
   QueueItem *prev;
   QueueItem *next;
   Job *job;
}


Als ik dit ga compileren dan zegt de compiler bij de definitie van QueueItem en de regel QueueItem *prev; : declaration missing, en bij QueueItem * next; : redeclaration of QueueItem.
Hoe kan ik in hemelsnaam een gelinkte lijst maken als ik items in een struct niet van hetzelfde type kan laten zijn als de struct zelf?
Heb al gezocht naar queue's voor Xinu maar daar worden ze allemaal als array geimplementeerd, dit is op zich wel een optie maar de queue moet gesorteerd zijn en er moeten items in geplaatst kunnen worden en uit verwijderd kunnen worden en dan zit je dus met opschuif problemen in de array waar ik geen zin in heb.

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
probeer het zo eens :

code:
1
2
3
4
5
6
struct QueueItem
{
   struct QueueItem *prev;
   struct QueueItem *next;
   struct Job *job;
};

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Ten eerste iets wat niet direct wat je vraag te maken heeft: waarom is de job-member van je QueueItem een pointer naar Job, in plaats van een job struct zelf?

Wat betreft je feitelijke probleem: sla je C-boek eens na over het werken met struct-typen. Een type gedefinieerd als "struct t" moet je ook als "struct t" specificeren in je code. In plaats van "QueueItem *prev" moet het dus (bijvoorbeeld) "struct QueueItem *prev" worden.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Lone Gunman schreef op 29 april 2003 @ 01:30:
probeer het zo eens :

code:
1
2
3
4
5
6
struct QueueItem
{
   struct QueueItem *prev;
   struct QueueItem *next;
   struct Job *job;
};
Nee, die Job is juist een type (dat naar een anonieme struct verwijst) en geen struct! Nog maar even samenvatten:
C:
1
2
3
4
5
6
7
struct aap { };  /* definieert een type genaamd "struct aap" */
struct { } noot; /* definieert een variabele van een anoniem type */
struct mies { }; /* definieert een variabele van een type genaamd "struct mies" */
typedef struct vuur { } mus; /* definieert een type genaamd "mus" én
                                een type genaamd "struct vuur" */
typedef struct { } pim; /* definieert een type genaamd "pim"
                                (alias voor een anoniem type) */

[ Voor 11% gewijzigd door Soultaker op 29-04-2003 01:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik wil even aan de post van Soultaker toevoegen dat als je een typedef doet, het nieuwe type pas na die typedef bekend is. Met andere woorden, dit werkt niet:

C:
1
2
3
4
typedef struct aap_struct
{
    aap * next;
} aap;


Je kunt structs ook van tevoren declareren (dwz dat je alleen aangeeft dat er een struct is met een bepaalde naam, zonder dat je de members definieert). Zolang je pointers naar een gedeclareerde, maar niet gedefinieerde, struct gebruikt is het geen enkel probleem. Pas als je iets doet met de members ervan, of een variabele definieert met als type die struct, is de definitie wel nodig.

Dit werkt dus ook:

C:
1
2
3
4
5
6
7
8
9
10
struct aap_struct;
typedef struct noot_struct noot;

struct mies
{
    struct aap_struct * a;  /* ok */
    struct noot_struct * b; /* ok */
    noot * c;               /* ok */
    noot d;                 /* fout! geen pointer */
};


en dus kun je ook in jouw geval:

C:
1
2
3
4
5
6
7
typedef struct QueueItem QueueItem;

struct QueueItem
{
    QueueItem * prev, * next;
    Job * job;
};

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
he bedankt allemaal, was nogal stomme fout van me.
Ten eerste iets wat niet direct wat je vraag te maken heeft: waarom is de job-member van je QueueItem een pointer naar Job, in plaats van een job struct zelf?
Eigenlijk geen idee, maakt op zich toch niet zoveel uit of het een pointer is of niet.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Efficientie :)
Er zijn minder geheugenallocaties nodig, wat ook weer zorgt voor minder potentiele memory leaks

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Behalve efficientie, is het ook veeeeeeeel makkelijker om niet over allocatie, deallocatie of indirectie na te hoeven denken. Als er geen goede reden is om het anders te doen, kun je doorgaans het beste de makkelijkste weg kiezen. :)
Pagina: 1