Problem mit starg
-
Hallo,
ich habe ein Problem mit der Bib stdarg.h.
Ich möchte diese benutzen, um eine allgemeingültige Fehlermeldungsroutine zu definieren (siehe folgend:)#include <stdio.h> #include <stdarg.h> void senderrmsg(char *routine, char *message, ...) { va_list arg_ptr; va_start(arg_ptr, message); printf( "********************************************************************************\n"); printf("> ERROR@[%s]: ", routine); vprintf(message, arg_ptr); va_end(arg_ptr); }
Wenn ich die Routine im Hauptprogramm rufe bzw. den header einbinde, erhalte ich komischerweise einen Fehler, dass eine ganz andere Routine nicht korrekt abgeschlossen wurde.
LANG=E gcc -o tec360.exe -Wall -g -pg MAIN/main.c MAIN/allocmem.c average.c MAIN/math2.c MAIN/parse.c MAIN/readcmd.c MAIN/sendmsg.c setfilenames.c MAIN/stringutils.c main.c: In function 'senderrmsg': main.c:31: warning: 'main' is normally a non-static function main.c:98: error: expected declaration or statement at end of input allocmem.c: In function 'allocate1': make: *** [tec360.exe] Fehler 1
Hat jemand eine Idee woran das liegt?
Ich hätte weiterhin gerne noch einen Tipp, wie ich einer Funktion einen beliebigen String (< 80 Zeichen) übergeben kann und die Funktion mit Hilfe eines Flags hinter den String etwas wie "[ OK ]" schreibt.
Beispiel:> Unloading module.... [ OK ] > Loading file.... [ SUCCESS ]
Die rechte Klammer "]" des Status soll immer an der gleichen horizontalen Position stehen. Der String kann aber variieren.
Besten Dank
-
Poste doch bitte etwas mehr Code. An deiner senderrmsg-Funktion scheint's nämlich nicht zu liegen - bei mir funktioniert diese einwandfrei.
Hast du eventuell irgendwo eine Klammer vergessen?
-
#define _POSIX_SOURCE 1 #define _POSIX_ 1 #include <unistd.h> #include <dirent.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> /* *************************************************************************** */ #include "allocmem.h" #include "average.h" #include "ftypes.h" #include "globConstants.h" #include "globFilenames.h" #include "readcmd.h" #include "setfilenames.h" #include "sendmsg.h" #include "stringutils.h" #include "tecascii.h" /* *************************************************************************** */ #define CCONTAINER cntlContainer /* *************************************************************************** */ int main(int argc, char* argv[]) { int retval = 0; int zoneNum = 0; int count = 1; int i; structContainer *cntlContainer; retval = setfilenames(wrkdir, file); if (retval > 0) { senderrmsg("MAIN","Could not set filenames \"%s\".", file); exit(0); } retval = 0; ... return 0; }
Nein, ich glaube nicht, dass ich in den anderen Funktionen eine Klammer vergessen habe, denn das Programm funktioniert (DEBUGGING habe ich auch eingeschaltet in den Compiler-FLAGS), wenn ich die Headerdatei sendmsg.h und senderrmsg entferne/auskommentiere.
-
Phil270307 schrieb:
Ich hätte weiterhin gerne noch einen Tipp, wie ich einer Funktion einen beliebigen String (< 80 Zeichen) übergeben kann und die Funktion mit Hilfe eines Flags hinter den String etwas wie "[ OK ]" schreibt.
Beispiel:> Unloading module.... [ OK ] > Loading file.... [ SUCCESS ]
Die rechte Klammer "]" des Status soll immer an der gleichen horizontalen Position stehen. Der String kann aber variieren.
Ich hab' das mal so gelöst:
#include <stdio.h> #include <string.h> void print (char *todo, char *status) { char var1[64] = "> "; char var2[14] = "[ "; /* 64 >= strlen (todo) + 5 Zeichen + '\0' * 14 >= strlen (status) + 4 Zeichen + '\0' */ if (strlen (todo) < 59 && strlen (status) < 10) { sprintf (&var1[2], "%s", todo); strcpy (&var1[2 + strlen (todo)], "..."); sprintf (&var2[2], "%s", status); strcpy (&var2[2 + strlen (status)], " ]"); printf ("%-64s %14s\n", var1, var2); } } int main () { print ("Unloading module", "OK"); print ("Loading file", "SUCCESS"); return 0; }
Die Variable 'todo' fasst zwar nur max. 58 Zeichen, dafür füllt der Ausgabestring eine komplette (Konsolen-)Zeile - auf der Windowskonsole zumindest.
Du kannst die Größen ja noch variieren.
-
Phil270307 schrieb:
Nein, ich glaube nicht, dass ich in den anderen Funktionen eine Klammer vergessen habe, denn das Programm funktioniert (DEBUGGING habe ich auch eingeschaltet in den Compiler-FLAGS), wenn ich die Headerdatei sendmsg.h und senderrmsg entferne/auskommentiere.
Also muss dort der Fehler liegen?
-
Ich würde schlussfolgern, dass es an der sendmessage-Routine liegt.
-
Die besagte Methode ist aber doch sicherlich in der sendmsg.c implementiert, oder? Der Compiler meckert aber den Fehler in der main.c an.
Ergo: Schlussfolgerung falsch. Da der Fehler in der main.c angezeigt wird, und wie Du sagst nicht auftritt, wenn Du dort die sendmsg.h entfernst, muss der Fehler in der sendmsg.h liegen.
(Übrigens der einzige der drei relevanten Teile, die Du noch nicht gepostet hast :))
-
Problem gelöst.
Der Fehler wurde durch die Header-Datei verursacht.
Vielen Dank für die Hilfe.