Forum
Tipps
News
Menu-Icon

Wie erstelle ich eigene Funktionen in C?

Hi...
ich möchte eine eigene Funktion erstellen, weiß aber nicht genau wie ich das machen soll.

Ich möchte das ich in meiner Funktion einen Text eingebe und dessen Farbe und Hintergrundfarbe bestimmen kann.

farbe("test",12);

Das soll am Ende Rot ergeben.


#include <stdlib.h>
#include <windows.h>


farbe(char text, int color)

   HANDLE hConsole;
   hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
   SetConsoleTextAttribute( hConsole, color );
   printf("%c",text);
   SetConsoleTextAttribute( hConsole, 7 );
}
int main(int argc, char *argv[])
{
  farbe("hallo",10);
  system("PAUSE");
  return 0;
}

Das war erstmal meine Idee....ja ich weiß ist schrecklich, aber ich habe wiklich keine Ahnung davon.

Das Problem ist einfach, das ich normalerweise immer
   SetConsoleTextAttribute( hConsole, 13);
   printf("%c",text);
   SetConsoleTextAttribute( hConsole, 7 );

schreiben muss damit ein Text rot wird und am Ende wieder alles normal ausgegeben wird. (13 = rot, 7 = grau)

und das wollte ich irgendwie vereinfachen.

So das würde mir fürs erste reichen.
Als nächsten Schritt wollte ich dann, das ich da auch andere Funktionen einsetzen kann.

also: farbe(scanf(),9);

Hoffe ihr könnt mir da bei helfen.

Danke schonmal im Voraus.

Gruß
Andre

Antworten zu Wie erstelle ich eigene Funktionen in C?:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Warum schrecklich? Passt doch fast. Zwei Zeichen ändern und es funktioniert. Oder verstehe ich dein Problem nicht?

1. Das muss natürlich ein Pointer sein, weil du ja nicht nur ein Zeichen übergeben willst sondern den ganzen Text. Und ein "void" davor (der Rückgabetyp) kann auch nicht schaden.

void farbe( char *text, int color )
2. Hier musst du %s verwenden, um den ganzen String auszugeben.
printf( "%s",text );
3. Et voilà. Sollte funktionieren.

Das mit dem scanf() wird aber so nicht funktionieren, weil scanf eben nicht den gelesenen String zurückgibt. 
« Letzte Änderung: 09.05.08, 11:05:53 von Lisaa »

Mh... also ich bin ja nicht der beste in C, aber fehlt da nicht auch der Rueckgabewert?, also void, int, oder sowas in der art.

Gut, in C++ muss man ja auch nicht immer "void" dazuschreiben wenn nichts drin steht

mfg.
Fuxi

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Danke...

Also das mit der Funktion klappt jetzt.

Mit scanf() muss ich mal gucken. vlt klappt es ja auch. :)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Müsstest dir wahrscheinlich noch ne Funktion drumrumbauen, z.B. sowas:

char *getInput() {
    char *s;
    scanf( "%s", s );
    return s;     
}
und dann aufrufen mit
farbe( getInput(), 13 );

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
void farbe(char *text, int color)
  { 
   SetConsoleTextAttribute( hConsole, color );
   printf("%s",text);
   SetConsoleTextAttribute( hConsole, 7 );
   }

Wie muss ich diese Funktion umwandeln, so das ich auch Zahlen einbauen kann, die von einer Varialen stammen?

ich hab schon probiert wie bei PHP Zeichenketten aneinander zu hängen, aber das geht nicht
« Letzte Änderung: 16.05.08, 12:06:17 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das funktioniert in C nicht. Da nimmt man sprintf. Funktioniert genau wie printf, nur "druckt" halt in einen anderen String:

char buffer[50];
char *text = "hallo";
int number = 123;
sprintf( buffer, "%s %i\n", text, number );
farbe( buffer, 10 );
Oder in der Funktion selber z.B. so:
void farbe( char *text, int number, int color ) {
    SetConsoleTextAttribute( hConsole, color );
    printf("Das ist der Text: %s und das die Zahl: %d", text, number );
    SetConsoleTextAttribute( hConsole, 7 );
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

okay...danke  ;D

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi.

Ich schon wieder ;D

void farbe( char *text, int number, int color ) {
    SetConsoleTextAttribute( hConsole, color );
    printf("Das ist der Text: %s und das die Zahl: %d", text, number );
    SetConsoleTextAttribute( hConsole, 7 );

Das funktioniert prima.
Aber kann man das acuh so machen, dass die Vraiable number nicht zwingend erforderlich ist?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Klar. Zum Beispiel mit Default-Parametern:

void farbe( char *text, int color, int number = -1 ) {
    HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( hConsole, color );
    if( number == -1 ) {
        printf( "Das ist der Text: %s ohne Zahl", text );
    } else {
        printf( "Das ist der Text: %s und das die Zahl: %d", text, number );
    }
    SetConsoleTextAttribute( hConsole, 7 );
}
Dabei müssen die Argumente die einen default haben in der Liste hinten stehen. Wird kein Wert dafür übergeben, wird der default genommen (hier -1). Wenn bei dir auch negative Zahlen vorkommen können, ist das natürlich keine gute Idee, dann müsstest du dir wahrscheinlich noch ne zweite Funktion bauen (eben ganz ohne die Variable).


Alternativ gibt es noch die Möglichkeit, die Funktion mit variabler Parameterzahl zu definieren:
#include <stdarg.h>

void farbe( char *text, int color, int count, ... ) {

    int number[ count ];
    va_list marker;
    va_start( marker, count );
    for( int i = 0; i < count; i++ ) {
number[ i ] = va_arg( marker, int );
    }       
    va_end( marker );

    HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( hConsole, color );
       
    printf("Das ist der Text: %s", text );
       
    for( int i = 0; i < count; i++ ) {
         printf( " Zahl %d: %d", i+1, number[i] );
    }
    printf( "\n" );
    SetConsoleTextAttribute( hConsole, 7 );
}
Wobei der dritte Parameter die Anzahl der Zahlen ist, die da noch folgen, also z.B.
farbe( "hallo", 12, 3, 123, 456, 789 );
farbe( "hallo", 12, 0 );
farbe( "hallo", 12, 1, 123 );
« Letzte Änderung: 19.05.08, 16:58:45 von Lisaa »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das zweite ist genau das was ich erst machen wollte. Ich wusste bloß nicht wie das mit dem "..." funktioniert.
Da bin ich nciht so ganz aus den Bibliotheken schlau geworden.

Kann man auch irgendwie eine Variable Anzahl von Variablen erstellen lassen?

char variable[anzahl]

oder geht das nicht?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Wie meinst du das jetzt genau? Ein Array von Variablen übergeben? Das geht natürlich auch, musst allerdings dann auch die Länge (Anzahl Variablen) mit dabei schreiben.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Also ein Benutzer gibt irgendeine Zahl (n) an
und das Programm legt dann n Variablen an. bsp: int n1, n2, ...
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi.

Ich hab da noch eine frag ezu meiner Funktion.
Die gefällt mir noch nicht ganz, aber wenn es nicht geht ist das auch nicht schlimm. ;)

Das wird hier zwar nicht funktionieren, aber zeigt vielleicht was ich vor hatte.

void farbe(char *text, int color, int count, ...)
{
 double number[ count ];
    va_list marker;
    va_start( marker, count );
    for( int i = 0; i < count; i++ )
    {
    number[ i ] = va_arg( marker, int );
    }       
    va_end( marker ); 

   SetConsoleTextAttribute( hConsole, color);
   printf("%s",text, for(int i = 0; i < count; i++){number[i]} );
   SetConsoleTextAttribute( hConsole, 7 );

Also was ich erreichen wollte ist.
das bei farbe("%f hallo %f", 7, 2, 1,2);
"1 Hallo 2" bei rauskommt.

Geht das so?
Oder muss ich erstmal den String bearbeiten und die zahlen als String dort einfügen. (also wie bei deinem Beispiel mit sprintf() )

 
« Letzte Änderung: 20.05.08, 08:43:05 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Also ein Benutzer gibt irgendeine Zahl (n) an
und das Programm legt dann n Variablen an. bsp: int n1, n2, ...

Das geht.
int n = //irgendwas vom Benutzer eingegebenes
int variable[n]; //oder
int variable[n] = { 1, 2, 54 } // für n == 3
Damit hast du ein Array der Länge n. Zugriff ganz normal über variable[0] bis variable[n-1].

Das andere wird schwierig
printf("%s",text, for(int i = 0; i < count; i++){number[i]} );
geht natürlich nicht, da die for-Schleife nicht zu einer Variablenliste ausgewertet wird. Vielleicht fällt mir da noch was zu ein...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das mit der for-schleife hab ich ich schon festgestellt.
Es war jetzt auch nur um zu zeigen, wie ich das meinte.

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich brauch hier nochmal Hilfe:

Wie krieg ich es hin das ich

farbe("Die %i Texte '%s' und '%s' sollen rot werden", FARBE, Integer, String, String);

Also im Prinzip die printf()-Funktion nur mit dem zusätzlichen Parameter "Farbe"?

Kann ich da einfach aus der stdio.h die Funktion rauskopieren und versuchen da noch die Farbe mit einzubauen?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

So einfach wird das nicht gehen, da der Code nicht in stdio.h steht. Ob es den irgendwo gibt, weiß ich gerade auch nicht. In den *.h files steht ja nur die Deklaration.
Vielleicht fällt mir später noch was dazu ein.

So gehts:

void printf_color( int color, char* fmt, ... )
{
   SetConsoleTextAttribute( hConsole, color);

   va_list args; 
   va_start( args, fmt ); // fmt ist der letzte Parameter vor "..."
   vprintf( fmt, args );
   va_end( args );

   SetConsoleTextAttribute( hConsole, 7 );
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Super ;D

Vielen dank.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
void printf_color( int color, char* fmt, ... )
{
   SetConsoleTextAttribute( hConsole, color);

   va_list args;
   va_start( args, fmt ); // fmt ist der letzte Parameter vor "..."
   vprintf( fmt, args );
   va_end( args );

   SetConsoleTextAttribute( hConsole, 7 );
}

wenn ich die Funktion jetzt aufrufe, stürzt das Programm ab.

printf_color(10,"das ist test %i",6);

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

an der Funktion liegts nicht, die ist in Ordnung.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

dann liegt das am compiler.
glaub ich.

Die Funktion steht in einer anderen Datei.
Wenn die Funktion in der sleben Datei steht geht es.

Komisch.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das ist in der Tat merkwürdig. Normalerweise sollte es dann ja einen Compiler-/Linkerfehler geben...

Wie hast du die andere Datei denn eingebunden?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich benutze den Dev-CPP.

ich habe eine Datei, die printf_color.c heißt.
Die andere heißt farbe.c

in farbe.c habe ich die printf_color.c so eingebunden:
void printf_color(int farbe, char*fmt, ...);

main()
{....}


Wenn ivh beide Dateien aber einem Projekt zugeordnet habe, geht es.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hmm, sehr merkwürdig. Bei mir gibt er da einen Linkerfehler (undefined reference). So sollte es auch eigentlich sein. Wenn ich die printf_color.c über #include "printf_color.c" einbinde funktioniert alles.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Also bei Projekten geht das alles.

Und wenn ich jetzt einzelne Dateien einbinden möchte, muss ich die über #include einbinden.
Naja...hauptsache es geht ;D


« Objektorientierte Programmiersprache!? rot13 usw. »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Hypertext
Hypertext ( zu Deutsch: Übertext) ein ein von dem Informatiker Theodore L. Nelson in den sechziger Jahren geprägter Begriff für Text, der dreidimensional g...

Textur
Unter einer Textur versteht man eine Oberflächenstrukur, die ein bestimmtes Material simuliert, wie Holz, Tapete oder Metall. Bei der 3D-Computeranimation bezeichnet...

Blende
Die Blende, oder auch fotografische Blende, ist eine mechanische Vorrichtung und Teil des Objektives bei Foto- und Videokameras. Dieser Teil des Objektivs kontrolliert di...