Vargs

Kann mir einer sagen wie das genau mit den Vargs abläuft?
Wie schreib ich das in den Methodenkopf und vorallem wie greif ich auf die einzelnen Argumente dann zu?

“Vargs”?
Was’n das?

man kann einer Methode beliebig viele Argumente mitgeben.


void methode()
{
...
}

Diese Methode kann meines Wissens laut ANSI C beliebig viele Parameter haben.

…nur gibst du dieser Methode gerade keine Argumente mit…

nein das siehst du falsch ANSI-C sagt es beliebig viele Argumente hat


void methode(void)
{
  ...
}

die bekommt nach ANSI-C keine Parameter

Wasn schmarn :slight_smile:

lol - edit… man sollte sehen dass hier über c / c++ gelabert wird…

eieiei…

beitrag weg editiert

Ich habe hier nur ein kleines Beispiel bei google gefunden:

Finally, I will present an example of a function that can be called with variable arguments. The C syntax for variable arguments is to use three dots, …, to represent the variable arguments. You must however, specify at least one argument at the start of the parameter list. In one way, <stdarg.h> routines are rather inferior to the nonstandard <varargs.h> routines, available on Unix and VMS, because the latter can tell you how many arguments were passed, whereas the former makes you tell the function in some way, like the “%” conversion characters in a printf format string does. Y.R.L. programmers - for some examples of the nonstandard varargs mechanism (which you should avoid using if at all possible) see SRC$OLB: PRINTFILE.C and FIFO.C in GNRC. Here is an example program using the standard stdargs mechanism, called “vargs.c”.

/*---- Variable Arguments C Example ("vargs.c") ------------------------------*/

/* ANSI C Headers */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

/* Defines and macros */
#define END 0

/* Function prototypes */
int add_some_ints( int first, ...);

/* Main Program starts here */
int main( int argc, char *argv[] )
{
    int total;
/*  End of declarations ... */

    total = add_some_ints( 1, 2, 3, 4, END);

    printf("Total was %d
", total );

    exit(EXIT_SUCCESS);
}

/*---- Rather pathetic function to add up some integers ----------------------*/
int add_some_ints( int first, ...)
{
    va_list ap; /* Use to point to each argument in turn */
    int inext, sum, icount;
/*  End of declarations ... */

    icount = 1;
    sum = first;
    va_start( ap, first ); /* Use last named argument - first in this case */

/*  End of args is marked by END, which is zero */

    while ( inext = va_arg( ap, int ) )  /* Second arg of va_arg is type */
    {
      sum += inext;
      ++icount;
    }
    va_end( ap ); /* Tidy up */

    printf("add_some_ints added %d integers
", icount );

    return( sum );
}

[COLOR=black]Vielleicht bringt es etwas.
[/COLOR]

solche funktionen werden zB. für sachen wie printf benötigt, die kann ja beliebig viele parameter haben

ich hab das in meinem c-buch auch stehen, aber bis mittwoch ist das noch 300km weg

Dat läuft so:
int main(int argCount, char* args[])
in argCount steht die Anzahl der argumente
in args stehen die Zeichenketten.

z.B. bubu.exe Hallo Noobs


int main(int argCount, char* args[]){
if(argCount != 2){
  printf("Anzahl der Argumente stimmt nicht
");
  return 1;
}
printf("%s ihr %s", args[0], args[1])
return 0;
}

Klar?
Code ist nicht getestet aber so läuft das eigentlich.

Gegeben ist folgendes:

Videokassette = {KassName, Länge}, K={{FilmName}}
Film = {{FilmName, StartPos, EndPos, KassName, Thema}, K={{FilmName}}
...

Daraus mache ich jetzt folgende Tabellendefinitionen:

create table Videokassette(
   KassName char(30),
   Länge int,
   primary key(KassName))

create table Film(
   Filmname char(30),
   StartPos int,
   EndPos int,
   KassName char(30),
   Thema char(20)
   primary key(FilmName),
   foreign key(KassName) references Videokassette(KassName))

Ist das richtig das ich bei der Filmtabelle trotzdem noch KassName als Attribut aufnehmen muss? Kommt mir irgendwie falsch vor …

mit deinem Tabellenaufbau schon
wenn du für die Kassetten eine ID festlegen würdest könntest du die nehmenstatt dem Namen

mmmhhhh aber was würde passieren wenn ich dann in Zeile 10 z.B. einen ganz anderen Typ dafür festlegen würde?
Ist das nicht irgendwie unsinnig das doppelt aufzuführen?

naja wie gesagt du könntest in deiner Tabelle Videokassette ein neues Attribut kassnr einführen was ein int und der primary key ist. Damit dein Name eindeutig ist könntest du das über PL/SQL (wenn es deine Datenbank unterstützt) oder einen Uniqe Key machen. Die 3. Möglichkeit wäre das über das Programm was die Datenbank benutzt muss sicherstellen das der Name eindeutig ist.
Und diese Nummer gibst du dann statt dem Namen an.

Wenn du nur den Typ ändern würdest wirst du einige Probleme bekommen weil dann irgendwas komisches aus den Daten gemacht wird bzw könnte die Datenbank das als Fehler melden und dir so verbieten die Tabelle zu erstellen.

Ja das mit den IDs sehe ich ja ein, aber das sieht meine Aufgabenstellung nun mal nicht vor.

Aber dann weiß ich wenigstens das es so richtig ist. Dann kann die Klausur ja kommen :wink:

Danke :smiley:

Noch eine Frage …

Stellen Sie durch eine Integritätsbedingung sicher, dass das Attribut AnzahlTage nur die Werte 1 bis 180 annehmen kann.

Hab ich jetzt mal so gelöst:


create table Reservierung(
   ...
   AnzahlTage int check value between 1 and 180,
   ...)

richtig oder falsch?

hmmm
also wenn man mal davon ausgeht das dieses Konstrukt da richtig ist musst du klären ob BETWEEN x AND Y heißt >=1 und <=180 oder nur >1 und <180

das hab ich:

attribut between konstante1 and konstante2

Abkürzung für

attribut ≥ konstante1 and attribut ≤ konstante2

die Frage ist mehr ob das mit dem check und value so geht

achso ok
also für Firebird und/oder Oracle wäre es


ALTER TABLE Reservierung ADD anzahltage_check CHECK (AnzahlTage BETWEEN 1 AND 180)

wobei ich nicht 100%ig weiß ob da das BETWEEN zulässig ist

hhhmmm ich gehe erstmal davon aus das es zulässig ist … bis mir ein Korrektor das Gegenteil beweist :wink:

Danke nochmal