Fehler bei meinen ersten C Schritten

Diskutiere das Thema Fehler bei meinen ersten C Schritten im Forum Mac OS Entwickler, Programmierer.

  1. onyx

    onyx Thread Starter

    Hallo,
    bisher habe ich nur in Java und verschiedenen Skriptsprachen programmiert, muss aber jetzt für einen Kurs in C programmieren. Ich habe mir dazu Xcode installiert, doch habe ich "auf die Schnelle" keine Möglichkeit gefunden, die notwendigen Compiler-Flags anzugeben (dazu gleich mehr).
    Also habe ich meine Installation von Eclipse um CDT erweitert, um dort die Möglichkeit nutzen zu können, entsprechende Programme zu erstellen. Hier habe ich auch sofort die Möglichkeit gefunden, die entsprechenden Compiler-Flags zu setzten, welche wir nutzen sollen: -ansi -pedantic -D_POSIX_SOURCE -Wall -Werror.
    Wenn ich Eclipse nun mittels Druck auf Run anweise, den Quelltext auszuführen, erhalte ich die folgenden Fehlermeldungen:

    Mein Quelltext sieht wie folgt aus:

    Code:
    #include <stdio.h>
    
    /* Die Summe der Zahlen von 1 bis n berechnen und entsprechend ausgeben */
    
    main(){
    	
    	int sum;
    	int n;
    	
    	printf("Bitte geben Sie eine Zahl ein: ");
    	scanf("%d", &n);
    	
    	printf("Die eingegebene Zahl war %d\n", n);
    	
    	int sum_n(int n){
    		if (n > 0){
    			sum += n;
    			--n;
    			sum_n(n);
    		}
    		return sum;
    	}
    	printf("Summe von 1 bis %d: %d\n", n, sum_n(n));
    	
    return 0;
    }
    Drücke ich erneut auf Run, öffnet sich eine Fehlermeldung, die mich darauf hinweist: "Launch failed, no binaries".

    Testweise habe ich den Quelltext mal im Terminal ohne Compiler-Flags aufgerufen und das Programm funktioniert so, wie es soll.

    Wo liegt mein Fehler/meine Fehler und wie kann ich diese beheben?

    Vielen Dank im Voraus.

    Edit:
    Ich habe gerade in Xcode die entsprechenden Optionen gefunden, um die Flags zu setzen: Wenn -Wall gesetzt wird, bricht das Kompilieren ab (mit den o.g. Meldungen), wird dagegen -w gesetzt, läuft alles einwandfrei.
     
  2. mrwho

    mrwho Mitglied

    Beiträge:
    2.551
    Zustimmungen:
    84
    Mitglied seit:
    20.07.2003
    Ich habe mir C zwar nur sehr wenig Erfahrung - Compiler können bei den Flags aber recht pedant sein.

    Laut Google meckert er über die Schleife von sum_n innerhalb von main.

    Allgemein macht dies ein gesetztes --pedantic-errors, nimm mal -pedantic raus beim compile.
     
  3. anegmawad

    anegmawad Mitglied

    Beiträge:
    583
    Zustimmungen:
    68
    Mitglied seit:
    12.04.2007
    Problem:
    main() is teine Funktion
    sum_n() ist eine Funktion.
    sum_n() in wird in main() definiert.
    Du hast also eine Funktionsdefinition in einer Funktionsdefinition. Das erlaubt C nicht.

    Lösung:
    Setze die Funktionsdefinition vor main().

    Nachfrage: Du sollst einen Kurs programmieren, obwohl du selbst C nicht kennst?
     
  4. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008


    OMG :D

    Das ging vlt mal früher wenn überhaupt :D

    main ist keine Funktion -> Wissen über main Funktion fehlt
    sum_n ist auch keine Funktion -> es wäre eine wenn sie nicht innerhalb von main stehen würden :D -> davor setzen

    Variablen werden nicht initialisiert -> siehe int sum;

    Ich hab deinen code mal genommen und angepasst das es geht, das heisst aber noch lange nicht das er dadruch schöner wird

    Code:
    #include <stdio.h>
    
    /* Die Summe der Zahlen von 1 bis n berechnen und entsprechend ausgeben */
    
    int sum_n(int& sum, int n){
    
    	if (n > 0){
    		sum += n;
    		--n;
    		sum_n(sum, n);
    	}
    	return sum;
    }
    
    int main(){
    	int n = 0;
    	int sum = 0;
    	
    	printf("Bitte geben Sie eine Zahl ein: ");
    	scanf("%d", &n);
    
    	printf("Die eingegebene Zahl war %d\n", n);
    
    	printf("Summe von 1 bis %d: %d\n", n, sum_n(sum, n));
    	
    	return 0;
    }
    In dem fall ist es Sinnlos das über eien rekursive funktion zu machen -> wie du siehst ist eine referenz in der sum_n parameter liste noetig.

    Klar geht es so aber warum machst du nicht einer while schleife

    So ungefähr
    Code:
    int sum_n(int n){
    	int sum = 0;
    	while (n > 0){
    		sum += n;
    		--n;
    	}
    	return sum;
    }
    Wenn du es noch kürzer haben willst dann

    Code:
    int sum_n(int n){
    	int sum = 0;
    	while (n > 0)
    		sum += n--;
    	return sum;
    }
     
  5. anegmawad

    anegmawad Mitglied

    Beiträge:
    583
    Zustimmungen:
    68
    Mitglied seit:
    12.04.2007
    Beides ist eine Funktion. Das sieht auch der Compiler ziemlich so:
    Da steht nicht:
    Da steht:
     
  6. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008
    Es soll Leute geben die nicht gcc verwenden.

    Der Intel Compiler sagt was anderes. Das ist jetzt eben die Geschichte wer sich an den C Standard hält. ;)

    zumal ich oben sagte das sum_n eine funktion (ich hab nur die bedingung dazugeschrieben). Lies mal genauer ;)
     
  7. anegmawad

    anegmawad Mitglied

    Beiträge:
    583
    Zustimmungen:
    68
    Mitglied seit:
    12.04.2007
    Was sagt er denn …

     
  8. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008
    Soll ich dir hinpinkeln um es zu markieren oder wie


     
  9. anegmawad

    anegmawad Mitglied

    Beiträge:
    583
    Zustimmungen:
    68
    Mitglied seit:
    12.04.2007
    Es wäre nett, wenn du es einfach hier schreiben würdest. Ist ja eigentlch nicht so schwer, das mal eben hierher zu kopieren …

    Ansonsten ein kleiner Link von mir:
    http://de.wikipedia.org/wiki/Konjunktiv
     
  10. oneOeight

    oneOeight Mitglied

    Beiträge:
    51.482
    Zustimmungen:
    5.239
    Mitglied seit:
    23.11.2004
    du hast doch auch vorher java programmiert, hast du da je in main() selbst eine methode gesehen ;)
     
  11. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008
    Willst du jetzt eigentlich noch länger Bullshit verzapfen und den wikipedia Klugscheisser verzapfen oder dich an gewisse Regeln halten und den Thread wieder Ontopic bringen. Schreibst du gerne Offtopic? Wieviel Posts Spam willst du noch zulassen.

    Danke!
     
  12. below

    below Mitglied

    Beiträge:
    13.564
    Zustimmungen:
    1.088
    Mitglied seit:
    15.03.2004
    Glücklicherweise muss er/sie nur für einen Kurs programmieren -- da nehme ich mal an, dass er/sie Teilnehmer(in) ist ;)

    Alex
     
  13. below

    below Mitglied

    Beiträge:
    13.564
    Zustimmungen:
    1.088
    Mitglied seit:
    15.03.2004
    Lieber coacetan,

    es wäre ganz schön, wenn Du Deine Sprache ein bischen mäßigen könntest.

    Alex
     
  14. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008
    Letzter Offtopic Post :D

    Sei nicht so streng below, wir wissen ja wie es bei ihm um das lesen steht :)

    @anegmawad
    Wer mit wikipedia Seiten daher kommt erträgt sowas sicher ;)

    Quote vom Threadstarter

    @below
    Schön wäre vieles, man kann nicht alles bekommen was man schön findet.
    Ich hätte auch lieber eine Disukussion hier die dem Threadstarter hilft, anstelle eines Deutschkurses mit Wikipedia.
     
  15. anegmawad

    anegmawad Mitglied

    Beiträge:
    583
    Zustimmungen:
    68
    Mitglied seit:
    12.04.2007
    Ich will eigentlich nur wissen, welche Meldung des Intel-Compilers dich zu der Annahme geführt habe, es sei keine Funktion. Mit dem Thema hast du angefangen.

    Offenkundig ist der "Bullshit" main() sei keine Funktion von dir ja nun auch aufgegeben worden.

    Aber derartige Wortwahl ist sicher ein Zeichen von Qualifikation …
     
  16. wegus

    wegus Mitglied

    Beiträge:
    16.283
    Zustimmungen:
    2.902
    Mitglied seit:
    13.09.2004
    @coacetan:
    wer Hilfe haben mag, der sollte sich auch etwas konstruktiver mit Fragen dazu auseinandersetzen!
     
  17. coacetan

    coacetan Mitglied

    Beiträge:
    33
    Zustimmungen:
    2
    Mitglied seit:
    15.01.2008
    Ähm ich will ja keine Hilfe, ich bin ja nicht der Threadstarter. Ich hab einen umfangreichen Hilfepost für den Threadstarter geschrieben. Mehr kann ich nicht machen.
     
  18. wegus

    wegus Mitglied

    Beiträge:
    16.283
    Zustimmungen:
    2.902
    Mitglied seit:
    13.09.2004
    stimmt da habe ich mich verguckt! Trotzdem die nachdrückliche Bitte bleibt :)
     
  19. onyx

    onyx Thread Starter

    Hallo,
    ich besuche diesen Kurs nur und halte ihn nicht. Bei der Erstellung des Quelltextes habe ich mich daran orientiert, was wir in der ca. 30 minütigen Einführung (Crashkurs) vorgelegt bekommen haben.
    Mit der Funktion innerhalb von main() hätte ich auch selbst drauf kommen können, wenn ich nicht zuvor fast 10 Stunden arbeiten gewesen wäre und mir der Kopf rauchte.
    Zur Frage der Rekursion:
    In der Aufgabenstellung ist vorgegeben, Rekursion zu nutzen.

    Und jetzt bitte alle wieder vertragen.

    Danke und bis zur nächsten Frage.
     
  20. _ebm_

    _ebm_ Mitglied

    Beiträge:
    2.079
    Zustimmungen:
    202
    Mitglied seit:
    19.01.2008
    Möchtest du jetzt eine Definition des Begriffs "Rekursion"?

    Praktisches Beispiel:

    Code:
    void recurse()
    {
      recurse(); //Function ruft sich selbst - das ist Rekursion
    }
    
    int main()
    {
      recurse(); //startet die Rekursion
    }
    
    http://www.cprogramming.com/tutorial/lesson16.html

    Achtung! Du musst immernoch eine Abbruchbedingung entwerfen, sonst ist das wie eine unendliche Schleife! So wäre ein Rückgabewert denkbar, der sich beim erreichen der Abbruchbedingung in der Funktion ändert und dann ausgewertet wird.

    (In der Berechenbarkeitstheorie gibt es übrigens den Nachweis,dass eine rekursive Funktion durch eine for- oder while-schleife ersetzbar ist und umgekehrt)
     
Die Seite wird geladen...

MacUser.de weiterempfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Akzeptieren Weitere Informationen...