Programmieren in C
Moderator: Moderatoren
Programmieren in C
hab ein problem... und zwar muss ich für mein mathestudium auch einen kurs "computermathematik" machen, wir hatten letztes semester schon "programmieren in c", also mit dem programmieren an sich hab ich erstmal kein problem (hoffentlich
), aber im programmierkurs haben wir so einen account auf dem uni-server bekommen, auf dem wir dann programmieren und compilieren konnten... wir müssen aber ende des monats nun für coma ein programm abgeben und ich weiß gar nicht, was ich da für nen compiler nehmen soll...
gibts da was kostenloses? wo krieg ich das her? und in welchem editor arbeite ich da am besten?
ich hab zwar vor dem kurs letztes jahr schon mal privat angefangen, programmieren ein bisschen zu lernen, aber das hat bei mir nicht richtig funktioniert, weil ich nicht gerafft hab, wie und wo ich dann im endeffekt compilieren muss... naja, vielleicht kann mir jemand aushelfen...
achso, wir sollen diese programme auch wieder in c programmieren, also sollte der compiler natürlich auch dafür sein...

gibts da was kostenloses? wo krieg ich das her? und in welchem editor arbeite ich da am besten?
ich hab zwar vor dem kurs letztes jahr schon mal privat angefangen, programmieren ein bisschen zu lernen, aber das hat bei mir nicht richtig funktioniert, weil ich nicht gerafft hab, wie und wo ich dann im endeffekt compilieren muss... naja, vielleicht kann mir jemand aushelfen...
achso, wir sollen diese programme auch wieder in c programmieren, also sollte der compiler natürlich auch dafür sein...
- Philipp
- Administrator
- Beiträge: 18422
- Registriert: 08.03.2000, 20:46
- Geschlecht: männlich
- Wohnort: Hamburg
- Kontaktdaten:
Guck mal hier:
GCC, the GNU Compiler Collection
oder hier:
Microsoft Visual C++ 2005 Express Edition
GCC, the GNU Compiler Collection
oder hier:
Microsoft Visual C++ 2005 Express Edition
So, ich hab immer noch nicht angefangen mit dem Programmieren, weil ich mich irgendwie nicht so recht rangetraut habe. Aber langsam wirds eng... Mein Hauptproblem is eigentlich ein ziemlich dämliches... Und zwar hab ich, glaube ich, den Compiler schon installiert. Ich hatte mir das nämlich schon mal drauf gemacht und damals hatte es ja nicht geklappt. Da hatte ich aber auch ein Buch und deshalb weiß ich jetzt nicht mehr, wie ich überhaupt kompiliere... Also, ich muss ja irgendwie in die Eingabaufforderung und dann irgendwas eingeben, um den Compiler mit dem Programm aufzurufen...
Wollte mir auch als Benutzeroberfläche dieses RHIDE runterladen, aber da alles auf Englisch is, raff ich nicht so ganz, wie ich das Programm dann aufrufe bzw. installiere, da is nämlich keine Anwendungsdatei dabei, meine ich...
Hat nicht irgendjemand Erfahrung mit dem Programmieren in C und würde mir mal aushelfen? Ist wirklich wichtig... Vielleicht falls jemand mehr Ahnung hat auch per ICQ oder Mail, ganz egal... Ich bin echt verzweifelt
Wollte mir auch als Benutzeroberfläche dieses RHIDE runterladen, aber da alles auf Englisch is, raff ich nicht so ganz, wie ich das Programm dann aufrufe bzw. installiere, da is nämlich keine Anwendungsdatei dabei, meine ich...
Hat nicht irgendjemand Erfahrung mit dem Programmieren in C und würde mir mal aushelfen? Ist wirklich wichtig... Vielleicht falls jemand mehr Ahnung hat auch per ICQ oder Mail, ganz egal... Ich bin echt verzweifelt

An meinem eigenen natürlich, aber die Uni hat ja nix damit zu tun, dass ich nicht compilieren kann
Windows, Compiler DJGPP, RHIDE hab ich auch nur zusätzlich runtergeladen, weils empfohlen wurde. Arbeite momentan mit dem normalen Windows- Editor
Weil ich RHIDE, wie gesagt, nicht installieren konnte... Den Compiler hab ich schon vor längerer Zeit runtergeladen, ihn aber bisher nie benutzt, weshalb ich auch nicht weiß, wie ich ihn aufrufen muss...


Stimmt: die Uni kann nichts dafür, wenn bei dem Wetter lieber schwänzt und am Strand abhängt
. Jedenfalls kann ich mir nicht vorstellen, dass man nicht irgendwann mal den Compilier-Befehl vorgeführt bekommt...
DJGPP kenn ich gar nicht, aber nach kurzem überfliegen scheint der wie der GCC gestrickt zu sein: Also einfach eine Windows-Eingabeaufforderung öffnen und sowas im Stil von "gcc hello.c -o hello.exe" eintippen.


DJGPP kenn ich gar nicht, aber nach kurzem überfliegen scheint der wie der GCC gestrickt zu sein: Also einfach eine Windows-Eingabeaufforderung öffnen und sowas im Stil von "gcc hello.c -o hello.exe" eintippen.
Öhm, hast du mich heute wo am Strand gesehen, oder was?sailing2capeside hat geschrieben:Stimmt: die Uni kann nichts dafür, wenn bei dem Wetter lieber schwänzt und am Strand abhängt.


Es ist nur so, dass wir vorher immer über nen Uni- Server kompiliert haben. Da war das alles genau erklärt worden. Das war aber auch ein anderes System... und ich wusste jetzt einfach nicht, wie ich das in Windows auf meinem PC mache. In diesem Semester haben wir nur eine Programmieraufgabe gestellt bekommen und der Prof ging wohl selber davon aus, dass wir das einfach können, da wir ja vorher schon programmiert haben. Die meisten könnens wohl auch, nur hab ich mit meinen Kommilitonen wenig zu tun und programmiere selten in meiner Freizeit so zum Spaß

Sollte ich dann statt "gcc" halt was anderes eingeben? Danke jedenfalls für deine Hilfe, werd das einfach mal ausprobieren...


Davon gehe ich mal aus...hoernaey hat geschrieben:Sollte ich dann statt "gcc" halt was anderes eingeben?
1. Kann sein, dass man gcc in jedem Verzeichnis aufrufen kann - dann ist's am unkompliziertesten
2. Kann sein, dass man gcc nur in dem dgjpp-Installationsverzeichnis starten kann - dann muss Du natürlich erst dort hin
3. Kann sein, dass der Compiler gar nicht gcc heißt - dann weiß der Kuckuck
Verständlich verständlichhoernaey hat geschrieben:Wie geh ich nochma in der Eingabeaufforderung in ein bestimmtes Verzeichnis? Was muss ich da vor dem Verzeichnis eingeben? Befinde mich da so selten

Viel Spaß!
So, vielen Dank auf jeden Fall schon mal, du hast mir sehr weitergeholfen.
Hab mich jetzt mal dem Compilier- Problem mit einem alten Programm angenommen, von dem ich weiß, dass es funktioniert...
Bin dann in der Eingabeaufforderung in das Verzeichnis, in dem das Programm stand. Hab dann den Befehl so eingegeben, wie du es geschrieben hast, nur natürlich mit dem Programmnamen und dann kam "Der Befehl "gcc" ist entweder falsch geschrieben oder konnte nicht gefunden werden." Hab nochmal im Ordner von DJGPP geschaut und da gibts im bin- Ordner die Anwendungsdatei "gcc", also müsste der Befehl doch eigentlich schon richtig sein, oder?
Vielleicht stimmt auch was mit dem Compiler nicht, vielleicht muss ich ihn nochma runterladen und neu installieren oder so... 
EDIT: Also, mein Problem hat sich grad insofern erledigt, da ich Kontakt zu meinem Prof aufgenommen hatte. Da mir hier erstmal keiner antwortete, dachte ich, dass mir vielleicht keiner helfen kann, und hab ihm ne mail geschrieben, weil ich eh noch fragen wollte, ob ich das Programm statt als email auch ausgedruckt irgendwie abgeben kann, da ich die Woche umziehe... Jedenfalls hat er mir gesagt, dass wir doch wieder einen Uni- Account bekommen können wie im letzten Semester auch... Das hat er wahrscheinlich verteilt in der Vorlesung, in der ich nicht war
Naja, jedenfalls krieg ich wohl morgen nen Account und da weiß ich dann auch wieder, wie man so nen blöden Compiler aufruft. Dann trotzdem nochmal vielen Dank, sailing2capeside.
Hab mich jetzt mal dem Compilier- Problem mit einem alten Programm angenommen, von dem ich weiß, dass es funktioniert...
Bin dann in der Eingabeaufforderung in das Verzeichnis, in dem das Programm stand. Hab dann den Befehl so eingegeben, wie du es geschrieben hast, nur natürlich mit dem Programmnamen und dann kam "Der Befehl "gcc" ist entweder falsch geschrieben oder konnte nicht gefunden werden." Hab nochmal im Ordner von DJGPP geschaut und da gibts im bin- Ordner die Anwendungsdatei "gcc", also müsste der Befehl doch eigentlich schon richtig sein, oder?


EDIT: Also, mein Problem hat sich grad insofern erledigt, da ich Kontakt zu meinem Prof aufgenommen hatte. Da mir hier erstmal keiner antwortete, dachte ich, dass mir vielleicht keiner helfen kann, und hab ihm ne mail geschrieben, weil ich eh noch fragen wollte, ob ich das Programm statt als email auch ausgedruckt irgendwie abgeben kann, da ich die Woche umziehe... Jedenfalls hat er mir gesagt, dass wir doch wieder einen Uni- Account bekommen können wie im letzten Semester auch... Das hat er wahrscheinlich verteilt in der Vorlesung, in der ich nicht war

Hab nochmal zwei Fragen, da ich mit dem Programmieren mittlerweile angefangen habe...
1. Wie weist man einem Zeiger Speicher zu?
Hab das genauso gemacht wie vorher auch, aber es gibt mir beim Compilieren "Warning: Assignment makes integer from pointer without a cast". Hab auch einen Zeiger auf Zeiger gemacht. Also ich hab geschrieben: "**graph = malloc((Kanten + 2*Knoten)*sizeof(int));
2. Wie schreib ich genau einen Befehl "For i = 1 to Knoten do {Befehle}"?
Momentan steht da nämlich "Parse error before to". Hab den Befehl bisher noch nie in einem Programm benutzt... Falls es keiner weiß, mach ich halt ne normale for-Schleife, aber wär generell ja mal gut zu wissen
EDIT: Okay, 1. hat sich erledigt. Anscheinend haben wir vorher nur die ** gelassen, weil in der gleichen Zeile die Variable eingeführt wurde. Hab sie jetzt weggelassen und dann gings...
Hab dafür aber ne andere Frage
3. Zeile "*graph->i = i + 1;" Fehlermeldung "Request for member 'i' in something not a structure or a union"
Ich will da erstma ein Array machen, in dem die Namen aller Knoten (die Zahlen 1 bis # der Knoten) gespeichert werden. Von denen sollen dann wieder Arrays abgehen, in denen die durch Kanten anliegenden Knoten und die Kantengewichte gespeichert werden...
1. Wie weist man einem Zeiger Speicher zu?
Hab das genauso gemacht wie vorher auch, aber es gibt mir beim Compilieren "Warning: Assignment makes integer from pointer without a cast". Hab auch einen Zeiger auf Zeiger gemacht. Also ich hab geschrieben: "**graph = malloc((Kanten + 2*Knoten)*sizeof(int));
2. Wie schreib ich genau einen Befehl "For i = 1 to Knoten do {Befehle}"?
Momentan steht da nämlich "Parse error before to". Hab den Befehl bisher noch nie in einem Programm benutzt... Falls es keiner weiß, mach ich halt ne normale for-Schleife, aber wär generell ja mal gut zu wissen

EDIT: Okay, 1. hat sich erledigt. Anscheinend haben wir vorher nur die ** gelassen, weil in der gleichen Zeile die Variable eingeführt wurde. Hab sie jetzt weggelassen und dann gings...
Hab dafür aber ne andere Frage

3. Zeile "*graph->i = i + 1;" Fehlermeldung "Request for member 'i' in something not a structure or a union"
Ich will da erstma ein Array machen, in dem die Namen aller Knoten (die Zahlen 1 bis # der Knoten) gespeichert werden. Von denen sollen dann wieder Arrays abgehen, in denen die durch Kanten anliegenden Knoten und die Kantengewichte gespeichert werden...
Meinst du sowas:hoernaey hat geschrieben:2. Wie schreib ich genau einen Befehl "For i = 1 to Knoten do {Befehle}"?
Momentan steht da nämlich "Parse error before to". Hab den Befehl bisher noch nie in einem Programm benutzt... Falls es keiner weiß, mach ich halt ne normale for-Schleife, aber wär generell ja mal gut zu wissen
Code: Alles auswählen
for (i = 1; i <= Knoten; i++)
{
// Befehle
}
Oder was genau meinst du?
Wie soll von einem Array etwas abgehen? Ich versteh nicht, wie du das machen willst. Also ich würde das ganze einfach mit Strukturen machen. Das ist effektiv und relativ einfach, finde ich.hoernaey hat geschrieben:Hab dafür aber ne andere Frage Big Smile
3. Zeile "*graph->i = i + 1;" Fehlermeldung "Request for member 'i' in something not a structure or a union"
Ich will da erstma ein Array machen, in dem die Namen aller Knoten (die Zahlen 1 bis # der Knoten) gespeichert werden. Von denen sollen dann wieder Arrays abgehen, in denen die durch Kanten anliegenden Knoten und die Kantengewichte gespeichert werden...
Ja, danke, habs jetzt schon anders gelöst
Aber wenn du grad da bist und Ahnung hast
, dann hätt ich schon wieder ne andere Frage...
Hab ne Funktion geschrieben, die dem Graph Speicher zuweisen soll, aber ich bekomme einen "segmentation fault". Das ist der Anfang:
Vielleicht kannst du mir helfen, was da falsch ist? 

Aber wenn du grad da bist und Ahnung hast

Hab ne Funktion geschrieben, die dem Graph Speicher zuweisen soll, aber ich bekomme einen "segmentation fault". Das ist der Anfang:
Code: Alles auswählen
struct graph *alloc_graph(char *name)
{
int Knoten, i, Anfang, Kanten, *grad;
struct graph *g = malloc(sizeof(struct graph));
FILE *gfile = fopen(name, "r");
fscanf(gfile, "%d", &Knoten);
fscanf(gfile, "%d", &Kanten);
/*hier hab ich jetzt ein debug-printf eingefügt, das nicht mehr ausgeführt wird, stattdessen erscheint "Segmentation fault"*/
printf("%d", Knoten);
...

Ja, ist jetzt zwar eh eigentlich zu spät, da ich das Programm Freitag bis 24 Uhr abgeben sollte und es nicht geschafft habe (mal sehen, was der Prof dazu sagt
), aber das kam beim Debuggen raus:
Sagt mir leider gar nichts...
Die Funktion graph_einlesen ist bei mir folgende:
und alloc_graph diese hier:
Ich hab einfach keine Ahnung, warum da der Fehler schon auftritt... Naja, falls dir was dazu einfällt, kannst dus ja mal schreiben. Werde in den nächsten Tagen vielleicht im Rechenzentrum hier an der Uni nochma online gehen (hab zu Hause wegen Umzug seit Freitag kein Internet). Vielleicht darf ich das Programm ja noch später abgeben 

Code: Alles auswählen
Starting program: /home/coma/coma18/work/dijkstra
(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...Welcher Graph soll eingelesen werden?:
graph1.txt
graph1.txt
Program received signal SIGSEGV, Segmentation fault.
0x10924 in graph_einlesen ()
Die Funktion graph_einlesen ist bei mir folgende:
Code: Alles auswählen
struct graph *graph_einlesen(char *name)
{
struct graph *g;
int i, j, Anfang, Ende, Gewicht, Knoten, Kanten;
FILE *gfile = fopen(name, "r");
g = alloc_graph(name);
if (gfile == NULL) return 0;
fscanf(gfile, "%d", &Knoten);
fscanf(gfile, "%d", &Kanten);
for (i = 0; i < Kanten; i++)
{
fscanf(gfile, "%d", &Anfang);
fscanf(gfile, "%d", &Ende);
fscanf(gfile, "%d", &Gewicht);
for (j = 0; (*g).Nachbar[Anfang - 1][j] != NULL; j = j + 2);
(*g).Nachbar[Anfang - 1][j] = Ende;
j++;
(*g).Nachbar[Anfang - 1][j] = Gewicht;
}
fclose(gfile);
return g;
}
Code: Alles auswählen
struct graph *alloc_graph(char *name)
{
int Knoten, i, Anfang, Kanten, *grad;
struct graph *g = malloc(sizeof(struct graph));
FILE *gfile;
printf("c");
if ((gfile = fopen(name, "r")) != NULL) {
fscanf(gfile, "%d", &Knoten);
printf("b");
fscanf(gfile, "%d", &Kanten);
printf("a");
} else printf("Konnte Datei nicht oeffnen!\n");
printf("%d", Knoten);
grad = malloc(sizeof(int) * Knoten);
for (i = 0; i < Kanten; i++){
fscanf(gfile, "%d\n", &Anfang);
if (grad[Anfang] == NULL) grad[Anfang] = 1;
else grad[Anfang]++;
}
(*g).Knoten = Knoten;
(*g).grad = grad;
for (i = 0; i < Knoten; i++)
{
(*g).Nachbar[i] = malloc(sizeof(int) * grad[i] * 2);
}
fclose(gfile);
return g;
}

Also ich sehe da wie gesagt keinen Fehler. Bei mir funktioniert der erste Teil und das Debug-printf gibt auch das richtige aus. Wie sieht denn die Datei aus, aus der du liest?
Achja, schreib doch mal statt
das hier
das sieht viel schöner aus. 
Achja, schreib doch mal statt
Code: Alles auswählen
(*g).Nachbar[i]
Code: Alles auswählen
g->Nachbar[i]
