Programmieren in C

Hier treffen sich Computer- und Technikfans.

Moderator: Moderatoren

Antworten
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Programmieren in C

Beitrag von Hörnäy »

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 :roll: ), 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...
Benutzeravatar
Philipp
Administrator
Beiträge: 18422
Registriert: 08.03.2000, 20:46
Geschlecht: männlich
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Philipp »

Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

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 :(
sailing2capeside

Beitrag von sailing2capeside »

Na Du hast ja die Ruhe weg: Red' doch mal Klartext, arbeitest Du jetzt an Deinem eigenen Computer oder in der Uni? (Die ja richtig grottig sein muss... ;) ) Linux oder Windows? Welcher Compiler? Das eine IDE wie RHIDE 'nen Compiler mitbringt, ist eher die Ausnahnme...
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

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...
sailing2capeside

Beitrag von sailing2capeside »

Stimmt: die Uni kann nichts dafür, wenn bei dem Wetter lieber schwänzt und am Strand abhängt :D. 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.
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

sailing2capeside hat geschrieben:Stimmt: die Uni kann nichts dafür, wenn bei dem Wetter lieber schwänzt und am Strand abhängt :D.
Öhm, hast du mich heute wo am Strand gesehen, oder was? ^_^ Selbst wenn es so gewesen wäre, hätte das auch nichts damit zu tun gehabt ;)
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ß ;) , weshalb ichs noch nie gemacht habe... Deshalb wusst ich einfach nicht, wies geht...
Sollte ich dann statt "gcc" halt was anderes eingeben? Danke jedenfalls für deine Hilfe, werd das einfach mal ausprobieren... :) Der Rest war ja fast genauso wie vorher, eigentlich gehts fast hauptsächlich darum, was vorne steht... Wie geh ich nochma in der Eingabeaufforderung in ein bestimmtes Verzeichnis? Was muss ich da vor dem Verzeichnis eingeben? Befinde mich da so selten :schaem:
sailing2capeside

Beitrag von sailing2capeside »

hoernaey hat geschrieben:Sollte ich dann statt "gcc" halt was anderes eingeben?
Davon gehe ich mal aus...
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
hoernaey 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 :schaem:
Verständlich verständlich :). Der Befehl heisst "cd" für change directory. Mit "cd .." kommst Du eine Ebene höher. Außerdem fleissig die Tab-Taste benutzen, damit kann man Namen vervollständigen, also z.B. "cd Eigene" eintippen und daraus wird dann "cd Eigene Musik" "cd Eigene Videos" etc.
Viel Spaß!
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

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? :ohwell: 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 :motz: 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.
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

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 :D
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...
Sunbreaker

Beitrag von Sunbreaker »

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 ;)
Meinst du sowas:

Code: Alles auswählen

for (i = 1; i <= Knoten; i++)
{
    // Befehle
}
?
Oder was genau meinst du?
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...
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.
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

Ja, danke, habs jetzt schon anders gelöst ;)

Aber wenn du grad da bist und Ahnung hast :D , 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:

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);

  ...
Vielleicht kannst du mir helfen, was da falsch ist? :schaem:
Sunbreaker

Beitrag von Sunbreaker »

Also ich seh da jetzt keinen Fehler. Hast du das Programm mal gedebuggt?
Benutzeravatar
Hörnäy
Beiträge: 7874
Registriert: 23.08.2005, 01:42
Geschlecht: weiblich
Wohnort: Home Sweet Home

Beitrag von Hörnäy »

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 :roll: ), aber das kam beim Debuggen raus:

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 ()
Sagt mir leider gar nichts...

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;
}
und alloc_graph diese hier:

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;
}
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 :(
Sunbreaker

Beitrag von Sunbreaker »

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

Code: Alles auswählen

(*g).Nachbar[i]
das hier

Code: Alles auswählen

g->Nachbar[i]
das sieht viel schöner aus. :)
Antworten

Zurück zu „Computer und Technik“