Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » & (Adreßoperator)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]
010
16.08.2006, 20:27 Uhr
xXx
Devil


Lol... hau dem Typen der dir das alles gesagt hat eine rein Ne mal im ernst...

Nach dem aktuellen ISO Std. ist void main unzulässig und jeder aktuelle Compiler wird meckern... das return 0; ist in der main nach der aktuellen ISO nicht zwingend... jeder gute Compiler wird dich aber trotzdem warnen.

Aja... ist es evt. möglich das du eine negative Zahl von Klassen hast, NEIN! also... unsigned

Dieser Post wurde am 16.08.2006 um 20:28 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
16.08.2006, 20:43 Uhr
0xdeadbeef
Gott
(Operator)


Also: Im ISO-C-Standard steht drin, dass es für main genau zwei gültige Signaturen gibt, die jeder Compiler unterstützen muss, nämlich

C++:
int main(void);
int main(int argc, char *argv[]);


Kompatible Formen, also z.B.

C++:
int main(int argc, char **argv);


sind ebenfalls erlaubt. Außerdem gibt er explizit an, dass main auf jeden Fall int zurückzugeben hat. Der Hintergrund ist, dass die umgebende Shell den Rückgabewert eines Programms auswerten kann. Daher auch return 0;, das bedeuter per Konvention "alles gut gelaufen". Auf einigen älteren Plattformen kann die Benutzung von "void main" zu einem stack overflow in der Shell führen, und viele moderne Compiler lehnen die Form inzwischen generell einfach ab.

In C++ ist es insofern etwas anders, als dass der Standard explizit die Formen

C++:
int main();
int main(int argc, char *argv[]);


angibt, und dass main implizit 0 zurückgibt, wenn nichts anderes angegeben wurde. Dass return 0; kann da also entfallen. Der Hintergrund hier ist, dass

C++:
int main();
int main(void);


in C++ äquivalent sind, in C jedoch nicht. In C bedeutet

C++:
void foo();


dass foo eine Funktion ohne Rückgabewert ist, die beliebig viele Parameter entgegennimmt, dagegen ist

C++:
void foo(void);


eine Funktion ohne Rückgabewert, die auch keine Parameter entgegennimmt. Der hauptsächliche Nutzen dieser Unterscheidung ergibt sich bei der Benutzung von Funktionspointern z.B. für signal handling (siehe gtk+). In C++ müsste man für die erste Form

C++:
void foo(...);


schreiben. Des weiteren ist %d das format flag für int, nicht long int. Allerdings hab ich mich da vorhin auch vertan, ich bitte das zu entschuldigen - hab lang nichts mehr mit C gemacht. Für long int muss es natürlich %ld heißen, nicht %l - ich habe das im anderen Beitrag inzwischen behoben. %d steht dabei für "decimal", %ld meint "long decimal".
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.08.2006 um 20:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
16.08.2006, 21:53 Uhr
ao

(Operator)



Zitat von 0xdeadbeef:
Des weiteren ist %d das format flag für int, nicht long int.

Das stimmt, vielleicht sollte man noch erklären, dass auf den meisten heutigen Systemen (32-Bit-Systeme) int und long int dasselbe ist, deswegen funktioniert %d auch bei long-Variablen. Das ist allerdings nur zufällig so und nicht portabel.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
16.08.2006, 22:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:

Zitat von 0xdeadbeef:
Des weiteren ist %d das format flag für int, nicht long int.

Das stimmt, vielleicht sollte man noch erklären, dass auf den meisten heutigen Systemen (32-Bit-Systeme) int und long int dasselbe ist, deswegen funktioniert %d auch bei long-Variablen. Das ist allerdings nur zufällig so und nicht portabel.

ao

und darum meckert jeder vernünftige compiler (z.b der gcc) dies zumindest als Warnung an. (Der Visual C++ Compiler ist sowas völlig schnurz-piep-egal, der hat sowieso seinen eigene standard: "Wie? Warnungen bzgl Portabilität? Nix da!")
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
17.08.2006, 02:13 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von 0xdeadbeef:
In C bedeutet

C++:
void foo();


dass foo eine Funktion ohne Rückgabewert ist, die beliebig viele Parameter entgegennimmt,
...
in C++ müsste man für die erste Form

C++:
void foo(...);


schreiben.

Wieder was gelernt,kann man dann nur übergeben,wieviel man will und kann es nicht nutzen oder kann man auch irgendwie darauf zugreifen ? Wenn ja,wie ?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
17.08.2006, 09:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


va_list und Co. damit kriegst du die parameter raus.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
17.08.2006, 12:45 Uhr
Karldin Shinowa
Professional Noob



Zitat von FloSoft:
va_list und Co. damit kriegst du die parameter raus.

Plz ein kleines Beispiel
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
17.08.2006, 13:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja z.B:


C++:
#include <stdio.h>
#include <stdarg.h>

extern char *itoa(int, char *, int);

void myprintf(const char *fmt, ...)
{
const char *p;
va_list argp;
int i;
char *s;
char fmtbuf[256];

va_start(argp, fmt);

for(p = fmt; *p != '\0'; p++)
    {
    if(*p != '%')
        {
        putchar(*p);
        continue;
        }

    switch(*++p)
        {
        case 'c':
            i = va_arg(argp, int);
            putchar(i);
            break;

        case 'd':
            i = va_arg(argp, int);
            s = itoa(i, fmtbuf, 10);
            fputs(s, stdout);
            break;

        case 's':
            s = va_arg(argp, char *);
            fputs(s, stdout);
            break;

        case 'x':
            i = va_arg(argp, int);
            s = itoa(i, fmtbuf, 16);
            fputs(s, stdout);
            break;

        case '%':
            putchar('%');
            break;
        }
    }

va_end(argp);
}



das ... kannste in C weglassen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
17.08.2006, 13:36 Uhr
0xdeadbeef
Gott
(Operator)


Nein, in dem Zusammenhang brauchste das ... dann schon wieder. Wie gesagt, hauptsächlich interessant ist das für Funktionspointer, also z.B.

C++:
#include <stdio.h>

void foo(int x, int y) {
  printf("%d, %d\n", x, y);
}

int main(void) {
  void (*bar)() = foo;

  bar(1, 2);

  return 0;
}


Prinzipiell kann man aber auch

C++:
void foo() { }

// ...

foo(1, 2);


schreiben. Allerdings ist das nur äußerst selten eine sinnvolle Idee. Was dagegen nicht geht, ist

C++:
void foo(int x);

foo(1, 2);


Wenn man sich einmal festgelegt hat, muss man sich auch dran halten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 17.08.2006 um 13:37 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
18.08.2006, 16:30 Uhr
~chessymaster
Gast


warum geht nicht void main (void)? man muss dann nicht return 0 am ende schreiben.

bei eingabe eines strings mit scanf muss kein adressoperator an die variable übergeben werde. warum nicht?

und alle guten dinge sind 3.
hab hier mal 2 programme:
________________________
proggy1

C++:
#include <stdio.h>
#define StudentenProKlasse 10

void main (void)
{
long z1, z2, z3;

    printf("\n Zahl 1 der Addition: \n");
    scanf("%ld", &z1);
    
    printf("\n Zahl 2 der Addition: \n");
    scanf("%ld", &z2);

    printf("\n Zahl 3 der Addition: \n");
    scanf("%ld", &z3);
    
    printf("\n Folgende Zahlen gaben Sie ein: %ld %ld %ld\n", z1,z2,z3);
}


hier erscheint alles aufem bildschirm, so wie es auch sein soll.
Zahl 1 der Addition x
Zahl 2 der Addition x
Zahl 3 der Addition x
Sie gaben folgende Zahlen ein: x x x
beim proggy2 sieht alles aber anders aus.
nach eingabe des ersten wertes, wird die 2.eingabe übersprungen und man landet bei eingabe nr 3.
warum ist das so?
____________________________________________________-
proggy2

C++:
#include <stdio.h>
#define StudentenProKlasse 10

void main (void)
{

char z1, z2, z3;

    printf("\n Zahl 1 der Addition: \n");
    scanf("%c", &z1);
    
    printf("\n Zahl 2 der Addition: \n");
    scanf("%c", &z2);

    printf("\n Zahl 3 der Addition: \n");
    scanf("%c", &z3);
    

    printf("\n Folgende Zahlen gaben Sie ein: %c %c %c\n", z1,z2,z3);
}




Bearbeitung von 0xdeadbeef:

cpp-Tags nächstes mal bitte selbst setzen. Dann kann man den Code auch lesen, und mehr Leute werden sich um dein Problem kümmern.


Dieser Post wurde am 18.08.2006 um 17:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: