Schwerwiegender Fehler: iostream: Keine solche Datei oder Verzeichnis beim Kompilieren des C-Programms mit GCC
Lesezeit: 5 Minuten
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
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)
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>
Ersetzen #include <iostream> mit #include <stdio.h>löschen using namespace std;
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
13835300cookie-checkSchwerwiegender Fehler: iostream: Keine solche Datei oder Verzeichnis beim Kompilieren des C-Programms mit GCCyes
<iostream>
undusing 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 damitg++
nichtgcc
; oder ändern Sie es in ein C99-Programm.– Basile Starynkevitch
30. Mai 2015 um 7:16 Uhr