Struct probleempje

Status
Niet open voor verdere reacties.

Jori13

Gebruiker
Lid geworden
18 jan 2010
Berichten
159
Hallo,

Ik heb een probleem en ik heb geen idee wat ik fout doe. Ik ben al aardig ervaren in C. Ik was bezig met een struct, en dat werkt niet, terwijl ik toch heel zeker weet dat ik precies hetzelfde doe als in mijn studieboek word aangegeven (De programmeertaal C, Al Kelley et alii).

Ik heb een header file:

[CPP]
#define MAX_ELEMENTS 50

struct var_tree
{
char* var_name;
char* var_value;
int var_type;
int var_is_const;
};

typedef struct var_tree var_tree;
[/CPP]

En die header file wordt geïmplementeerd in deze file:

[CPP]
#include <stdio.h>
#include "var.h"

void f(var_tree *[]);

int main(void)
{
var_tree var[MAX_ELEMENTS];

f(var);

return 0;
}


void f(var_tree *var_table[])
{
var_table[0]->var_name = "...";
}
[/CPP]

Dit werkt niet. Ik gebruik als OS OpenSUSE en compileer dit met de GCC compiler.


Alvast bedankt,
Jori.
 
Laatst bewerkt:
Wat werkt er precies niet? Geeft de compiler een fout? Wat is die fout dan?

Wat me zo gauw opvalt: je roept op regel 10 een functie x() aan, waar is die gedefinieerd dan? Bedoelde je niet f()?
 
De compiler klaagt over ->, in plaats daarvan ziet hij liever de .. En dat andere was een typfoutje :P (niet het probleem zelf dus).
 
Het is geen goed idee om je struct en je typdef dezelfde naam te geven, dat is vragen om problemen. Misschien kan je jouw struct dan beter als volgt definiëren:[CPP]typedef struct
{
char* var_name;
char* var_value;
int var_type;
int var_is_const;
} var_tree;[/CPP]

Vervolgens moet je eens goed kijken naar wat je als functieargument hebt gedefinieerd en naar wat je meegeeft aan de call, dit is namelijk niet hetzelfde type..
 
Het is geen goed idee om je struct en je typdef dezelfde naam te geven, dat is vragen om problemen. Misschien kan je jouw struct dan beter als volgt definiëren:[CPP]typedef struct
{
char* var_name;
char* var_value;
int var_type;
int var_is_const;
} var_tree;[/CPP]

Dat maakt echt niets uit. Beide varianten worden gebruikt en getolereerd in C.

Vervolgens moet je eens goed kijken naar wat je als functieargument hebt gedefinieerd en naar wat je meegeeft aan de call, dit is namelijk niet hetzelfde type..

Dat snap ik niet, volgens mij zijn de allebei gewoon van het type var_tree
 
Het ging mij ook niet over de C-style vs de C++-style definitie van de struct, wel om het feit dat je je struct var_tree noemt en je typedef ook de naam var_tree geeft, wat voor verwarring kan zorgen.

Je variable var is gedefiniëerd als var_tree[], het argument van je functie verwacht een var_tree*[]
Iets declareren met de arraynotatie is trouwens identiek aan het declareren als pointer.

Je variable is een var_tree-pointer, je functieargument een dubbelpointer.
 
[CPP]
#include <stdio.h>
#include <stdlib.h>

#include "var.h"


void x(var_tree **);


int main(void)
{
var_tree **var;
var = malloc(MAX_ELEMENTS * sizeof(var_tree));

/* Waarden toewijzen */
x(var);

printf("%s", var[0]->var_name);

return 0;
}


void x(var_tree **var_table)
{
var_table[0]->var_name = "Dit is een string";
} [/CPP]

Hij compileert nu zonder warnings of errors. In plaats daarvan geeft hij de bekende 'Segmantation fault'. Ik doe vast iets fout met malloc(), maar wat :)?
 
Klopt, je "malloct" alleen "var", niet de elementen in "var". Zo doet hij het wel:
[cpp]int i;
var_tree **var;
var = (var_tree**) malloc(MAX_ELEMENTS * sizeof(var_tree*));
for(i=0;i<MAX_ELEMENTS;i++)
{
var = (var_tree*) malloc(sizeof(var_tree));
}[/cpp]
 
Bedankt voor je reactie,

Ik zal het uittesten zodra ik thuis ben.

Alleen snap ik niet goed waarom elk element nog expliciet ruimte toegewezen moet krijgen.

[CPP]MAX_ELEMENTS * sizeof(var_tree*)[/CPP]

Bewerkstelligt dat toch al?
 
je alloceert met dat eerste statement plaats voor MAX_ELEMENTS van het type var_tree*, dus je reserveert plaats voor de pointers: enkel en alleen maar de pointers.

Die var_tree pointer moeten elk dan ook nog naar een echte var_tree wijzen, en voor die echte var_tree-objecten heb je nog geen plaats voorzien. Daarom is die lus nodig.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan