Fehler bei meinen ersten C Schritten

O

onyx

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:

make: *** [rek-sum.o] Error 1 uebungsaufgabe0 line 0
ISO C forbids nested functions uebungsaufgabe0 rek-sum.c line 15
ISO C90 forbids mixed declarations and code uebungsaufgabe0 rek-sum.c line 22
return type defaults to 'int' uebungsaufgabe0 rek-sum.c line 5

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.
 
Zuletzt bearbeitet von einem Moderator:
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.
 
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?
 
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)...............



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;
}
 
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
Beides ist eine Funktion. Das sieht auch der Compiler ziemlich so:
Da steht nicht:
ISO C forbids nesting of something, which is not a funtion in not a function.
Da steht:
ISO C forbids nested functions uebungsaufgabe0 rek-sum.c line 15
 
Beides ist eine Funktion. Das sieht auch der Compiler ziemlich so:
Da steht nicht:

Da steht:

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 ;)
 
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. ;)
Was sagt er denn …

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

sum_n ist auch keine Funktion -> es wäre eine wenn sie nicht innerhalb von main stehen würden -> davor setzen
Beides ist eine Funktion. Das sieht auch der Compiler ziemlich so:
Da steht nicht:
Zitat:
ISO C forbids nesting of something, which is not a funtion in not a function.
 
du hast doch auch vorher java programmiert, hast du da je in main() selbst eine methode gesehen ;)
 
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

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!
 
Nachfrage: Du sollst einen Kurs programmieren, obwohl du selbst C nicht kennst?

Glücklicherweise muss er/sie nur für einen Kurs programmieren -- da nehme ich mal an, dass er/sie Teilnehmer(in) ist ;)

Alex
 
Glücklicherweise muss er/sie nur für einen Kurs programmieren -- da nehme ich mal an, dass er/sie Teilnehmer(in) ist ;)

Alex

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
muss aber jetzt für einen Kurs in C programmieren


@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.
 
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!
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 …
 
@coacetan:
wer Hilfe haben mag, der sollte sich auch etwas konstruktiver mit Fragen dazu auseinandersetzen!
 
@coacetan:
wer Hilfe haben mag, der sollte sich auch etwas konstruktiver mit Fragen dazu auseinandersetzen!

Ä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.
 
stimmt da habe ich mich verguckt! Trotzdem die nachdrückliche Bitte bleibt :)
 
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.
 
  • Gefällt mir
Reaktionen: below
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)
 
Zurück
Oben Unten