[C] dynamische data

Pagina: 1
Acties:

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Ik ben bezig met een tooltje onder Linux wat wat handelingen met een database moet doen. Gegevens die bij een query horen sla ik op in een struct:

code:
1
2
3
4
5
6
typedef struct {
    char id[10];
    char naam[50];
    char titel[50];
    char email[50];
} mailInfo;


Nu wil ik eigenlijk tijdens runtime deze struct bepalen, zodat hij voor elk veld van de gekozen tabel een struct aanmaakt waar alle veld-data in past.

Het zal vastheel simpel zijn of enorm stom, ben maar een C noop :P

alvast bedankt

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je wilt dus dynamisch een type creeëren?
Dat kan niet.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt natuurlijk wel gewoon een soort van hashtable maken waarin je de velden opslaat

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
.oisyn schreef op 10 October 2003 @ 15:55:
Je kunt natuurlijk wel gewoon een soort van hashtable maken waarin je de velden opslaat
Maar dan is iedere entry in je hashtable natuurlijk wel van hetzelfde type.

https://fgheysels.github.io/


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
whoami schreef op 10 October 2003 @ 15:56:
[...]


Maar dan is iedere entry in je hashtable natuurlijk wel van hetzelfde type.
prima, moet toch allemaal van type char zijn....

kan iemand misschien een voorbeeldje geven!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

whoami schreef op 10 October 2003 @ 15:56:
Maar dan is iedere entry in je hashtable natuurlijk wel van hetzelfde type.
Elke entry wel ja, maar die entry kan natuurlijk wel elk type encapsuleren
kan iemand misschien een voorbeeldje geven!
[google=hashtable c]

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.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
.oisyn schreef op 10 October 2003 @ 16:04:
[...]


Elke entry wel ja, maar die entry kan natuurlijk wel elk type encapsuleren


[...]

[google=hashtable c]
bedankt, ik zal er naar kijken.. ben niet bekent met een hashtable... misschien kan ik beter een variabel aantal variabelen doorgeven aan een functie...

ik kan iig weer verder! Bedankt...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Denk ik nu te simpel? :?
C:
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
typedef struct {
    char* id;
    char* naam;
    char* titel;
    char* email;
} mailInfo;

// Optie 1
mailInfo* GenerateMailInfo(int idLen, int naamLen, int titelLen, int emailLen)
{
mailInfo* mail = malloc(sizeof(mailInfo));
mail->id       = malloc(idLen + 1);
mail->naam     = malloc(naamLen + 1);
mail->titel    = malloc(titelLen + 1);
mail->email    = malloc(emailLen + 1);
retrun mail;
}

// Optie 2
void AllocAndCopyString(char** Target, char* Source)
{
*Target = malloc(strlen(Source) + 1);
strcpy(*Target, Source);
}

mailInfo* GenerateMailInfo(char* id, char* naam, char* titel, char* email)
{
mailInfo* mail = malloc(sizeof(mailInfo));
AllocAndCopyString(&mail->id, id);
AllocAndCopyString(&mail->naam, naam);
AllocAndCopyString(&mail->titel, titel);
AllocAndCopyString(&mail->email, email);
return mail;
}

* curry684 zal wel weer weekend nodig hebben.... 8)7

Professionele website nodig?


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
curry684 schreef op 10 October 2003 @ 16:52:
[...]

* curry684 zal wel weer weekend nodig hebben.... 8)7
Ja want, die data (id, naam. titel en email) geldt voor deze test database... maar dit kan van alles worden... en ik ben niet van plan voor elke afnemer straks een eigen executable te maken voor hun specifieke database :)

Maar bedankt voor de moeite!!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

TormentoR schreef op 10 October 2003 @ 17:15:
[...]
Ja want, die data (id, naam. titel en email) geldt voor deze test database... maar dit kan van alles worden... en ik ben niet van plan voor elke afnemer straks een eigen executable te maken voor hun specifieke database :)
Ah je wilt de velden dynamisch bepalen en niet de lengtes 8)7

Leg het dan duidelijk uit ;) :z

Professionele website nodig?


Verwijderd

hmm misschien een linked list van velden?

zoiets dus :
C:
1
2
3
4
5
6
7
8
9
typedef struct 
{
  void *pData;
  unsigned long ulDatalen;
  char *szVeldnaam;
  unsigned long ulVeldnaamlen;
  unsigned long ulDatatype;
  struct veldnode *pNext;
} veldnode;


edit : @curry :
Ah je wilt de velden dynamisch bepalen en niet de lengtes

Leg het dan duidelijk uit
reacties op TS lezen doet wonderen ;)

[ Voor 25% gewijzigd door Verwijderd op 11-10-2003 15:14 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
TormentoR schreef op 10 October 2003 @ 15:51:
Ik ben bezig met een tooltje onder Linux wat wat handelingen met een database moet doen. Gegevens die bij een query horen sla ik op in een struct:

code:
1
2
3
4
5
6
typedef struct {
    char id[10];
    char naam[50];
    char titel[50];
    char email[50];
} mailInfo;


Nu wil ik eigenlijk tijdens runtime deze struct bepalen, zodat hij voor elk veld van de gekozen tabel een struct aanmaakt waar alle veld-data in past.

Het zal vastheel simpel zijn of enorm stom, ben maar een C noop :P

alvast bedankt
Is het niet eenvoudiger C++ te gebruiken?
std::map in plaats van de struct lijkt me erg geschikt.
Dan weer een std::vector of std::list daarvan en je bent klaar.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Waarom niet strdup in plaats van AllocAndCopyString?

[ Voor 3% gewijzigd door Olaf van der Spek op 11-10-2003 16:16 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

OlafvdSpek schreef op 11 oktober 2003 @ 16:06:
[...]

Waarom niet strdup in plaats van AllocAndCopyString?
Zelfde, ik gebruik de 'obscuurdere' functies van stdclib ook niet dagelijks :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 11 October 2003 @ 15:11:
hmm misschien een linked list van velden?
En in plaats van een lijst kun je dan beter een binaire boom gebruiken, dat zoekt sneller ;)
Of een hashtree, zoals ik al voorstelde, dan zoek je in theorie in constante tijd

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.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Het wil nog niet helemaal lukken...

Ik dacht in het begin wel genoeg aan C te hebben, nu komt het OO aspect wel goed uit eigenlijk... ik zal eens proberen om het hele projectje te herschrijven naar C++

Maar eigenlijk wil ik hememaal geen lijst hebben maar puur losse objecten, iets wat met C++ dus heel makkelijk is.. zoals OlafvdSpek al zei!

[ Voor 4% gewijzigd door Akerboom op 13-10-2003 13:27 . Reden: [user/ ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

OlafvdSpek schreef op 11 October 2003 @ 16:05:
[...]

Is het niet eenvoudiger C++ te gebruiken?
std::map in plaats van de struct lijkt me erg geschikt.
Dan weer een std::vector of std::list daarvan en je bent klaar.

Van elke rij een aparte map maken lijkt me eerlijk gezegd niet zo'n handig idee. Dat is niet echt efficient namelijk, zowel performancewise als memorywise. Dan kun je het beter andersom doen, dus een map<string, vector<string> > zeg maar.

Maar ik zou gewoon een 2d array van strings maken, en een map om de index bij de colomnaam te vinden, en dat encapsuleren in een ResultSet klasse met handige functies.

[doordraaf-modus]
En daar kun je dan weer een mooie template klasse omheen bouwen die je data fetcht naar een struct of class aan de hand van een map<string, string T::*> en evt. nog automatische typeconversie toepast ;)
[/doordraaf-modus]

[ Voor 3% gewijzigd door .oisyn op 13-10-2003 14:30 ]

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.

Pagina: 1