WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   C-Programm-fehlerhaft? (http://www.wcm.at/forum/showthread.php?t=116221)

Bastet 25.11.2003 19:42

Zitat:

Original geschrieben von kikakater
main()

ist das gleich wie

int main (void)

void bedeutet es wird kein Wert vom Betriebssytem übernommen.

void im allgemeinen bedeutet kein Datentyp.

void *Zeigervariable;

bedeutet, daß der Variablen Zeigervariable Adressen jeglicher Zeigervariableninhalte zugewiesen werden können.

char *Zeichenkette,*String_4711;

int *Zeiger_auf_Lottoziehungszahl;

Zeigervariable= Zeichenkette;

Zeigervariable= String_4711;

Zeigervariable= Zeiger_auf_Lottoziehungszahl;

(Das) Ist alles möglich - lediglich das

Zeiger_auf_Lottoziehungszahl= String_4711;

ist nicht erlaubt, weil die Datentypen auf die die Zeigervariablen zeigen, unterschiedlich sind.



Wenn man an der Eingabeaufforderung - dem DOS Prompt ist gemeint oder an der Linux Shell - folgendes eingibt:

bastet_prg_maxipraxihaxi parameter1 2 3 4 parameter5

so muß / sollte man main folgendermaßen definieren um auf diese Strings (fünf an der Zahl, nämlich): "parameter1" "2" "3" "4" "parameter5" (ohne Anführungszeichen natürlich, NAAHHHH, bastet Du machst mich schwach !) in der Funktion main zugreifen zu können:

int main ( int argc, char **argv )

oder

int main ( int argc, char *argv[] )


Variante 1 deklariert argv als Zeiger auf einen Zeiger und darob ein Array von Strings.

Variante 2 deklariert argv als Feld (=Array) von Strings.

Ein String hat eine Anfangsadresse und wird so implementiert:

char *zeigervariable;

oder

char zeichen_array_oder_auch_string_genannt[20]

bzw. ohne Längenangabe:

char zeichen_array_oder_auch_string_genannt[]


Ohne Längenangabe kann man (muss man) ein Char Array in einem Funktionskopf deklarieren.

argc beinhaltet 6 Argumente, nämlich den Programmnamen "bastet_prg_maxipraxihaxi" und die 5 eingegebenen Worte ("parameter1" bis "parameter5", dazwischen "2" "3" und "4" :D *herum[schüchter|drucks] ich tu*)

Also:

Code:

int main ( int argc, char **argv )
{
 int i;

 for(i=0; i<argc; i++)
  printf("Argument %d:%s<\n",i,(*argv)++);

 return 0;
}

Soll argc und argv in jeder Funktion nutzbar sein, kann man deren Werte (also den integer Wert von argc sowie den Adresswert der Variablen argv) an globale Variablen übergeben.

Code:

int ich_machs_jetzt_in_einer_funktion (void); /* Prototyp */

int g_argc;
char **g_argv;

int main ( int argc, char **argv )
{
 /* bitte nicht vergessen, sonst stürzt das Programm unweigerlich ab - u.U. zumindest */
 g_argc= argc;
 g_argv= argv;

 ich_machs_jetzt_in_einer_funktion();

 return 0;
}

int ich_machs_jetzt_in_einer_funktion (void)
{
 int i;
 char **l_argv= g_argv; /* lokale Zeigervariable, vielleicht brauchen wir den ursprünglichen Wert
der globalen Zeigervariablen g_argv ja noch,
deswegen g_argv hier nicht verändern */

 for(i=0; i<g_argc; i++)
  printf("Argument %d:%s<\n",i,(*l_argv)++);

 return 0;
}

mfg Kikakater

:lol: also wer do einen schwach macht, du machst mich absolut fertig ;)

dam, bis jetzt hab ich immer nur main() oder int main() benutzt naja rhide schreit zwar bei main() aber ich hab keinen error. aba ich hab auch in anderen beispielen int main(void) oder void main (void) gesehen. und jaaa ich hab auch schon genügend links, erklärungen usw. gelesen... aba überall wirds gleich erklärt :o also bitte erklärung für dummies und ned irgendwelche intelligenz voraussetzen ;)

{und was dass betrifft: bastet_prg_maxipraxihaxi parameter1 2 3 4 parameter5
wär da nicht besser int bastet_prg_maxipraxihaxi[5] odr. redst wieder mal an mich vorbei? }
waaahhh - i muss des einfach kapieren.
ajo und da fällt mir ein - hab schon über die zeiger und arrays gelesen, wird aber noch nicht gefordert. des lern ich erst wenn ich die prüfung schaff und den c++ kurs machen darf ;)

Bastet 25.11.2003 19:52

oh mann oh mann, ich glaub mei hirn hat schon nen bluescreen...

sorry, aber ich bin kein meister im erklären, deshalb reden wir scheinbar manchmal aneinander vorbei.

soweit ichs behirnt hab:

main() der compiler muckt zwar mit info auf und meint er nimmt void an, aber er hat keinen error.

also schreib ich halt ab jetzt immer int main(void) - ich hab genügend unterlagen, aber mir fehlt irgendwie dazu eine plausieble erklärung... für dummies ;) keine ausschweifungen in irgendwelche richtungen - einfach nur ne gute erklärung zur syntax.

Flink 25.11.2003 19:57

Zitat:

Original geschrieben von Bastet
Code:

int main (void)
AH JAAAAAAAA das wars :) jezt bekomm ich nur noch ne infomeldung mit exit o *dankeschön*
@Bastet:

Wenn ich dich auf etwas hinweisen darf: Einige Postings vorher warst du bereits bei 'int main' angelangt. Schon vergessen :confused:

Bastet 25.11.2003 20:08

Zitat:

Original geschrieben von Flink
@Bastet:

Wenn ich dich auf etwas hinweisen darf: Einige Postings vorher warst du bereits bei 'int main' angelangt. Schon vergessen :confused:

stimmt, aber er hats mit return 0; ergänzt ;)

deleted_150216 25.11.2003 20:15

kauf dir das buch

C Programmieren von Anfang an
ISBN: 3499600749

Das Buch ist das richtige für Anfänger, alles genau erklärt mit Übungen und Aufgaben zum selber lösen und wenn man nciht mehr weiter weiß, steht hinten ne lösung.

Das ganze kostet rund 10 Euro und ist das Geld mehr als Wert.

Flink 25.11.2003 20:19

Zitat:

Original geschrieben von Bastet
stimmt, aber er hats mit return 0; ergänzt ;)
Hm, auch das hatten wir schon einmal. :confused:

Bastet 25.11.2003 20:21

Zitat:

Original geschrieben von noble
kauf dir das buch

C Programmieren von Anfang an
ISBN: 3499600749

Das Buch ist das richtige für Anfänger, alles genau erklärt mit Übungen und Aufgaben zum selber lösen und wenn man nciht mehr weiter weiß, steht hinten ne lösung.

Das ganze kostet rund 10 Euro und ist das Geld mehr als Wert.

thx, das problem ist nicht die lektüre - davon hab ich genug. meistens wird halt ein punkt in jedem buch gleich erklärt. wenn du den punkt mit der erklärung dort nicht verstehst, hilft dir eine andere lektüre genausowenig, nur ne andere erklärung zu dem punkt würde helfen.

jup, ich weiss, habe in diesem thread schon einige punkte erfragt und antworten bekommen, werde aber demnächst für eigene fragen auch eigene threads aufmachen - deshalb ist wahrscheinlich auch bei manchen verwirrung entstanden ;)
aber ich muss sagen dieser thread hat mir schon sehr viel gebracht :)

kikakater 26.11.2003 10:14

Wenn man an der Eingabeaufforderung - dem DOS Prompt ist gemeint oder an der Linux Shell - folgendes eingibt:

bastet_prg_maxipraxihaxi parameter1 2 3 4 parameter5

Dieses komische Ding (bastet_prg_maxipraxihaxi) ist ein Programm ! (sowas wie Excel.exe)

sprich bastet_prg_maxipraxihaxi.exe

Du sollst also nicht

> dir c:\

eingeben

sondern

> bastet_prg_maxipraxihaxi parameter1 2 3 4 parameter5

im DOS Modus = an der Eingabeaufforderung

wenn Du nur

> bastet_prg_maxipraxihaxi

eingibst

so steht im C Programm in der Variablen argc 1 und in der Variablen argv 4 Millionen und irgendwas (eine Adresse also), unter *argv ist die gleiche Adresse + 4 * Anzahl der Argumente zu finden und unter **argv findet sich schließlich ein 'b' (Beginn des Programmnamens bastet_prg_maxipraxihaxi), unter *(argv+1) ist die Adresse + 4 * Anzahl der Argumente + Länge des Programmpfades zu finden, und unter **(argv+1) findet sich das Zeichen 'p' (für parameter1)

argv[0] <-- "bastet_prg_maxipraxihaxi"
argv[1] <-- NULL

sonst

argv[0] <-- "bastet_prg_maxipraxihaxi"
argv[1] <-- "parameter1"
argv[2] <-- "2"
argv[3] <-- "3"
argv[4] <-- "4"
argv[5] <-- "parameter5"

für argv[0] kann man auch *argv schreiben

für argv[1] *(argv+1) usw.

Alles klar ?

Code:

#include <stdio.h>

int main(int argc, char **argv)
{
 for(int i=1; i<=argc; i++)
 {
  printf("Argument Nummer %d = >%s<\n",i,*argv++);
 }

 system("PAUSE");       

 return 0;
}

mfg Kikakater

kikakater 26.11.2003 10:33

Zitat:

Original geschrieben von kikakater
Ergänzung (Korrektur), damit Du ÜBERHAUPT die Chance hast es zu verstehen: wenn Du nur

> bastet_prg_maxipraxihaxi

eingibst

so steht im C Programm in der Variablen argc 1 und in der Variablen argv 4 Millionen und irgendwas (eine Adresse also), unter *argv ist die gleiche Adresse + 4 * Anzahl der Argumente zu finden und unter **argv findet sich schließlich ein 'b' (Beginn des Programmnamens bastet_prg_maxipraxihaxi), unter *(argv+1) ist NULL zu finden

argv[0] <-- "bastet_prg_maxipraxihaxi"
argv[1] <-- NULL


Flink 16.12.2003 11:23

Zitat:

Original geschrieben von noble
kauf dir das buch

C Programmieren von Anfang an
ISBN: 3499600749

Das Buch ist das richtige für Anfänger]
Heute gibt es sogar das Buch "Workshop C++" um 1,99 € zum Download bei PC-Welt, das auch für C-Programmierer geeignet ist.


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag