[C] Problem mit va_start

B

Bgag

Hallo zusammen.

Ich habe gerade erst mit C angefangen und bin gerade bei dem Thema Optionale Funktionsparameter angelangt. Ich wollte nur zum Spaß eine kleine Funktion implementieren, die es mir erlaubt formatierte Ausgaben auf der Konsole zu machen. Jedoch habe ich das Problem, dass aus mir unerfindlichen Gründen der Wert für die Hintergundfarbe aus meinem letzten Funktionsaufruf übernommen wird. Ich setze ja im vierten Funktionsaufruf die Hintergrundfarbe auf Cyan und im sechsten, obwohl dort keine Hintergundfarbe deklariert wurde, ist diese ebenfalls auf Cyan gesetzt. Im siebten Aufruf wird die Hintergrundfarbe aber wieder wie gewollt auf Magenta gesetzt. Unten findet ihr die Datei, die die Funktion print enthält, um die es hier geht und darunter einen Testaufruf.

Wäre euch für eure Hilfe und einen Erläuterungen sehr dankbar.

MfG, Andy

colors.c
C:
/* define the normal formatting */
#define NORMAL "\033[0m"

/* define some font color constants */
#define FONT_BLACK 30
#define FONT_RED 31
#define FONT_GREEN 32
#define FONT_YELLOW 33
#define FONT_BLUE 34
#define FONT_MAGENTA 35
#define FONT_CYAN 36
#define FONT_GRAY 37

/* define some background color constants */
#define BG_BLACK 40
#define BG_RED 41
#define BG_GREEN 42
#define BG_YELLOW 43
#define BG_BLUE 44
#define BG_MAGENTA 45
#define BG_CYAN 46
#define BG_GRAY 47

/* define some format constants */
#define BOLD 1
#define UNDERLINE 4
#define BLINK 5
#define INVERS 7

/* prints out a string */
void print( char* str, ... )
{
	/* define argument pointer */
	va_list argptr;

	/* init char arg */
	short arg;

	/* init format args */
	short highlight = 0;
	short color = 37;
	short background = 40;

	/* init arg pointer */
	va_start(argptr, str);

	/* read arguments */
	while( (arg = va_arg(argptr, int)) && (arg <= 47) )
	{
		if( arg >= 40 )
		{
			background = arg;
		}

		else if( arg >= 30 )
		{
			color = arg;
		}

		else if( arg >= 0 )
		{
			highlight = arg;
		}
	}

	/* end optional reading */
	va_end(argptr);

	/* print out formatted string */
	printf("\033[%d;%d;%dm%s%s\n", highlight, color, background, str, NORMAL);
}

test.c
C:
/* include needed libraries */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <stdarg.h>

/* import some own functions */
#include "colors.c"

int main(void)
{
	system("clear");

	/* test the print function */
	print("Hallo Welt!");
	print("Hallo Welt!", BG_RED);
	print("Hallo Welt!", BG_GREEN, FONT_BLUE);
	print("Hallo Welt!", FONT_CYAN, BG_YELLOW);
	print("Hallo Welt!", UNDERLINE);
	print("Hallo Welt!", BLINK, BG_MAGENTA);
	print("Hallo Welt!", FONT_BLUE);

	return 0;
}
 
Hallo,

ich denke das hat weniger mit den va_* Makros zu tun, als vielmehr mit dem Verhalten deines Terminals. Wenn du einmal die Hintergrundfarbe ueber eine Escapesequenz setzt wird der Hintergrund fuer gewoehnlich beibehalten solange du ihn nicht wieder auf die Ursprungsfarbe zuruecksetzt.

Gruß,
RedWing
 

Neue Beiträge

Zurück