Probleme bei der Kompilierung meines Programms unter Linux



  • Hallo!

    Bevor ich zu meiner eigentlichen Frage komme.... Ich bin nicht sonderlich gut im Programmieren, und für das, worum es hier dann gehen soll, habe ich mehr als 2 Wochen gebraucht, damit überhaupt was zustande kommt. Mir fällt das wirklich sehr schwer. Ich habe alle Sachen durchgelesen die man hier beachten soll vor dem Posten, jedoch sehe ich aufgrund meines doch ziemlich begrenzten Könnens keine Möglichkeit, den Code irgendwie einzukürzen, da ich schon Probleme hatte, ihn überhaupt zu erstellen. Habt bitte, wenn möglich, ein wenig Nachsicht mit mir....

    Ok, kommen wir nun zu meiner Frage. Die Aufgabenstellung lautet eine Liste von Dominosteinen einzulesen und über eine einfach verkettete Liste zu speichern und dann eben, wie "echte" Dominosteine, diese zu verketten (also gleiche Zahlen aneinander legen).

    Ich habe schon das ganze Programm fertig. Eigentlich läuft das Programm auf meinem Windows-Rechner mit Code::Blocks, aber ich muss es unter Linux auf einem Login-Server meiner Uni zum laufen bringen und das geht nicht. Ich verzichte erstmal auf den Code, da ich wie gesagt überhaupt nicht sehe, wie ich ihn einkürzen könnte und das sehr, sehr viel ist.

    Prinzipiell ist mein Programm so aufgebaut:
    - Struct zum verwalten der Dominosteine
    - Struct zum verwalten der Listenelemente für die Ringliste
    - Funktionen zum: Drehen der Steine, Löschen der Steine aus der Urliste, zum Ausgeben der Liste, Erstellen einer Ringliste
    - Hauptprogramm

    Wenn ich das Programm ausführen will, gibt mir der Kompiler einen "Speicherzugriffsfehler".

    Ich habe dann mit -wall kompiliert und bekomme eine Menge Fehler die alle so oder so ähnlich aussehen (habe jetzt nur einen mal exemplarisch rausgepickt):
    In function _start': (.text+0x0): multiple definition of_start'
    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o: (.text+0x0): first defined here

    und für so ziemlich alle Variablen, die ich angelegt habe kommt das hier:
    "multiple definition of `entfernen(domino*)'
    [programmname]: (.text+0x120): first defined here"

    Google sagt mir, es ist ein Stack Overflow. Also irgendwas ist bei der Definition der Variablen nicht richtig? Leider sind alle Erklärungen die ich gefunden habe auf englisch, und obwohl ich das gut spreche sind diese Erklärung für mich nicht einleuchtend und ich weiß nicht was ich da nun tun muss.

    Vielleicht könnt ihr mir auch erstmal Tipps geben, welchen Teil vom Code ich posten könnte zur Fehlerbehebung?

    Ich entschuldige mich jetzt schonmal für den (vermutlich sehr großen) Aufwand....



  • Mangan2504 schrieb:

    Ich verzichte erstmal auf den Code, da ich wie gesagt überhaupt nicht sehe, wie ich ihn einkürzen könnte und das sehr, sehr viel ist.

    Jo, das ist blöd.

    Mangan2504 schrieb:

    Wenn ich das Programm ausführen will, gibt mir der Kompiler einen "Speicherzugriffsfehler".

    Kompilier mal mit -g -ggdb3 , lass

    $ ulimit -c unlimited
    

    ausführen, führe dann dein Programm aus, und schau dir mal an, was der Debugger dazu sagt:

    $ gdb <Programmname> core
    

    Oder wie der Core-Dump auf deinem System halt genannt wird/wo er gespeichert wird.

    Mangan2504 schrieb:

    In function `_start':
    (.text+0x0): multiple definition of `_start'
    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o: (.text+0x0): first defined here
    

    Hast du zufällig eine Funktion in deinem Code, die "_start" heißt? Oder eine Variable?

    Das ist eine Fehlermeldung des Linkers, der sich darüber auskotzt, dass deine Objektdateien auf Symbole nicht eindeutig referenzieren. In deinem Fall sagt er "Hör mal, ich habe hier zweimal das Symbol _start , einmal in der C-Runtime (kommt vom Betriebssystem), und einmal in (hast du nicht gepostet). Kann ich nicht bauen, ich mach Feierabend.".

    Mit welchem Buch lernst du programmieren?

    Mangan2504 schrieb:

    "multiple definition of `entfernen(domino*)'
    [programmname]: (.text+0x120): first defined here"
    

    Und das schreit förmlich nach "Ich habe nicht verstanden, wie Header-Files funktionieren". In das Header-File gehört das Interface, und in die TUs kommt der Code. Ausnahme: Templates (und selbst da kann man Tricks anwenden, z.B. die Implementierung in eine TU packen und dann inkludieren) und statische Inline-Funktionen.

    Dein Linker beschwert sich darüber, dass für das Programm, dass er bauen soll, Symbole (wieder) mehrfach deklariert sind ...

    So langsam habe ich entweder das Gefühl:

    - du machst da Sachen, die für dich noch VIIIIIEL zu hoch sind - a'la "ich geh mal ein paar Kapitel weiter in meinem Buch, und da sieht das richtig cool aus, also mach ich das auch".
    - du hast im Unterricht/in den Vorlesungen nicht aufgepasst.
    - euer Lehrer/Dozent ist inkompetent und rasselt den Stoff nur so runter.

    Mangan2504 schrieb:

    Google sagt mir, es ist ein Stack Overflow.

    Und wie kommst du darauf? Ein Segfault ist erstmal unerlaubter Zugriff auf Speicher. Das kann alles mögliche sein. Oder hast du doch schon debuggt und es uns nicht gesagt? 👎

    Mangan2504 schrieb:

    Also irgendwas ist bei der Definition der Variablen nicht richtig? Leider sind alle Erklärungen die ich gefunden habe auf englisch, und obwohl ich das gut spreche sind diese Erklärung für mich nicht einleuchtend und ich weiß nicht was ich da nun tun muss.

    Du willst mich jetzt doch verarschen!

    Machen wir mal einen ganz bescheuerten Test: ich verwende nicht google, sondern duckduckgo.com, eine Suchmaschine, die eventuell nicht immer die besten Ergebnisse raussucht. Da gebe ich mal "gcc multiple definition of" ein. Erster Treffer ist dieser Thread, wo das erklärt wird.

    Joachim Pileborg schrieb:

    In C++ (as well as in C) there is a difference between declaring and defining things like variables. What you are doing in the header file is defining the variables, which means that every source file that includes the header file will have the definitions.

    Da wir nicht wissen, WAS du gegoogelt hast, weiß ich nicht, welche Erklärungen du gelesen hast. Aber lass dir gesagt sein, wenn du den Namen dieser Seite, "Stack Overflow", mit deinem Problem assoziiert hast, dann steht es entweder um deine Englischkenntnisse überhaupt nicht gut, oder du hast dich überhaupt mal gar nicht informiert.



  • Aus wieviel Dateien besteht dein Programm?

    Vielleicht könnt ihr mir auch erstmal Tipps geben, welchen Teil vom Code ich posten könnte zur Fehlerbehebung?

    Erstmal deine Headerdatei und den Anfang deiner .cpp-Datei



  • Entschuldige, genau mit solchen Reaktionen hab ich schon gerechnet. Ich möchte noch anmerken, dass ich nicht absichtlich provozieren möchte oder sonstwas.

    dachschaden_off schrieb:

    Kompilier mal mit -g -ggdb3 , lass

    $ ulimit -c unlimited
    

    ausführen, führe dann dein Programm aus, und schau dir mal an, was der Debugger dazu sagt:

    $ gdb <Programmname> core
    

    Oder wie der Core-Dump auf deinem System halt genannt wird/wo er gespeichert wird.

    Habe ich versucht, es kommt: not in executable format: File format not recognized
    Ich habe angegeben <programm.cpp> . Wenn ich es ohne .cpp probiere, kommt "Datei oder Verzeichnis nicht gefunden".

    dachschaden_off schrieb:

    Mit welchem Buch lernst du programmieren?

    Bisher mit keinem. Das Problem ist, dass Dozent und Übungsleiter sich manchmal nicht so ganz grün sind und sich teilweise wiedersprechen. Unser Übungsleiter hat heute die Frage, welche Bücher wir nutzen könnten, erstmal damit abgewiegelt, dass alles wohl ziemlich über unserem Niveau sei und dann zögerlich den Sedgewick empfohlen, allerdings mit dem Zusatz, es wäre nur unter großer Vorsicht zu verwenden, weil er sehr viele Fehler enthalten würde. Bisher habe ich hauptsächlich damit programmiert, was wir in Vorlesung und Übung gemacht haben. In den Amerkungen zu den Aufgaben steht auch, dass alles was benötigt wird zu dem Zeitpunkt dann schon in Übung/Vorlesung behandelt wurde. Ich weiß dass das nicht ideal ist, aber bei solchen Wiedersprüchen weiß ich dann auch gar nicht mehr, was ich benutzen kann um es zu lernen.

    dachschaden_off schrieb:

    Mangan2504 schrieb:

    "multiple definition of `entfernen(domino*)'
    [programmname]: (.text+0x120): first defined here"
    

    Und das schreit förmlich nach "Ich habe nicht verstanden, wie Header-Files funktionieren". In das Header-File gehört das Interface, und in die TUs kommt der Code. Ausnahme: Templates (und selbst da kann man Tricks anwenden, z.B. die Implementierung in eine TU packen und dann inkludieren) und statische Inline-Funktionen.

    Dein Linker beschwert sich darüber, dass für das Programm, dass er bauen soll, Symbole (wieder) mehrfach deklariert sind ...

    So langsam habe ich entweder das Gefühl:

    - du machst da Sachen, die für dich noch VIIIIIEL zu hoch sind - a'la "ich geh mal ein paar Kapitel weiter in meinem Buch, und da sieht das richtig cool aus, also mach ich das auch".
    - du hast im Unterricht/in den Vorlesungen nicht aufgepasst.
    - euer Lehrer/Dozent ist inkompetent und rasselt den Stoff nur so runter.

    Vermutlich habe ich es nicht verstanden, und wenn es nach mir ginge würde ich das auch langsamer angehen. Aber ich kann nicht, denn ich stehe unter Zeitdruck, da wir alle zwei Wochen lauffähige Programme abgeben müssen zu immer komplexer werdenden Aufgaben.

    dachschaden_off schrieb:

    Du willst mich jetzt doch verarschen!

    Machen wir mal einen ganz bescheuerten Test: ich verwende nicht google, sondern duckduckgo.com, eine Suchmaschine, die eventuell nicht immer die besten Ergebnisse raussucht. Da gebe ich mal "gcc multiple definition of" ein. Erster Treffer ist dieser Thread, wo das erklärt wird.

    Joachim Pileborg schrieb:

    In C++ (as well as in C) there is a difference between declaring and defining things like variables. What you are doing in the header file is defining the variables, which means that every source file that includes the header file will have the definitions.

    Da wir nicht wissen, WAS du gegoogelt hast, weiß ich nicht, welche Erklärungen du gelesen hast. Aber lass dir gesagt sein, wenn du den Namen dieser Seite, "Stack Overflow", mit deinem Problem assoziiert hast, dann steht es entweder um deine Englischkenntnisse überhaupt nicht gut, oder du hast dich überhaupt mal gar nicht informiert.

    Nein, ich will dich nicht verarschen. Ich habe genau das gegoogled was du geschrieben hattest, und natürlich habe ich diesen Treffer auch gefunden. Ich komme aber trotzdem nicht weiter, da ich nicht weiß, wie ich das ändern muss. Debuggt habe ich vorher auch noch nicht.

    DirkB schrieb:

    Aus wieviel Dateien besteht dein Programm?

    Vielleicht könnt ihr mir auch erstmal Tipps geben, welchen Teil vom Code ich posten könnte zur Fehlerbehebung?

    Erstmal deine Headerdatei und den Anfang deiner .cpp-Datei

    Es ist eine einzige Datei mit mehreren Funktionen. Wir müssen wie gesagt lauffähige Programme abgeben.
    Ich habe keine Headerdatei, wenn ich das richig sehe. Ich habe eine Datei .cpp, diese fange ich an mit
    #include <stdio.h>

    und gehe dann gleich weiter zu den Teilfunktionen meines Programms.



  • Wenn ich das Programm ausführen will, gibt mir der Kompiler einen "Speicherzugriffsfehler".

    zuerst musst du aufhören aus bekannten Wörtern Sätze zu bilden die keinen Sinn ergeben - dein Kompiler z.B. gcc oder g++ kann dir keinen Speicherzugriffsfehler beim kompilieren geben (nur wenn du einen gcc oder Linker Bug entdeckt hast) - sonst könnte der darauf folgenden Linkvorgang nicht laufen und damit deine -Wall Angabe (die KEINEN Einfluss auf den Linker sondern nur Kompiler hat) nicht solche Meldungen ausspucken - die gar nicht von -Wall kommen - du vermischt alles total wild - hilft nicht - gar nicht - verwirrt nur

    Poste deine Code bei http://pastebin.com/ oder sowas (wenn es denn geht) - dann kann man noch entscheiden ob es viel zu viel ist - da du aber Anfänger bist denke ich nicht das wir dann 5000 Zeilen Code sehen



  • und was ist deine Kompilieranweisung die du in der Konsole eingibst - also "gcc ...."

    und sitzt du an einem lokalen Linux oder machst du das alles Remote auf dem Uni-Rechner?



  • Wie kompilierst du denn?

    Zeig doch mal den kompletten Befehl!
    Also sowas wie g++ -std=c++11 -Wall -Wextra -pedantic dein_programm.cpp -o ausfuehrbare_datei

    Denn einerseits zeigst du oben eine Fehlermeldung des Linkers beim compilieren (d.h. es kommt gar kein ausführbares Programm raus), andererseits hast du aber angeblich einen Speicherzugriffsfehler?

    Und oben der Hinweis auf gdb bezieht sich auf das schon fertig kompilierte Programm, nicht auf deinen Quelltext.

    Ich habe eine Datei .cpp, diese fange ich an mit
    #include <stdio.h>

    stdio.h gehört eigentlich mehr zu C als zu C++. Lernt ihr C oder C++ oder "Dozent weiß es nicht so genau"? (das hat aber mit deinem Fehler nix zu tun)



  • Mangan2504 schrieb:

    Habe ich versucht, es kommt: not in executable format: File format not recognized
    Ich habe angegeben <programm.cpp> . Wenn ich es ohne .cpp probiere, kommt "Datei oder Verzeichnis nicht gefunden".

    Das Programm, nicht den Sourcecode.

    $ gcc -g -ggdb3 bla.cpp -o bla
    $ ulimit -c unlimited
    $ ./bla
    Segfault (core dumped) <- Oder was ähnliches - muss erscheinen, sonst kannste nicht debuggen
    $ gdb ./bla core
    

    Mangan2504 schrieb:

    In den Amerkungen zu den Aufgaben steht auch, dass alles was benötigt wird zu dem Zeitpunkt dann schon in Übung/Vorlesung behandelt wurde. Ich weiß dass das nicht ideal ist, aber bei solchen Wiedersprüchen weiß ich dann auch gar nicht mehr, was ich benutzen kann um es zu lernen.

    Und wie kommst du dann dazu, Sachen auszuprobieren, die du nicht kannst?

    Leider mache ich in der Hauptsache kein C++, deswegen habe ich auch keine guten Empfehlungen an der Stelle.

    Mangan2504 schrieb:

    Vermutlich habe ich es nicht verstanden, und wenn es nach mir ginge würde ich das auch langsamer angehen. Aber ich kann nicht, denn ich stehe unter Zeitdruck, da wir alle zwei Wochen lauffähige Programme abgeben müssen zu immer komplexer werdenden Aufgaben.

    Sicher, dass ein Studium das richtige für dich ist? Und nein, damit impliziere ich nicht, dass du blöd bist. Aber viele Leute kommen mit der Art, wie dort gelehrt wird, nicht zurecht. Darunter gehöre auch ich. Ich muss mir Zeit nehmen, um das, was man mir zeigt, auch zu lernen.

    Oder bist du direkt ohne Vorkenntnisse da reingegangen? Ich finde es immer wieder komisch, wie Leute meinen, im Studium würde ihnen gezeigt werden, wie man programmiert. Sowas bringt man sich aber selbst bei. Eigeninitiative gehört nun mal leider dazu.

    Mangan2504 schrieb:

    Nein, ich will dich nicht verarschen. Ich habe genau das gegoogled was du geschrieben hattest, und natürlich habe ich diesen Treffer auch gefunden. Ich komme aber trotzdem nicht weiter, da ich nicht weiß, wie ich das ändern muss. Debuggt habe ich vorher auch noch nicht.

    Es steht doch genau da!

    Joachim Pileborg schrieb:

    In the header file you should only declare the variables, and then in a single source file define them.

    Und - selbst das ist jetzt von mir geraten, weil wir nicht wirklich wissen, WAS den Fehler verursacht.

    Mangan2504 schrieb:

    Es ist eine einzige Datei mit mehreren Funktionen.

    OK, damit ist die Header-Sache vom Tisch.

    Mangan2504 schrieb:

    Wir müssen wie gesagt lauffähige Programme abgeben.

    Sourcecode != Programme. Programme sind kompilierter, gelinkter Maschinencode. Sourcecode ist das, was du schreibst.

    Mangan2504 schrieb:

    Ich habe keine Headerdatei, wenn ich das richig sehe. Ich habe eine Datei .cpp, diese fange ich an mit
    #include <stdio.h>

    stdio.h ist ein C-Header, kein C++-Header. Sowas schreibt man in C-Dateien, keinen CPP-Dateien (je nach Endung behandeln bestimmte Compiler das File dann anders).



  • Gast3 schrieb:

    Wenn ich das Programm ausführen will, gibt mir der Kompiler einen "Speicherzugriffsfehler".

    zuerst musst du aufhören aus bekannten Wörtern Sätze zu bilden die keinen Sinn ergeben - dein Kompiler z.B. gcc oder g++ kann dir keinen Speicherzugriffsfehler beim kompilieren geben (nur wenn du einen gcc oder Linker Bug entdeckt hast) - sonst könnte der darauf folgenden Linkvorgang nicht laufen und damit deine -Wall Angabe (die KEINEN Einfluss auf den Linker sondern nur Kompiler hat) nicht solche Meldungen ausspucken - die gar nicht von -Wall kommen - du vermischt alles total wild - hilft nicht - gar nicht - verwirrt nur

    Poste deine Code bei http://pastebin.com/ oder sowas (wenn es denn geht) - dann kann man noch entscheiden ob es viel zu viel ist - da du aber Anfänger bist denke ich nicht das wir dann 5000 Zeilen Code sehen

    Entschuldige... Also. Ich habe es kompiliert und wollte es ausführen. Da wurde mir "Speicherfehlerzugriff" angezeigt.

    Dann habe ich es nochmal mit -wall kompiliert und bekam eine lange Liste an Fehlern.

    5000 Zeilen sind es nicht, sondern 131. Ich habe meine Anmerkungen die ich als Gedankenstütze beim schreiben verwendet habe drin gelassen, damit unter Umständen nachvollzogen werden kann, was ich gemeint habe.



  • wenn ich deinen Code direkt bei

    http://gcc.godbolt.org/

    reinkopieren und mit dem gcc 4.x-6.x oder clang kompilieren Optionen: -O2 -Wall

    kompilierts - und jetzt?

    was ist dein Kompileraufruf: also gcc ... , oder g++ ....



  • Wie startest du das Programm?



  • die -Wall Angabe hat nichts mit deinen Linker-Fehlermeldungen zu tun - wo auch immer du die herbekommst

    zu deinem Speicherzugriffsfehler - du wirst wohl irgendwo ungewollt Speicher überschreiben - das ist "Undefined Behavior" und KANN trotzdem laufen - oder auch abstürzen - wie unter Linux - dein Programm enthält also Fehler

    zu deinem Speicherzugriffsfehler probier mal

    g++ dein_programm.cpp -O -g -fsanitize=address

    und dann ausführen (https://en.wikipedia.org/wiki/AddressSanitizer)



  • dachschaden_off schrieb:

    Mangan2504 schrieb:

    Habe ich versucht, es kommt: not in executable format: File format not recognized
    Ich habe angegeben <programm.cpp> . Wenn ich es ohne .cpp probiere, kommt "Datei oder Verzeichnis nicht gefunden".

    Das Programm, nicht den Sourcecode.

    $ gcc -g -ggdb3 bla.cpp -o bla
    $ ulimit -c unlimited
    $ ./bla
    Segfault (core dumped) <- Oder was ähnliches - muss erscheinen, sonst kannste nicht debuggen
    $ gdb ./bla core
    

    Ja, das erklärt einiges. Ich benutzte wie gesagt sonst nur Code::Blocks, wo man sowas nicht machen muss.

    dachschaden_off schrieb:

    Und wie kommst du dann dazu, Sachen auszuprobieren, die du nicht kannst?

    Leider mache ich in der Hauptsache kein C++, deswegen habe ich auch keine guten Empfehlungen an der Stelle.

    Sicher, dass ein Studium das richtige für dich ist? Und nein, damit impliziere ich nicht, dass du blöd bist. Aber viele Leute kommen mit der Art, wie dort gelehrt wird, nicht zurecht. Darunter gehöre auch ich. Ich muss mir Zeit nehmen, um das, was man mir zeigt, auch zu lernen.

    Oder bist du direkt ohne Vorkenntnisse da reingegangen? Ich finde es immer wieder komisch, wie Leute meinen, im Studium würde ihnen gezeigt werden, wie man programmiert. Sowas bringt man sich aber selbst bei. Eigeninitiative gehört nun mal leider dazu.

    Ok ich will nicht zu viel schwafeln, aber ein bissl was zum besseren Verständnis muss ich dann wohl doch erzälen.
    Ich mache das, weil ich die Prüfung bestehen muss. Es ist so ziemlich das letzte Modul das mir fehlt. Aus sehr vielen Gründen, unter anderem Finanzierung, habe ich leider keine Wahl und kann mir nicht unendlich viel Zeit nehmen.

    Ja, ich bin in diese Veranstaltung ohne Vorkentnisse reingegangen, aber wir hatten schon eine Vorgänger-Veranstaltung dazu, die ich auch schon bestanden habe. Und ja, ich habe gewusst was auf mich zukommt. Es ist nicht so, dass ich dafür nichts mache. Nur leider ist es ja auch so, dass das Studium nicht nur aus dieser einen Veranstaltung besteht.
    Es ist etwas kompliziert zu erklären. Der Studiengang ist neu und generell noch etwas.... unstrukturiert... Es ist auch keine reine Informatik, sondern einer dieser Hybrid-Studiengänge mit Informatik im Nebenfach. Mein prinzipielles Problem ist eigentlich nicht, da einen Algorithmus zu finden mit dem man das lösen könnte, sondern viel eher, aus den einzelnen Fragmenten etwas zu gestalten, dass auch läuft und das macht, was ich will.

    dachschaden_off schrieb:

    stdio.h ist ein C-Header, kein C++-Header. Sowas schreibt man in C-Dateien, keinen CPP-Dateien (je nach Endung behandeln bestimmte Compiler das File dann anders).

    Mist. Die Vorgänger-Veranstaltung war nur C, jetzt machen wir C++. Da bin ich einfach durcheinander geraten.



  • Mangan2504 schrieb:

    Das hier ist das Ergebnis: http://pastebin.com/VxeirRzV

    Das ist eine ganz kaputte Mischung aus C und C++. Ja, mit einem C++-Compiler kompiliert es, aber das ist dennoch C ( fopen , fscanf ...)

    Wenn ich das beim Dozenten gelehrt bekommen hätte, hätte ich ihm erst mal auf den Tisch gekotzt.

    Ich habe jetzt nur nach dem ersten Fehler gesucht, den mir gdb gezeigt hat. Und bin dann darüber gestolpert:

    int main (int x, char *pups[]){
    

    Traditionell sollte das:

    int main(int argc,char*argv[])
    

    sein. Das eigentliche Problem aber ist: du solltest beim Programmaufruf einen Parameter übergeben, der einen Dateinamen beinhaltet, dessen Datei dann später geöffnet werden soll.

    Jetzt haben wir diese Datei allerdings nicht. Blöd gelaufen.

    Und du prüfst auch nicht, ob dein Programm die Datei einladen kann. Blöd gelaufen die zweite.

    if(argc < 2)
    {
        fprintf(stderr,"Nicht genug Argumente: %s <Dateiname>\n",argv[0]);
        return -1;
    }
    
    text = fopen (pups[1], "r");
    if(!text)
    {
        fprintf(stderr,"Datei \"%s\" kann nicht geöffnet werden!\n",pups[1]);
        return -1;
    }
    

    DirkB hat schon nachgefragt, wie rufst du das Programm auf?
    Und ich frage nach der Datei, die du da öffnest.

    Wenn ich übrigens mal die Warnungen anstelle, mit denen ich alles kompiliere, was ich schreibe:

    -W -Wextra -Wall -Wimplicit -Wunused -Wunused-parameter -Wshadow -Wempty-body -Wignored-qualifiers -Wvla -Wvariadic-macros -Wdisabled-optimization -Winline -Wsign-compare -Wuninitialized -Wparentheses -Wswitch
    

    , dann bekomme ich diese Warnungen:

    kata.c: In Funktion »void ausgabe(domino*)«:
    kata.c:43:27: Warnung: Deklaration von »kopf« überdeckt eine globale Deklaration [-Wshadow]
     void ausgabe (domino *kopf){                  // Funktion zum ausgeben einer Liste, soll auch Ringliste ausgeben können
                               ^
    kata.c:16:13: Anmerkung: verdeckte Deklaration ist hier
     verwaltung *kopf, *ende;             // Listenkopf und Listenende erstellen
                 ^
    kata.c: In Funktion »void ausgabeRing(domino*)«:
    kata.c:48:34: Warnung: Deklaration von »ringkopf« überdeckt eine globale Deklaration [-Wshadow]
     void ausgabeRing(domino *ringkopf){
                                      ^
    kata.c:18:9: Anmerkung: verdeckte Deklaration ist hier
     domino *ringkopf, *ringmitte, *ringende; // Ringlistenzeiger (soll nach Ausgabe recyclet werden)
             ^
    kata.c: In Funktion »void bautRing(domino*)«:
    kata.c:58:11: Warnung: Anweisung hat keinen Effekt [-Wunused-value]
         for (n; n != NULL; n = n->next){
               ^
    kata.c: In Funktion »int main(int, char**)«:
    kata.c:96:9: Warnung: Variable »z« wird nicht verwendet [-Wunused-variable]
         int z = 0; // zeigerzähler
             ^
    kata.c: Im globalen Gültigkeitsbereich:
    kata.c:82:15: Warnung: unbenutzter Parameter »x« [-Wunused-parameter]
     int main (int x, char *pups[]){         // pups beinhaltet die Parameter (Anzahl übergebener Werte und Datei)
    

    EDIT: besserer Check, sodass wir den potentiellen NULL-Pointer nicht an fopen übergeben.



  • dachschaden schrieb:

    Das ist eine ganz kaputte Mischung aus C und C++. Ja, mit einem C++-Compiler kompiliert es, aber das ist dennoch C ( fopen , fscanf ...)

    Wenn ich das beim Dozenten gelehrt bekommen hätte, hätte ich ihm erst mal auf den Tisch gekotzt.

    Wie gesagt haben wir in der Vorgänger-Veranstaltung nur mit C programmiert, deswegen ist der Fehler da eher bei mir zu suchen.

    Gast3 schrieb:

    wenn ich deinen Code direkt bei

    http://gcc.godbolt.org/

    reinkopieren und mit dem gcc 4.x-6.x oder clang kompilieren Optionen: -O2 -Wall

    kompilierts - und jetzt?

    was ist dein Kompileraufruf: also gcc ... , oder g++ ....

    Ok? Das ist komisch.

    Wir sollen g++ verwenden.

    In der Anleitung steht:

    Beispiel (Übersetzen des Quellcodes einer Datei „test.cpp“)
    g++ -o test test.cpp

    Ich gebe also ein: g++ -o programm programm.cpp
    auf dem Terminal unter Linux.

    Wenn es laufen würde, dann mache ich weiter mit ./programm.cpp



  • Wenn es laufen würde, dann mache ich weiter mit ./programm.cpp

    nein machst du nicht sondern mit ./programm (nicht .cpp) - die erste Angabe von "programm" in der Kommandozeile sagt wie die Applikation heissen soll

    btw: die vorherigen Post haben den Fehler schon eingegrenzt also nur noch fixen - die Datei einstellen dann läufts - alles nur Schlurifehler nichts wildes



  • kompiliert unter gcc.godbolt, und jedem anderen Linux das gerade offen ist - so ein Trivial-Programm muss kompilieren - sonst ist was mit deinen Einstellungen faul (hast du an etwas rumgespielt nachdem das 1. mal der Fehler gekommen ist?)

    also 1.

    "g++ -o programm programm.cpp"

    eingeben - Ausgabe hier posten

    "./programm dateiname"

    eingeben - Ausgabe hier posten

    solltest du den dateinamen als Parameter weglassen stürzt dein Programm ab (fehlenden Prüfung deinerseits)

    die Datei mal hier einstellen die du als Parameter angibst - oder solltest



  • Gast3 schrieb:

    kompiliert unter gcc.godbolt, und jedem anderen Linux das gerade offen ist - so ein Trivial-Programm muss kompilieren - sonst ist was mit deinen Einstellungen faul (hast du an etwas rumgespielt nachdem das 1. mal der Fehler gekommen ist?)

    also 1.

    "g++ -o programm programm.cpp"

    eingeben - Ausgabe hier posten

    "./programm dateiname"

    eingeben - Ausgabe hier posten

    solltest du den dateinamen als Parameter weglassen stürzt dein Programm ab (fehlenden Prüfung deinerseits)

    die Datei mal hier einstellen die du als Parameter angibst - oder solltest

    Ehrlich gesagt weiß ich nich was für ein Compiler die Uni benutzt. Ich habe daran sicher nichts umgestellt, ich wüsste ja gar nicht wie... Das einzige was ich getan habe ist mit "cd" Verzeichnisse wechseln. Aber natürlich NICHT während ich am Program gearbeitet habe, sondern davor.

    Die Dateien, die ich als Parameter angebe beinhalten einfach nur willkürlich gewählte Zahlenpaare, die die Dominosteine darstellen sollen.

    Die Eingabe/Ausgabe kann ich im Moment erstmal nicht mehr beisteuern, denn für heute habe ich erstmal Schluss gemacht. Ich bin schon seit 9 Uhr dran und gerade an einem Punkt, wo nichs mehr geht... Ich wage dann morgen in aller Frische einen neuen Versuch.

    Vielen Dank schonmal für eure Geduld und Zeit.



  • Ehrlich gesagt weiß ich nich was für ein Compiler die Uni benutzt

    g++ --version



  • 1. was hast du für einen gcc/g++

    g++ --version

    2. und ein Trivial-Test ob dein gcc/g++ richtig funktioniert

    --main.cpp--

    #include<stdio.h>
    
    int main() 
    {
      int* x = new int();
      delete x;
      printf("Hello World\n");
      return 0;
    }
    

    ---

    g++ -o main main.cpp

    sollte "Hello World" ausgeben


Log in to reply