C Frage zu einem Programm

Panda90

Cadet 2nd Year
Registriert
Okt. 2010
Beiträge
25
Hallo,
ich habe eine Frage zu einem Programm, dass mir ein Lineal auf dem Bildschirm ausgeben soll ( nur als Text, d.h. wo welche Linie in welcher Länge )
Bisland habe ich folgendes :

Code:
#include <stdio.h>


int main(int lirand, int rerand, int strich)
{
    lirand = 0;
    rerand = 100;
    strich = 3;
    int mitte = (lirand+rerand) / 2;
    if (strich > 0) {
        main(lirand, mitte, strich-1);
        printf("Ziehe Linie der Laenge %i an Linealposition %i",mitte,strich);
        main(mitte, rerand, strich-1);
    }
}

Nun passiert aber nachdem ich das Programm compiliert und gestartet habe erstmal gar nix und danach erscheint ein windowsfenster mit dem Inhalt "XXX.exe funktioniert nicht mehr Es wird nach einer Lösung für das Problem gesucht..."

Was habe ich denn falsch gemacht? Komm da irgendwie nicht drauf = /

Vielen Dank für eure Hilfe.

Mit freundlichen Grüßen
Panda
 
naja deine abbruchbedingung tritt schlicht und einfach nie ein...
edit: warum schreibst du in main eig immer das lirand rerand und strich und übergibst es ned beim programmaufruf? dann würd dein prog auch funktionieren...falls man eine rekursive main funktion machen darf wovon ich jz ausgeh weil wenn du sowas machst solltest dus auch nachschaun obs geht und ich nehm mal an das hast du
 
Das sieht eh alles nach Murks aus, sorry. Die Parameter der main-Funktion sind schon höchstdubios.

Außerdem rufst du die main-Funktion in der Main-Funktion auf -> Das gibt sicher ne rekursive schleife und das programm wird wegen nem Stack overflow abschmieren.
 
Jo, das Programm divergiert vor sich hin weil Strich immer 3 ist...
Wie wär's mit einer Hilfsfunktion?

Edit:
Ich glaube wir meinen das gleiche: Eine Funktion die wie auch immer heißt anzulegen die das macht was er will und dann diese aus der main (die dann nur noch einen Aufruf + variablen hat) auszuführen oder nicht?
 
Zuletzt bearbeitet:
wie wärs damit das nicht in main zu schreibn sondern beim aufruf als parameter mitzugeben?!?!?!
also die ersten 3 zeilen kannst auch so als standardparameter mitgeben
außerdem macht das programm meiner meinung nach nur sinn wenn das nicht hardcoded is sondern flexibel ist --> parameter
 
Ok ich habs jetzt hinbekommen.
ich sollte mir mehr gedanken darüber machen bevor ich sone frage hier stelle ^^
der fehler lag natürlich daran, dass strich immer wieder auf 3 gesetzt wurde.
danke flopalko für den hinweis ;)

hab die parameter jetzt in ne main geschrieben und an die lineal-funktion übergeben.
 
ja np, dafür is ja ein forum da...
Eine Frage hab ich aber: Was soll dieses Programm? Das ist ja amal so richtig unnötig! Oder hast du das nur geschrieben, um den Umgang mit rekursiven Funktionen zu lernen? Dann is es OK^^
 
Mhh, also offensichtlich bist du ein Programmieranfänger und solltest wohl noch ein paar Tutorials durchlesen. Hier mal noch ein paar Tipps:
1. Parameter einer "main()" sind üblicherweise
int main(void) - falls das Programm keine Parameter erhalten soll
oder int main(int argc, char *argv[]) - falls du Parameter übergeben willst
Wie du die Parameter verwendest findest du in jeder C-Einführung.
2. Die Mainfunktion rekursiv aufzurufen halte ich für sehr schlechten Stil. Ich würde dir empfehlen entweder den Code nicht rekursiv zu schreiben oder eine neue Funktion zu deklarieren, die die Arbeit macht.

@wen auch immer: Ihr hättet die Forkbomb nicht löschen sollen :D
 
@flopalko: Jop das ist nur zum Üben gedacht ^^

@misu: jo hast recht, so weit bin ich noch nicht in C. Aber das wird schon. Bin ja am Üben.

Hab das Problem mit den Parametern jetzt so gelöst:

unter die eigentliche Funktion noch eine

int main()
{
lineal(0,100,3);
}

Bestimmt nicht sehr elegant oder so aber egal es funktioniert erstmal so.

Danke an alle für die Hilfe :D
 
int main() ist schlecht, weil das bedeutet, dass die Funktion eine beliebige Anzahl Parameter annimmt. Ändere dies in int main(void).
Außerdem gibt deine main() keinen Wert zurück. Wenn das Programm erfolgreich beendet wird, sollte man EXIT_SUCCESS zurückgeben, ansonsten EXIT_FAILURE.
Die beiden Makros werden in stdlib.h definiert.

€: Und was habt ihr gegen den rekursiven Aufruf von main()? Wenn man das vernünftig macht (also nicht so wie der Threadstarter),
sehe ich da keine Probleme. Habt ihr was gegen Rekursivität an sich? Das ist meiner Meinung nach eine legitime Problemlösungsstrategie,
wenn sie passend zum entsprechenden Problem ist. Das kann der Threadersteller zwar zweifelsohne nicht einschätzen, aber ich meine den
allgemeinen Fall :E
 
Zuletzt bearbeitet:
asdfman schrieb:
€: Und was habt ihr gegen den rekursiven Aufruf von main()? Wenn man das vernünftig macht (also nicht so wie der Threadstarter),
sehe ich da keine Probleme. Habt ihr was gegen Rekursivität an sich? Das ist meiner Meinung nach eine legitime Problemlösungsstrategie,
wenn sie passend zum entsprechenden Problem ist. Das kann der Threadersteller zwar zweifelsohne nicht einschätzen, aber ich meine den
allgemeinen Fall :E


Prinzipiell ist mit Rekursion natürlich überhaupt nichts verkehrt, aber die main()-Funktion rekursiv einzusetzen, halte ich schon für sehr fragwürdig.
 
Sicher nicht üblich und nichts, das mir schonmal untergekommen wäre, oder ich selbst schon gemacht hätte.
Aber an sich ist main() doch eine Funktion wie jede andere auch. Würd ich jetzt spontan so sagen.

Ist das nur so ein Gefühl von dir, dass du das blöd findest, oder könntest du mir einen guten Grund nennen,
das sein zu lassen. Ich will mal was dazu lernen :D
 
Aber an sich ist main() doch eine Funktion wie jede andere auch. Würd ich jetzt spontan so sagen.
Es ist nach dem C Standard auch völlig legal main() rekursiv aufzurufen (im Gegensatz zum C++-Standard) und muss entsprechend vom Compiler auch unterstützt werden, eine sinnvolle Verwendung dafür fällt mir allerdings auch nicht ein.
 
So grad aus dem Ärmel geschüttelt, wie wär sowas:

€: Vernünftiges Programm, das man ausprobieren kann:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  printf("%s\n", argv[0]);
  if(argc > 1)
    return main(--argc, ++argv);
  return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
asdfman schrieb:
Ist das nur so ein Gefühl von dir, dass du das blöd findest, oder könntest du mir einen guten Grund nennen,
das sein zu lassen. Ich will mal was dazu lernen :D

Es verstößt einfach gegen die allgemeine Erwartungshaltung, daß main() pro Programminstanz genau einmal aufgerufen wird. Bei den meisten Programmierern wird solcher Code wahrscheinlich zu einem kurzen Hääh?-Effekt führen. ;)
 
Da hast du wohl recht. Ich würde mich vermutlich auch wundern, wenn ich sowas lese.
Aber so ein absoluter Grund, das auf keinen Fall zu machen, ist das auch nicht.

Ich denke, mein Programm oben hätte (erweitert) einen legitimen Zweck, wenn man
die Kommandozeile einzeln stück für stück abarbeitet. So ist dann klarer, was main()
macht und man spart sich Schleifen undsoweiter, die eigentlich nichts mit der speziellen
Aufgabe zu tun haben, die main() erledigen soll.

Denke, in so einem Fall wäre eine rekursive main() sogar lesbarer, wenn man nur
die erste Irritation überwunden hat :D
 
Code:
main(--argc, ++argv);
Das wiederum verstößt im engeren Sinne gegen den Standard, da dieser vorschreibt, dass, wenn die Aufrufkonvention "int main(int argc, char** argv)" oder Äquivalente verwendet werden, argc die Anzahl der Enviromentewerte beim Programmaufruf und argv die übergebenen Werte enthalten müssen und argv[0] auf den Aufrufnamen des Programmes verweisen muss. Was bei deinem rekursiven main-Aufruf nicht mehr der Fall ist.
 
asdfman schrieb:
So grad aus dem Ärmel geschüttelt, wie wär sowas:

€: Vernünftiges Programm, das man ausprobieren kann:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  printf("%s\n", argv[0]);
  if(argc > 1)
    return main(--argc, ++argv);
  return EXIT_SUCCESS;
}

Ok, aber würde das hier den Zweck des Programms nicht deutlicher ausdrücken? ;)

Code:
int main( int argc, char **argv )
{
	for ( int i = 0; i < argc; ++i )
	{
		printf( "%s\n", argv[ i ] );
	}

	return EXIT_SUCCESS;
}
 
In dem Fall hast du wohl recht, aber das war ja nur ein Beispiel, dass man ein mehr oder weniger sinnvolles
bzw. funktionierendes Programm schreiben kann, in dem main() rekursiv aufgerufen wird. Da hatte ja hier
jemand Zweifel.

Um so ein Programm, wie oben beschrieben zu basteln (also eins, wo die Parameter jeweils einzeln mit einem
Aufruf von main() abgearbeitet werden), müsste ich mir mehr Arbeit machen für ein sinnvolles Beispiel, aber
ich denke, es ist doch klar, was ich meine, oder?

Außerdem ist deine Lösung auch nur eine Sache des Geschmacks. Im täglichen Leben würde ich es allerdings
jederzeit wie du mit einer Schleife machen.

Der Einwand von ghorst wiegt da schon deutlich schwerer, meiner Meinung nach.
Ergänzung ()

Habe die Sache gerade im IRC angesprochen und dort findet man, mein Programm verstoße nicht gegen den C99 Standard:

21:44:40 <sird> in der cdb sagen sie mein programm würde gegen den c standard verstoßen
21:44:40 <sird> http://nopaste.info/b12ba4855d.html
21:44:41 <sird> :<
21:44:51 <sird> IHR KENNT EUCH DA DOCH AUS
21:44:53 <sird> SAGT MAL :<
21:47:14 <cao> wtf?
21:47:16 <cao> warum sollte es?
21:47:37 <sird> [Die Begründung von ghorst oben]
21:48:09 <cao> 1. welcher standard?
21:48:27 <cao> ansi c/c89, c90, c99?
21:49:33 <cao> 2. stelle im standard?
21:51:09 <sird> ich denke wenn es so eine vorgabe geben sollte
21:51:20 <sird> bezieht sie sich nur auf den zeitpunkt zu dem das programm gestartet wird
21:51:48 <cao> http://c0x.coding-guidelines.com/5.1.2.2.1.html
21:51:55 <cao> habs pdf gerade nicht gefunden
21:52:07 <cao> aber da steht exakt nix
21:52:53 <cao> das ist btw. c99
21:52:54 <cao> nu
21:54:17 <cao> The intent is to supply to the program information determined prior to program startup
21:54:22 <cao> intent is to supply to the program informafrom elsewhere in the hosted environment.
21:54:34 <cao> from elsewhere in the hosted environment.
21:54:34 <cao> da
21:54:53 <cao> ganz klar, prior
21:54:56 <cao> und intent
21:55:15 <cao> kein shall, kein must, kein requires
21:57:34 <cao> weder icc noch gcc meckern bei --std=c89 und -pedantic

Scheint also erlaubt zu sein. Habe also mal wieder was neues über C gelernt. Danke an den Threadersteller und die anderen, die sich zu meiner Frage geäußert haben.
 
Zuletzt bearbeitet:
Zurück
Oben