Fatale fout: iostream: geen bestand of map bij het compileren van het C-programma met GCC

Waarom krijg ik deze foutmelding als ik het volgende multithread merge sorting C-programma wil compileren:

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.

Mijn programma:

#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;
}

Antwoord 1, autoriteit 100%

Noch <iostream>noch <iostream.h>zijn standaard C-headerbestanden. Uw code is bedoeld als C++, waarbij <iostream>een geldige header is. Gebruik g++(en een .cppbestandsextensie) voor C++-code.

Als alternatief gebruikt dit programma meestal constructies die sowieso in C beschikbaar zijn. Het is eenvoudig genoeg om het hele programma te converteren om te compileren met een C-compiler. Verwijder eenvoudig #include <iostream>en using namespace std;, en vervang cout << endl;met putchar('\n');… Ik raad aan om C99 te gebruiken (bijv. gcc -std=c99)


Antwoord 2, autoriteit 11%

Het lijkt erop dat je een nieuwe vraag hebt geplaatst nadat je je realiseerde dat je te maken had met een eenvoudiger probleem met betrekking tot size_t. Ik ben blij dat je dat deed.

Hoe dan ook, je hebt een .cbronbestand, en de meeste code ziet eruit volgens de C-normen, behalve dat #include <iostream>en using namespace std;

C-equivalent voor de ingebouwde functies van de C++-standaard #include<iostream>kan worden verkregen via #include<stdio.h>

  1. Vervang #include <iostream>door #include <stdio.h>, verwijder using namespace std;
  2. Als #include <iostream>is uitgeschakeld, hebt u een standaard C-alternatief nodig voor cout << endl;, wat kan worden gedaan door printf("\n");of putchar('\n');
    Van de twee opties werkt printf("\n");des te sneller zoals ik heb gezien.

    Bij gebruik van printf("\n");in de bovenstaande code in plaats van cout<<endl;

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

    Bij gebruik van putchar('\n');in de bovenstaande code in plaats van cout<<endl;

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

Samengesteld met Cygwin gcc (GCC) 4.8.3-versie. resultaten gemiddeld over 10 monsters. (duurde 15 minuten)


Antwoord 3

lol ik test het TDM c++ https://jmeubank.github.io/tdm-gcc/ als een C++ -beginner (ik ken veel talen sinds 1992 maar nooit C++) .. dus ik schreef wat printf-regels, ik heb ze gecompileerd om wat saaie cgi-voorbeelden uit te voeren en toen ik getenv probeerde te gebruiken (van google samples stuff voorbeelden) ik kreeg een vraag zoals je hier had. Als ik enkele antwoorden van hier of van andere pagina’s heb gebruikt waar iedereen zei dat je de pagina-extensie .c naar .cpp moet hernoemen en een specifieke cmd-regel moet uitvoeren, werkt die onzin – maar uit mijn bestand “compile.bat” met de regel gcc++ compileerregel en toen kreeg ik na strip.exe 17 kb en door .c in .cpp te veranderen, zelfs als ik strip.exe gebruik, kreeg ik meer dan 1 mb over .exe!
dus ik bleef maar vervelen over dat …. … .. en na dit te hebben gezocht, red mijn probleem:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Content-type: text/html\r\n\r\n<!DOCTYPE html>\r<html lang='en'>\n<head>\n<meta charset='UTF-8'>\n</head>\n<body>\nstupid test:<br>\n");
//for (int i = 0; i < argc; ++i) printf("%s\r",argv[i]);
printf("%s\n",getenv("QUERY_STRING"));
printf("</body>\n</html>"); 
    return 0;
}

en dus noem ik het in xampp-vensters met http://localhost/cgi-bin/test.exe?sdasd=23&pag=23 (gewoon voor de lol).
misschien test iemand anders niet -zoals ik- en heeft deze onzin nodig (ik zei dit omdat het duidelijk is dat je dit 5 jaar geleden vraagt)

ps. als je een klein uitvoerbaar bestand nodig hebt, plaats ik je hier de vleermuis die ik eerder noemde voor het geval je het nodig hebt

c:\TDM-GCC-64\bin\gcc.exe %CD%\main.c -o %CD%\test.exe -lstdc++
c:\TDM-GCC-64\bin\strip.exe  %CD%\test.exe

de voorwaarden om te werken zijn dat de compiler daar geladen moet zijn c:\TDM-GCC-64\bin\ en in dezelfde map waar je deze compile.bat plaatst, zou je je main.c moeten hebben

Other episodes