Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1150[/thread]

Verständnisproblem #include "datei.h"

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
format_c
 2006-07-28 20:50
#11493 #11493
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
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:
Code: (dl )
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
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
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
Code: (dl )
1
2
3
4
5
6
7
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-->
esskar
 2006-07-28 21:32
#11494 #11494
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
sieht es denn auch so aus

config.h
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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
Code: (dl )
1
2
3
4
5
6
7
8
9
#include "config.h"

conf_t* read_configfile(gchar* filename) {
FILE* fs = NULL;
gint line = 1;
conf_t* c;
/* haufen code */
return c;
}
esskar
 2006-07-28 21:33
#11495 #11495
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
und wo complierst du confg.c ?
du musst ja das erhaltene config.o an das ganze anlinken!
format_c
 2006-07-28 21:36
#11496 #11496
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Bringt weniger fehler. Aber den Typ conf_t und die Funktion kennt er immer noch nicht.

Gruß Alex
esskar
 2006-07-28 22:36
#11497 #11497
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
zeig mal dein Makefile
betterworld
 2006-07-28 23:30
#11498 #11498
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[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-->
format_c
 2006-08-07 13:39
#11499 #11499
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
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
docsnyder
 2006-09-12 15:18
#11500 #11500
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@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:
Code: (dl )
1
2
3
4
5
6
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
esskar
 2006-09-12 21:30
#11501 #11501
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[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!
docsnyder
 2006-09-12 23:48
#11502 #11502
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
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-->
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-07-28 20:50.