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 21.11.2003 16:21

C-Programm-fehlerhaft?
 
hab gerade mit c-einführung angefangen und da gibts ein übungsbeispiel:
------
#include <stdio.h>

main()
{
ausgabe(2);
}

ausgabe(wert)
int wert;

{
printf("Mein %d.", wert);
printf("C-Programm!");
}
-----
witzig daran ist, dass ich damit folgende errors habe:
wert+ausgabe - nicht deklarierter bezeichner.
main - ergebnistyp wird void angenommen (ok- des hab ich schon kapiert)
<unbekannt> funktionsstil-initialisierung scheint eine funktionsdefiniton zu sein.

also ich hab einfach mal das übungsbeispiel geändert und es hat anstandslos funktioniert, jetzt schauts so aus:

-----
#include <stdio.h>

void main()
{
int ausgabe;
ausgabe=2;

printf("Mein %d.", ausgabe);
printf("C-Programm!");
}
-----


jetzt bin ich aber ein bisserl konfus. wieso funktioniert das übungsbeispiel nicht, sondern meine eigene version? oder hab ich irgendwas daran nicht behirnt?

hewlett 21.11.2003 16:39

so sollte es funktionieren:

Code:

#include <stdio.h>
void ausgabe (int wert);

void main (void)
{
  ausgabe(2);
}

void ausgabe (int wert)
{
  printf("Mein %d.", wert);
  printf("C-Programm!");
}

Dieses Buch kann ich dir auch empfehlen:
http://www.amazon.de/exec/obidos/ASI...778533-6544051

Bastet 21.11.2003 16:52

ja thx, aber ich kapier einfach nicht wieso das übungsbeispiel fehlerhaft ist, eigentlich sollten die beispiele doch korrekt sein!

bin eh stolz auf mich, dass ich selbst ne andere lösung gefunden hab, schliesslich weisst du ja das wievielte programm es ist :D

Biri 21.11.2003 18:30

obiges funktioniert nicht, weil das c-programm von "oben nach unten" abgearbeitet wird.

die main funktion "kennt" daher die Funktion <ausgabe> nicht.

lösungen:
ausgabe funktion vor der main-funktion definieren (schlechte lösung, weil nicht möglich, wenn es mehrere funktionen werden)

bessere lösung: die von hewlett - d.h. vor der main funktion einen sog. prototypen der verwendeten funktion(en) definieren.

fg + viel spaß noch beim lernen.
-hannes

kikakater 21.11.2003 21:13

Das Übungsbeispiel zeigt die ursprüngliche Schreibweise von C Code.

Ohne Prototyp und ohne Angabe eines Datentyps im Funktionskopf ist der Rückgabetyp einer Funktion immer vom Typ int (Compilerannahme).

Früher (vor dem Prototyping) hat man die Datentypen von Parametern nach dem Funktionskopf aufgelistet

int funktion(p1,p2)
int p1;
long p2;
{
...
}

Es handelt sich hier um eine alte Schreibweise, die neueren Compilern u.U. Probleme macht.

AlexanderFX 21.11.2003 21:45

Code:

#include <stdio.h>

/* nach den includes musst du alle funktionen deklarieren
die du in deiner c oder cpp datei verwenden willst
*/

// --> Forwärtsdeklarationen
void ausgabe (int wert);

/*
wenn du diese vorwärtsdeclaration nicht hast kannst du
diese funktion nicht verwenden und bekommst eine fehlermeldung

außerdem solltest du immer den variablen typ schon im funktionskopf zu
deklarierne z.B. "void ausgabe(int var1, 
int var2);

der ";" is acuh wichtig bei forwärtsdeklaration
*/

void main()  /* am besten immer den rückgabe wert der funktion dazuschreiben
sonst übersieht ma leicht was */
{

ausgabe("2");  /* da ich mi nimmer so mit c beschäftige bin ich mir
nicht sicher ob die "" bei der übergabe von zahlen nötig sind aber ich
mach sie immer dazu um bessere übersicht zu bewahren */

}

void ausgabe(int wert)
//int wert;
{
printf("Mein %d.", wert);
printf("C-Programm!");
}

mfg alex

Bastet 22.11.2003 09:55

herzlichen dank an alle, ihr habt mir sehr geholfen - wieder was kapiert hab. :)

vorallem als neuling ist es zwar noch ein bisschen verwirrend, wenn ma mal alle beispiele betrachtet und eigentlich doch immer aufs selbe ergebnis kommt. da stellt sich nur eine frage - welches beispiel sollte als richtig gelten? ja ich weiss - die logik des programmierens ist zeitweilig unergründlich :lol: ;)

Flink 22.11.2003 10:10

Zitat:

Original geschrieben von AlexanderFX
Code:

ausgabe("2");  /* da ich mi nimmer so mit c beschäftige bin ich mir
nicht sicher ob die "" bei der übergabe von zahlen nötig sind aber ich mach sie immer dazu um bessere übersicht zu bewahren */


so muss das lauten:
Code:

ausgabe(2);  /* "" werden nur bei Strings (char []) verwendet */

kikakater 22.11.2003 10:41

C Programme haben keine Empathie. Das heißt, Code zu schreiben ist technisch richtig oder nicht. Etwas hineinzugeheimsen spielt es nicht.

Die Emotion kommt mit dem Designergedanken, mit den Techniken herumzuspielen, im übrigen Bibliotheken zu verwenden.

Wichtig sind die Wertebereiche von Datentypen. Sowie die Unterscheidung von Datentypen zu Zeigervariablen, die Adressen beinhalten und EBEN NICHT Daten. Zeigervariablen können auch wiederum auf Zeiger - im Englischen "Pointer" - verweisen (z.B. char **argv <-- Zeiger oder char *argv[] <-- Array (=Feld)).

Unterschiedlich zu einem Zeiger ist ein Array. Das Array stellt eine Anfangsadresse von gleichlautenden Elementen oder Kapselschlüssen (Objekte) dar.

Einem Arraybezeichner kann keine neue rsp. andere Adresse im Programmlauf zugewiesen werden.

Einer Zeigervariablen schon.

char c; /* -128 bis +127 */
char *pc; /* Zeigervariable auf ein char Zeichen */
char yc[10]; /* Array mit 9 + 1 Elementen bei Verwendung als C String, sonst 10 Elemente. keine Überlaufprüfung ! */

Dynamische Anforderung von Speicher:

pc= malloc(10); /* 10 Bytes anfordern und die Anfangsadresse dieses 10 Byte großen Speicherblocks der Variablen pc zuweisen, pc sollte tunlichst als char *pc; deklariert sein. Alles andere ist unsaubere Programmierung. */

void *pv;

pv= pc;

Umtypisieren von Daten oder Zeigern:

int i;
char c;

i= (int) c; oder
i= c;

int *pi;
char *pc;

pi= (int *)pc; /* Vorsicht ! Dies ist bereits unsaubere Programmierung, und nur erlaubt, wenn man ein zweites (bzw. 3 weitere) Byte(s) hinter *pc (=dem Zeichen auf das die Adresse, die pc speichert, verweist) vorrätig hält.

Portabilität:

Zeichensatz (Umfang und Sortierreihenfolge)
Wertebereich von Datentypen
Reihenfolge der Stackargumente bei Funktionsaufrufen
Big vs. Little Endian (Lowbyte vor Highbyte und umgekehrt)
Interface Schnittstellen (Hüllfunktionen) zur Korrektur bzw. Anpassung von inkompatiblen Daten

~

Bastet 23.11.2003 18:01

Zitat:

Original geschrieben von kikakater
Das Übungsbeispiel zeigt die ursprüngliche Schreibweise von C Code.

Ohne Prototyp und ohne Angabe eines Datentyps im Funktionskopf ist der Rückgabetyp einer Funktion immer vom Typ int (Compilerannahme).

Früher (vor dem Prototyping) hat man die Datentypen von Parametern nach dem Funktionskopf aufgelistet

int funktion(p1,p2)
int p1;
long p2;
{
...
}

Es handelt sich hier um eine alte Schreibweise, die neueren Compilern u.U. Probleme macht.

stimmt, habe jetzt djgpp und die beispiele funktionieren anstandslos - naja bis auf eine klitztkleinigkeit - nach dem } endet das programm nicht - es hat ne schleife.

auch wenn ich noch ein exit hinzufüge lt. c compaktreferenz (hab so ziemlich alle exitarten ausprobiert) , dann bekomm ich immer die fehlermeldung : prase error at end of input

kikakater 23.11.2003 22:03

Den Code des Beispielsprogramms zu posten wo eine Endlosschleife auftritt ist die einzige Möglichkeit Dir Bescheid zu geben, warum eine Endlosschleife auftritt.

Die Meldung prase ... müsste wohl parse ... lauten, oder ?

Jedenfalls kenn ich mich im Moment nicht aus. Ich vermute diese Meldung schiebt der Compiler beim Compilieren.

Poste den Code oder hänge ein Attachment mit der Quelldatei an.

Bastet 24.11.2003 10:17

Code:

#include <stdio.h>

void main()
{
        int breite, laenge, flaeche;

        printf("Geben Sie bitte die Laenge ein: ");
        scanf("%d",&laenge);
        printf("Geben Sie bitte die Breite ein: ");
        scanf("%d",&breite);
       
        flaeche=laenge*breite;

        printf("Flaeche des Rechtecks: %d",flaeche);
}

sorry, war ein irrtum meinerseits. wenn das programm ausgeführt wird, endet es mit einer fehlermeldung: programm exit code:26. und ich sehe die letze printf-ausgabe nicht, wenn ich dann nochmals auf "run" drücke steht alles da und ich fange von vorne an - deshalb hab ich gedacht es macht ne schleife

ich benütze die entwicklungsumgebung rhide, das ist in djgpp integriert.

imho brauche ich ein exit, stimmt es heisst - parse, die meldung bekomme ich beim compillieren, wenn ich lt. c-compaktreferenz versuche ein exit zum beenden des prozesses hinzuzufügen.

Flink 24.11.2003 10:21

versuche mal:

Code:

int main()
{
.
.
.

return 0;
}


Bastet 24.11.2003 10:32

wenn ich die rechteck.exe starte funktioniert aber alles tadellos :confused: *ich glaub ich bin so dooof* :lol:

aber mich würd schon interessieren weshalb rhide diese meldung schiebt, wenns bei der exe tadellos funktioniert.

Bastet 24.11.2003 10:33

Zitat:

Original geschrieben von Flink
versuche mal:

Code:

int main()
{
.
.
.

return 0;
}


hab ich auch schon probiert - dann kommt immer die meldung parse...

deleted_150216 24.11.2003 11:26

OK, also ich hab mal deinen Code versucht in der Enwicklungumgebung Bloodshed.
Die kann ich nur jedem Empfehlen, ist Opensource und ein wahnsinn.

also vorerst ist es wichtig das du die

MAIN Funktion wie folgt definierst, da sonst probleme mit versch. Compilern auftreten können

Code:

int main (void)
dann musst die MAIN Funktion mit einem return 0; beendigen, damit das BS weiß, dass alles klar gegangen ist.

noch eine Verständnissfrage, führst du das direkt aus der entwicklungsumgebung aus oder gehst in die dos box und rufst dir dort deine EXE auf?

Bastet 24.11.2003 12:48

das problem gibts nur in der entwicklungsebene, in der dos box mit aufruf der exe gibt es absolut kein problem

deleted_150216 24.11.2003 13:18

den fehler mir PARSE?

poste oder schick mir den code doch mal so wie er nen fehler gibt.

das mit dem exit versteh ich auch nicht ganz, was du da einfügen willst?

Bastet 24.11.2003 13:24

Zitat:

Original geschrieben von noble
OK, also ich hab mal deinen Code versucht in der Enwicklungumgebung Bloodshed.
Die kann ich nur jedem Empfehlen, ist Opensource und ein wahnsinn.

also vorerst ist es wichtig das du die

MAIN Funktion wie folgt definierst, da sonst probleme mit versch. Compilern auftreten können

Code:

int main (void)
dann musst die MAIN Funktion mit einem return 0; beendigen, damit das BS weiß, dass alles klar gegangen ist.

noch eine Verständnissfrage, führst du das direkt aus der entwicklungsumgebung aus oder gehst in die dos box und rufst dir dort deine EXE auf?

AH JAAAAAAAA das wars :) jezt bekomm ich nur noch ne infomeldung mit exit o *dankeschön*

@noble
der code steht auf der ersten seite, das problem hat sich gelöst.
ich wusste nur nicht wie man die main funktion mit nem exit beendet.
in allen übungsbeispielen gibts nämlich keinerlei exit angaben.

Bastet 24.11.2003 13:25


sorry, doppelpost :o

deleted_150216 24.11.2003 13:29

also dann geht jetzt alles?

gut so, also wennst mal hilfe brauchst pn oder mail an mich.

have phun

Bastet 24.11.2003 14:09

ja danke und keine angst ich werde noch ne menge threads zum c-thema aufmachen, weil manche sachen irgendwie verwirrend sind ;)

aber es lohnt sich wirklich, hier kriegt man wenigstens plausible erklärungen :)

kikakater 24.11.2003 17:14

Anstatt: --> exit(0); /* exit ist eine Funktion die ein spezielles CPU Register mit dem Argument - hier numerisch "0" - füllt und das laufende Programm ordnungsgemäß beendet (inklusive automatischem Dateien schliessen und Speicher freigeben), nicht so bei abort(x); */

Schreib einfach: --> system("PAUSE"); /* dann wartet er bis Du eine Taste drückst und geht dann erst wieder in die IDE - (Integrated Developer Environment) oder auch Shell genannt - zurück */

Du willst ja, daß die Ausgaben, die das Programm macht, am Bildschirm stehen bleiben, und keine erzwungene Programmbeendigung mittels der Funktion exit(x); durchführen.

return 1;

Man kann mittels "if errorlevel 1 echo Rückgabewert ist größer gleich 1" (= if(errorlevel>=1) ) den Rückgabewert eines EXE oder COM Programms in einer DOS Batch Datei abfragen.

So kann man eine Steuerung (mittels goto) innerhalb einer Batchdatei hinbekommen.

Siehe help bei den DOS Befehlen ...

mfg Kikakater

Bastet 24.11.2003 21:58

gibts wo ne liste wo die main funktion deatiliert erklärt wird?

meine zb. main () int main() void main (void) etc. merci.

deleted_150216 24.11.2003 23:37

da brauchst net viele beschrieben

diese 2 möglichkeiten sind richtig

int main ()
int main (void)

die 2te ist eigentlich die schönere von beiden

das int hat den sinn, dass das system den rückgabewert weiß
zB 0 wenn das prog erfolgreich beendet wurde

void, bzw. hier dann deklarierte variablen werden beim aufrauf übergeben.

Bastet 24.11.2003 23:56

Zitat:

Original geschrieben von noble
da brauchst net viele beschrieben

diese 2 möglichkeiten sind richtig

int main ()
int main (void)

die 2te ist eigentlich die schönere von beiden

das int hat den sinn, dass das system den rückgabewert weiß
zB 0 wenn das prog erfolgreich beendet wurde

void, bzw. hier dann deklarierte variablen werden beim aufrauf übergeben.

:confused: :verwirrt:

also i kapier da was nicht. eins weiss ich, main() scheint irgendwie zu wenig zu sein, aber ich hab halt schon die variante: void main (void) und die var. int main (void) gesehen aber worin ist da der unterschied??

PredeX 25.11.2003 00:12

Zitat:

Original geschrieben von noble

diese 2 möglichkeiten sind richtig

int main ()
int main (void)

kenn eigentlich nur die erste, was das void in der Klammer heißt würd mich auch interessieren...

Aba es gibt da eine ganz gute C-Seite, die auch Linux und Perl Programmierung behandelt. Dachte ich teil euch die mal mit: http://www.pronix.de

MfG
PredeX

pc.net 25.11.2003 07:31

@Bastet
vielleicht hilft dir das:
Zitat:

http://www.peacesoftware.de/ckurs2.html

2. Die Funktion main

Die zweite Zeile unseres Programmes lautet:

int main(void)

Die Funktion main ist der Anfangspunkt unseres Programmes. Ab hier geht es los. jedes ausführbare C Programm hat eine main Funktion. Gibt es auch nicht-ausführbare C Programme? Ja klar, z. B. Libraries, Hardware Treiber usw.. Diese werden von anderen Programmen aufgerufen und ausgeführt und enthalten keine main Funktion. Dies bedeutet auch das main ein reserviertes Key-Wort ist, es ist strikt verboten eine eigene Funktion oder Variable main zu nennen.

Was ist eigentlich eine Funktion?
Eine Funktion ist ein zusammengehörender eigenständiger Teil eines Programmes. Funktionen können von anderen Orten des Programms aufgerufen werden. Sie können sich übrigens auch selber aufrufen, das nennt man dann "Rekursion". Wann ist es sinnvoll Funktionen zu programmieren? Am einleuchtensten ist es, bei sich im Programm wiederholenden Teilen. Ein typisches Beispiel sind die in der MathLibrary gesammelten Funktionen wie z. B. y = sin(x) etc.. Aber auch zum modularisieren des Programmes ist es sinnvoll Funktionen einzuführen. Eine alte Faustregel sagt, wenn der Code länger als eine DIN A4 Seite wird, sollte man ihn in wegen der Übersichtlichkeit in zwei Funktionen aufteilen, man muss sich aber nicht daran halten.

Funktionen haben einen Namen, einen Rückgabewert (immer, anders als in Pascal wo procedure eine Funktion ohne Rückgabewert bedeutet) und eine Liste von Eingabe Variablen. Wenn eine Funktion "nichts" ausgeben wird, dann gibt sie "void" zurück, dies muss aber deklariert werden. Void bedeutet "nichts". In unserem Falle der main-Funktion.

int main(void)
{
..
}

wird von der Funktion ein int - ein Integer Wert, eine ganze Zahl - ausgegeben int main(void),

und nichts geht in die Funktion hinein int main(void) .

Nach dem Funktionskopf (function head), int main(void) kommt der in geschweiften Klammern {..} der Funktionsrumpf(body of function), in dem die eigentliche Arbeit passiert. Funktionen in die nichts hineingeht und aus denen nichts herauskommt, z.B. void myFunction(void), können also trotzdem etwas ausführen, nämlich das, was in ihrem Funktionsrumpf steht.

deleted_150216 25.11.2003 07:35

Wenn man eine Funktion definiert dann muss man

1) der Funktion sagen von welchem Typ der Rückgaberwert ist

zB
Code:

int addieren (void){
  return 5 + 5;
}

2) man muss definieren welche Werte an die Funktion übergeben werden. Werden keine übergeben dann () oder (void)

zB
Code:

int main (void){
.
.
.
  printf("Ergebnis= %d", addieren (x, y);

.
.
}

int addieren (int x, int y){
  return x + y;
}


kikakater 25.11.2003 10:17

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

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 11:57 Uhr.

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