User since
2003-08-04
1706
Artikel
HausmeisterIn
Angenommen ich mach eine Typdefinition auf ein struct in einer Headerdatei und definiere einen Funktionsprototyp, kann ich ihn einfach in der main.c aufrufen bzw. den neuen Typ verwenden?
Ich bekomme Fehlermeldung von impliziter Funktionsdeklaration oder Typdeklaration obwohl ich die Header-Datei mit #include eingebunde habe. Hier mal die betroffenen Dateien:
main.c:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>
#include <glib.h>
#include "config.h"
// Global Variable
gchar* config_filename = "~/.adbookrc";
// Prototypen
static void print_help(void);
void get_options(gint,gchar**);
int main(gint argc,gchar* argv[])
{
// Ubergebene Parameter auswerten
get_options(argc,argv);
conf_t* c = read_configfile(config_filename);
return 0;
}
/* ein paar funktionen */
config.h
struct configuration {
gchar hostname[1024];
gchar password[1024];
gchar bindDN[1024];
gshort version;
};
typedef struct configuration conf_t;
conf_t* read_configfile(gchar*);
config.c
conf_t* read_configfile(gchar* filename) {
FILE* fs = NULL;
gint line = 1;
conf_t* c;
/* haufen code */
return c;
}
Als ausgabe des Makeaufrufs mit Anjuta bekomme ich immer folgenden Output:
http://phpfi.com/135836
Kann mir jemand helfen. Ich dachte wenn ich es mit #include in main einbinde kann ich auch alles was in der datei deklariert wurde in main.c verwenden.
Gruß Alex\n\n
<!--EDIT|format_c|1154105607-->
User since
2003-08-04
7321
Artikel
ModeratorIn
sieht es denn auch so aus
config.h
#ifndef __CONFIG_H__
#define __CONFIG_H__
struct configuration {
gchar hostname[1024];
gchar password[1024];
gchar bindDN[1024];
gshort version;
};
typedef struct configuration conf_t;
conf_t* read_configfile(gchar*);
#endif
config.c
#include "config.h"
conf_t* read_configfile(gchar* filename) {
FILE* fs = NULL;
gint line = 1;
conf_t* c;
/* haufen code */
return c;
}
User since
2003-08-04
7321
Artikel
ModeratorIn
und wo complierst du confg.c ?
du musst ja das erhaltene config.o an das ganze anlinken!
User since
2003-08-04
1706
Artikel
HausmeisterIn
Bringt weniger fehler. Aber den Typ conf_t und die Funktion kennt er immer noch nicht.
Gruß Alex
User since
2003-08-21
2614
Artikel
ModeratorIn
[quote=esskar,28.07.2006, 19:33]und wo complierst du confg.c ?
du musst ja das erhaltene config.o an das ganze anlinken![/quote]
Das wuerde wahrscheinlich danach erst kompiliert werden und dann erst gelinkt werden. Aber make bricht ab, weil main.c schon nicht kompiliert werden kann. Um conf_t beim Kompilieren von main.c zu benutzen, braucht man eigentlich noch nicht config.o.
Ich wuerde in config.h auch noch die ganzen Headerdateien einbinden, in denen gchar definiert wird.
Aber das hilft auch alles nichts bei dem Problem. Da weiß ich keine Loesung, sorry. Ich kann es auch nicht reproduzieren.\n\n
<!--EDIT|betterworld|1154115128-->
User since
2003-08-04
1706
Artikel
HausmeisterIn
Problem gelöst. Das Problem ist, dass ich mit Anjuta programmiere. War ein einfacher Bedienungsfehler, so dass config.c nicht in Makefile.am übernommen wurde.
Danke nochmal
Gruß Alex
User since
2005-09-08
300
Artikel
BenutzerIn
@format_c
Nur mal so ein Tipp: Dein "struct configuration" beinhaltet u.a. drei Arrays a 1KB, also rund 3KB. Wenn man bedenkt, daß ein Hostname, ein Paßwort bzw. eine Bind-DN im Normalfall deutlich kürzer ist, ist das eine ziemliche Verschwendung von Speicher.
Warum nicht so:
struct configuration {
gchar *hostname;
gchar *password;
gchar *bindDN;
gshort version;
};
Beim Anlegen der Struktur kannst Du dann den tatsächlich benötigten Speicherplatz allokieren (malloc()). Ich würde das Allokieren in einer Funktion SetConf(...) durchführen und analog eine Funktion UnsetConf(...) schreiben, die den Speicherplatz wieder freigibt.
Denk' mal drüber nach.
Gruß, Doc
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=docsnyder,12.09.2006, 13:18]Nur mal so ein Tipp: Dein "struct configuration" beinhaltet u.a. drei Arrays a 1KB, also rund 3KB. Wenn man bedenkt, daß ein Hostname, ein Paßwort bzw. eine Bind-DN im Normalfall deutlich kürzer ist, ist das eine ziemliche Verschwendung von Speicher.[/quote]
je nach byte alignment sogar noch mehr!
User since
2005-09-08
300
Artikel
BenutzerIn
Yep, esskar: ich weiss, "Du" verstehst das! (über das Alignment traue ich mich ja mittlerweile schon garnicht zu reden, das versteht ja heute keiner mehr! )
Aber leider gibt es soooviele newbies. Dagegen ist ja auch nichts zu sagen, aber viele von ihnen sollten das Programmieren lieber ganz sein lassen, oder zumindest garnicht erst versuchen, bzw. sich in mangelndem Verständnis von Grundsätzen nicht gerade in dem heiligen Perl tummeln.
Manchmal muß ich lesen, daß jemand noch nichteinmal etwas von Schleifen, Rekursion, RegEx (wenn man in Perl programmieren will, muß man doch irgendeine Idee über die Sprache, über ihre Stärken mit sich tragen, oder?), usw. gehört hat. Sorry, aber da hört es auf. Auf diesem Niveau sollte man vieleicht mit BASIC anfangen (Nomen est Omen! ), aber doch bitte nicht mit Perl! Ich weiss nicht, wie Du das siehst, aber mir tut's fast weh.
Ich versuche garnicht erst, einen Stuhl zu bauen, der vielleicht, ausser daß er stehen bleibt, sogar noch bequem sein soll. Nein, das überlasse ich den Schreinern, denn die könne das. Und all die, die keinen Zugang zur Informatik haben, sollten doch bitte nicht versuchen, irgendwelche Perl-Scripte zu verfassen.
Ich rechne den guten Willen dazu ja hoch an, aber der reicht in der Regel eben nicht.
Sorry esskar, daß ich mich gerade bei Dir darüber auslasse, denn Du kannst am wenigsten dafür. Du bist absolut kompetent und hilfst jedem. Will mich halt nur mal an Deiner Schulter ausweinen, denn Du kannst es vielleicht am ehesten verstehen.
Gruß, Doc\n\n
<!--EDIT|docsnyder|1158091000-->