compiler

N

nijntje

Neues Mitglied
Thread Starter
Dabei seit
30.03.2011
Beiträge
9
Reaktionspunkte
0
hallo leute,

ich habe eine frage zum compiler:

ich programmiere in c (erst seit kurzem) auf einem MacOsX Leopard. Bis jetzt habe ich immer nur auf build and run geklickt und anschliessend den Terminal geöffnet. Dort konnte ich bis jetzt den Output kleiner Programme ansehen.

Nun bin ich bei den Files angelangt, die man in einer Datei speichern kann oder von einer Datei einlesen. Aber jetzt funktioniert das nicht mehr mit dem einfach oben klicken. Fehlermeldung: Segmentation fault

Als der Assistent aber mit dem gcc compiler (terminal rechts unten) compiliert hat, hat's funktioniert.

Kann mir einer sagen, wo der Unterschied der beiden Terminal/Compiler ist?

Was müsste ich im gcc compiler (der rechts unten) eingeben?

Ich habe es mit gcc -lm -o main.exe main.c probiert, aber da passiert nichts.
Was mache ich falsch.

Danke schon mal
LG
nijntje
 
Steht vor dem "Segmentation fault" vielleicht auch noch "internal compiler error"?

Und was soll bitte dieses "rechts unten"? Verstehe ich irgendwie nicht. :) Wenn du im Terminal "gcc -o main.o main.c" eingibst, passiert auch nichts, außer in deinem Programm sind Fehler. Sofern wieder eine Eingabeaufforderung kommt, einfach dein Programm mit "./main.o" starten.

Außerdem noch 2 Sachen:
- Du programmierst für OS X, also ein UNIX basierendes Betriebssystem und nicht Windows. Also vergiss mal ganz schnell die Endung ".exe". ;) Lass die Endung einfach weg, oder nimm ".o". Das wäre Standard.

- Brauchst du die Option "-lm" wirklich?
 
Das Terminal ist Dein "Fenster" zur Kommandozeile. Mit der Kommandozeile startest Du Programme, wie zum Beispiel gcc.

"Unten rechts" verstehe ich da auch nicht :noplan:

Alex
 
"Unten rechts" verstehe ich da auch nicht
Ist bei Xcode 4 die Console zufällig standardmässig unten rechts im Fenster? (Bin noch immer bei Xcode 3.x)
Vielleicht verwechselt er ja die Console auch mit dem Terminal. :noplan: Folgendes klingt nämlich arg verdächtig danach:
Bis jetzt habe ich immer nur auf build and run geklickt und anschliessend den Terminal geöffnet. Dort konnte ich bis jetzt den Output kleiner Programme ansehen.
 
vielen dank für die rasche antwort.
ja jetzt klappt es mit dem ".o". Die Anleitung ist in diesem Fall nur für Windows User geschrieben...

Vor dem Segmetation fault steht nichts mehr. ist das nicht auch ein gcc compiler (also ich meine den, den man einfach anklicken kann, siehe Anhang)?

Mit dem Terminal rechts unten meinte ich den neben dem Papierkorb (siehe Bildschirmfoto), dort wo man die Kommandozeile eingeben muss.

Braucht man das -lm nicht, wenn man mathematische Funktionen wie sqrt() eingibt?
 

Anhänge

  • Bildschirmfoto 2011-03-30 um 20.41.15.png
    Bildschirmfoto 2011-03-30 um 20.41.15.png
    19,5 KB · Aufrufe: 53
  • Bildschirmfoto 2011-03-30 um 20.41.32.png
    Bildschirmfoto 2011-03-30 um 20.41.32.png
    40 KB · Aufrufe: 59
Kannst Du uns das Programm mal hochladen?

Alex
 
ja jetzt klappt es mit dem ".o". Die Anleitung ist in diesem Fall nur für Windows User geschrieben...
Windows Anleitungen generell vermeiden. Auf Linux, Unix, Mac OS X Anleitungen in Zukunft setzen. :)
Vor dem Segmetation fault steht nichts mehr. ist das nicht auch ein gcc compiler (also ich meine den, den man einfach anklicken kann, siehe Anhang)?
Das mit dem "Segmentation fault" scheint sich ja jetzt erledigt zu haben. Auf deinem ersten Bildschirmfoto, dieses Programm mit dem schwarzen Icon ist das Terminal. Dort kannst du Kommandos ausführen. "gcc" ist das Kommando für den Compiler. Was du auf deinem zweiten Bildschirmfoto siehst, dein "Exercise504" mit dem schwarzen Symbol daneben, ist das fertig komplierte Programm, welches von Xcode erstellt wurde. Ein Doppelklick darauf müsste eigentlich dein Terminal starten und das Programm ausführen. Allerdings wird nach Beendigung des Programms auch die Shell-Session beendet, so dass du nichts mehr in dieses Terminal-Fenster eingeben kannst.
Mit dem Terminal rechts unten meinte ich den neben dem Papierkorb (siehe Bildschirmfoto), dort wo man die Kommandozeile eingeben muss.
Das ist aber nicht bei jedem rechts unten. Diesen Balken unten bezeichnen man als "Dock". Dort kannst du deine Programm beliebig "reinziehen" und wieder "rausziehen". Einfach Programm nehmen, ins Dock ziehen und dann ist es drin und einfacher zu finden, wenn du es oft benutzt. Zum wieder Löschen aus dem Dock einfach rausziehen und irgendwo auf dem Bildschirm die Maus los lassen. Darauf folgt ein "Puff" und das Programm ist weg. Also es ist noch in deinem Programm-Ordner, aber halt nicht mehr im Dock. Achja und alle Programm die gerade offen sind, auch wenn du sie nicht im Dock hast, werden unten eingeblendet und das immer auf der rechten Seite des Docks. Kannst das Ganze ja mal ausprobieren in dem du andere Programme startest die nicht im Dock sind.

Braucht man das -lm nicht, wenn man mathematische Funktionen wie sqrt() eingibt?
Doch braucht man. Ich wollte nur sicher gehen, dass du auch weißt wozu das gut ist. Nicht, dass du es benutzt und eigentlich nicht brauchst. ;)
 
  • Gefällt mir
Reaktionen: below
super danke, nun ist fast alles klar.
nur noch eins:
das mit dem Segmentation fault hat sich leider noch nicht erledigt. habe ein anderes Programm ausgeführt. dort hat es funktioniert. beim anderen programm steht immer noch segmentation fault, egal ob im Terminal im Dock oder oben im Fenster.

ich verstehe nicht, wie der Assistent es geschafft hat in dem Terminal im Dock etwas einzugeben und dann das programm auszuführen, ohne das "Segmentation fault" aufscheint, bei ihm ist das programm gelaufen...
 
Da kann ich jetzt nur below zitieren:
Kannst Du uns das Programm mal hochladen?
Es handelt sich ja nur um eine Aufgabe und keinem geheimen Projekt. Da wir keine genaueren Informationen haben, müssten wir jetzt raten und das ist immer sehr ungünstig. Also entweder selbst noch etwas rumprobieren, google fragen oder einfach mal das Projekt hochladen und hoffen, dass das Problem schnell lokalisiert und gelöst wird. Wüsste einer auf Anhieb was einen "Segmentation fault" hervorruft, hätte er's dir wahrscheinlich schon verraten. Da dies nicht der Fall ist, musst du wohl davon ausgehn, dass wir jetzt bloß wissen, dass du irgendwo einen Fehler hast oder sonst was falsch gemacht hast und jetzt blind drauf los raten liegt uns nicht so. ;)
 
hier das programm, das nicht läuft:


#include <stdio.h>
#include <math.h>

int main()
{
FILE *f = fopen("DATA1.txt", "r");
int i = 1;
float X1 = 0, Y1 = 0;
float dist = 0;

while (!feof(f))
{
printf("hallo!");
fscanf(f, "%f %f", &X1, &Y1);

dist = sqrt((X1*X1)+(Y1*Y1));
printf("The distance from the origin no.%d is %.3f\n", i, dist);
i++;
}
fclose(f);


return 0;
}
 
sorry, hatte mühe mit dem raufladen...

segmentation fault (Schutzverletzung)
Bei jedem anderen läuft dieses Programm. ich kann keine fehler finden und die datei, die verwendet wird, habe ich im gleichen Ordner (Bildschirmfoto)
 

Anhänge

  • Bildschirmfoto 2011-03-30 um 21.48.46.png
    Bildschirmfoto 2011-03-30 um 21.48.46.png
    15,1 KB · Aufrufe: 39
Also wenn du was hochlädst, musst du nicht nur die .xcodeproj-Datei, sondern auch alle anderen Dateien, bis auf den "build" Ordner (den solltest du nicht reinpacken) hochladen.
segmentation fault (Schutzverletzung)
Bei jedem anderen läuft dieses Programm. ich kann keine fehler finden und die datei, die verwendet wird, habe ich im gleichen Ordner (Bildschirmfoto)
Deine Datei "DATA1.txt" liegt da auch falsch. Sofern du beim Compilieren den Debug-Modus ausgewählt hast, gehört deine Datei "DATA1.txt" in den entsprechenden Debug-Ordner, wo auch deine compilierte Datei liegt. Falls du dein Programm startest, sucht es nach deine Daten-Datei in dem Ordner wo sich auch dein Programm befindet. Siehe folgendes Bildschirmfoto: Screen shot 2011-03-30 at 21.52.23.png
 
Dein Fehler ist, dass Du glaubst, das alles klappt ;)

Beim fopen musst Du auch prüfen, ob die Datei auch wirklich geöffnet wurde (dann ist f nicht NULL).

Sonst fliegt Dir der Code beim feof mit eben einem Segmentation Fault um die Ohren

Alex
 
  • Gefällt mir
Reaktionen: TerminalX
ja, dort hatte ich den ordner vorher auch und jetzt wieder...
funktioniert immer noch nicht!

below, was heisst das genau?
 
Naja, man darf sich beim Programmieren nicht auf Sachen verlassen.

Du machst einfach f = fopen (Blah), und gehst davon aus, das es immer klappt. Das ist nicht klug. Besser ist, danach zu schreiben:
Code:
if (f == NULL) {
printf ("Oops, das hat wohl nicht geklappt! Konnte die Datei %s nicht öffnen\n", dateiname);
return 1;
}
Alex
 
super, danke für den tipp.
werde da aber morgen weitermachen...

Vielen Dank TerminalX und below!!
 
Du machst einfach f = fopen (Blah), und gehst davon aus, das es immer klappt. Das ist nicht klug. Besser ist, danach zu schreiben:
Code:
if (f == NULL) {
printf ("Oops, das hat wohl nicht geklappt! Konnte die Datei %s nicht öffnen\n", dateiname);
return 1;
}
Sowas ähnliches hatte ich auch gerade geschrieben... bevor ich mich verklickt habe und alles wieder weg war. :( Wie mich das nervt bei Browsern manchmal. :rolleyes:
Du kannst dein "fopen" auch noch in die if-Schleife packen und mit stderr als Ausgabe und perror arbeiten:
Code:
File *f;
if ( (f =  fopen("DATA1.txt", "r") == NULL) {
fprintf(stderr,"Datei konnte nicht geladen werden!");
perror("weil");
return 1;
}

ja, dort hatte ich den ordner vorher auch und jetzt wieder...
funktioniert immer noch nicht!
Deine "DATA1.txt" Datei muss im gleichen Ordner liegen wie deine "Exercise504" Datei (die mit dem schwarzen Icon), welche du ausführst. Also bei mir klappt das wunderbar.
 
Zurück
Oben Unten