Schwerwiegender Fehler: iostream: Keine solche Datei oder Verzeichnis beim Kompilieren des C-Programms mit GCC

Lesezeit: 5 Minuten

Benutzer-Avatar
Ebrahim Ghasemi

Warum erhalte ich diese Fehlermeldung, wenn ich das folgende Multi-Thread-Merge-Sorting-C-Programm kompilieren möchte:

ap@sharifvm:~/forTHE04a$ gcc -g -Wall -o mer mer.c -lpthread
mer.c:4:20: fatal error: iostream: No such file or directory
 #include <iostream>
                    ^
compilation terminated.
ap@sharifvm:~/forTHE04a$ gcc -g -Wall -o mer mer.c -lpthread
mer.c:4:22: fatal error: iostream.h: No such file or directory
 #include <iostream.h>
                      ^
compilation terminated.

Mein Programm:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
using namespace std;

#define N 2  /* # of thread */

int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};  /* target array */

/* structure for array index
 * used to keep low/high end of sub arrays
 */
typedef struct Arr {
    int low;
    int high;
} ArrayIndex;

void merge(int low, int high)
{
        int mid = (low+high)/2;
        int left = low;
        int right = mid+1;

        int b[high-low+1];
        int i, cur = 0;

        while(left <= mid && right <= high) {
                if (a[left] > a[right])
                        b[cur++] = a[right++];
                else
                        b[cur++] = a[right++];
        }

        while(left <= mid) b[cur++] = a[left++];
        while(right <= high) b[cur++] = a[left++];
        for (i = 0; i < (high-low+1) ; i++) a[low+i] = b[i];
}

void * mergesort(void *a)
{
        ArrayIndex *pa = (ArrayIndex *)a;
        int mid = (pa->low + pa->high)/2;

        ArrayIndex aIndex[N];
        pthread_t thread[N];

        aIndex[0].low = pa->low;
        aIndex[0].high = mid;

        aIndex[1].low = mid+1;
        aIndex[1].high = pa->high;

        if (pa->low >= pa->high) return 0;

        int i;
        for(i = 0; i < N; i++) pthread_create(&thread[i], NULL, mergesort, &aIndex[i]);
        for(i = 0; i < N; i++) pthread_join(thread[i], NULL);

        merge(pa->low, pa->high);

        //pthread_exit(NULL);
        return 0;
}

int main()
{
        ArrayIndex ai;
        ai.low = 0;
        ai.high = sizeof(a)/sizeof(a[0])-1;
        pthread_t thread;

        pthread_create(&thread, NULL, mergesort, &ai);
        pthread_join(thread, NULL);

        int i;
        for (i = 0; i < 10; i++) printf ("%d ", a[i]);
        cout << endl;

        return 0;
}

  • <iostream> und using namespace std; sind für C++, nicht für C.

    – Timrau

    30. Mai 2015 um 7:01 Uhr

  • Das sieht aus wie ein C++-Programm, kein C-Programm. Speichern Sie es besser als einige .cc Datei und kompiliere sie damit g++nicht gcc ; oder ändern Sie es in ein C99-Programm.

    – Basile Starynkevitch

    30. Mai 2015 um 7:16 Uhr


Benutzer-Avatar
autistisch

Weder <iostream> Noch <iostream.h> sind Standard-C-Header-Dateien. Ihr Code soll C++ sein, wo <iostream> ist ein gültiger Header. Verwenden Sie einen C++-Compiler wie z clang++ oder g++ (und ein .cpp Dateierweiterung) für C++-Code.

Alternativ verwendet dieses Programm meistens Konstrukte, die ohnehin in C verfügbar sind. Es ist einfach genug, das gesamte Programm zu konvertieren, um es mit einem C-Compiler zu kompilieren. Einfach entfernen #include <iostream> und using namespace std;und ersetzen cout << endl; mit putchar('\n');… Ich rate zum Kompilieren mit C99, C11 oder C18 (zB. gcc -std=c99, clang -std=c18 etc)

Benutzer-Avatar
Weda Pashi

Anscheinend haben Sie eine neue Frage gestellt, nachdem Sie festgestellt haben, dass Sie es mit einem einfacheren Problem zu tun haben size_t. Ich bin froh, dass du es getan hast.

Wie auch immer, Sie haben eine .c Quelldatei, und der größte Teil des Codes sieht mit Ausnahme des C-Standards aus #include <iostream> und using namespace std;

C-Äquivalent für die integrierten Funktionen des C++-Standards #include<iostream> kann durch in Anspruch genommen werden #include<stdio.h>

  1. Ersetzen #include <iostream> mit #include <stdio.h>löschen using namespace std;
  2. Mit #include <iostream> abgenommen, dafür bräuchte man eine C-Standard-Alternative cout << endl;was durch getan werden kann printf("\n"); oder putchar('\n');

    Von den beiden Optionen printf("\n"); arbeitet desto schneller wie ich beobachtet habe.

    Wenn benutzt printf("\n"); im obigen Code anstelle von cout<<endl;

    $ time ./thread.exe
    1 2 3 4 5 6 7 8 9 10
    
    real    0m0.031s
    user    0m0.030s
    sys     0m0.030s
    

    Wenn benutzt putchar('\n'); im obigen Code anstelle von cout<<endl;

    $ time ./thread.exe
    1 2 3 4 5 6 7 8 9 10
    
    real    0m0.047s
    user    0m0.030s
    sys     0m0.030s
    

Kompiliert mit Cygwin gcc (GCC) 4.8.3 Ausführung. die Ergebnisse wurden über 10 Proben gemittelt. (Hat 15 min gedauert)

  • Wo ist dein Code? Welchen Compiler, welche Standardbibliothek und welche Befehle verwenden Sie, um den Code zu kompilieren?

    – autistisch

    30. Mai 2015 um 7:39 Uhr

  • Wirklich? Sie drucken eines Charakter, Zeit es und trotz der Fehlerquote, die durch den Himmel verbietet Aufgabenwechsel verursacht wird, gilt einer wirklich als schneller als der andere? Das ist Ihre Testmethodik? Wow einfach wow!

    – autistisch

    30. Mai 2015 um 9:27 Uhr

  • Wenn Sie zur Assembly kompilieren würden (z. B. mit gcc -O3 -S your_printf_file.c) werden Sie vielleicht bemerken, dass Ihre printf Anruf wird in a übersetzt putchar Anruf… Es gibt ein altes Sprichwort, das Google sicher für Sie beenden kann, es beginnt so: Vorzeitige Optimierung ist…

    – autistisch

    30. Mai 2015 um 10:03 Uhr


  • @undefinedbehaviour: FWIK, TBH, ich wusste nicht, dass es übersetzt wird putcharund dachte immer (und glaube immer noch), dass es übersetzt wird write Anruf. Bestätigt das mit strace Dienstprogramm. Und es tut nicht das, was Sie meinen.

    – WedaPashi

    30. Mai 2015 um 10:26 Uhr

  • Das passiert auf meinem System nicht, aber andererseits verwende ich gcc 4.5.2. Ich nehme an, dass neben dem Aufgabenwechsel, der eine größere Fehlerspanne als die Optimierung selbst darstellt, dies nur ein weiterer Faktor ist, der darauf hinweist, dass “vorzeitige Optimierung …” ist.

    – autistisch

    30. Mai 2015 um 10:29 Uhr


Ich hatte den gleichen Fehler: –

fatal error: iostream: No such file or directory
 #include <iostream>

Nach einiger Zeit fand ich das, ich mache hier einen sehr sehr noob Fehler. Eigentlich habe ich meine Programmdatei ausgeführt, indem ich die Erweiterung angegeben habe ".c" only…. 🙁 Überprüfen Sie also, ob Sie Ihre Datei mit der richtigen Erweiterung speichern oder nicht… In diesem Fall wird es .cpp für die C++-Programmdatei sein. Also überprüfen Sie das einmal und vielleicht werden Sie es sein gut zu gehen.

Überprüfen Sie jetzt also zuerst, ob Sie das MinGW heruntergeladen und zu den env-Variablen hinzugefügt haben

Verwendung zu überprüfen g++ --version auf Ihrem cmd/Terminal

jetzt, wenn die verschnörkelten Linien immer noch erscheinen, installieren Sie die c++ Intellisense Erweiterung erhalten Sie meistens einen Fehler in der c_cpp_properties.json Datei, da der Compiler-Pfad möglicherweise nicht korrekt ist

Sie müssen also nur den richtigen Pfad eingeben und die verschlungenen Linien verschwinden

1383530cookie-checkSchwerwiegender Fehler: iostream: Keine solche Datei oder Verzeichnis beim Kompilieren des C-Programms mit GCC

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy