Неустранимая ошибка: iostream: нет такого файла или каталога при компиляции программы C с использованием GCC

Почему, когда я хочу скомпилировать следующую многопоточную программу сортировки слиянием, я получаю эту ошибку:

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.

Моя программа:

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

5

Решение

ни <iostream> ни <iostream.h> являются стандартными заголовочными файлами C. Ваш код предназначен для C ++, где <iostream> является действительным заголовком. использование g++.cpp расширение файла) для кода C ++.

Кроме того, эта программа использует в основном конструкции, которые в любом случае доступны в Си. Достаточно просто преобразовать всю программу для компиляции с использованием компилятора Си. Просто удалить #include <iostream> а также using namespace std;и заменить cout << endl; с putchar('\n');… советую компилировать с использованием C99 (например. gcc -std=c99)

24

Другие решения

Похоже, вы опубликовали новый вопрос после того, как поняли, что имеете дело с более простой проблемой, связанной с size_t, Я рад, что ты это сделал.

В любом случае, у вас есть .c исходный файл, и большая часть кода выглядит в соответствии со стандартами C, за исключением того, что #include <iostream> а также using namespace std;

C эквивалент для встроенных функций стандарта C ++ #include<iostream> можно получить через #include<stdio.h>

  1. замещать #include <iostream> с #include <stdio.h>, удалять using namespace std;
  2. С #include <iostream> снял, вам понадобится стандартная альтернатива С для cout << endl;что может быть сделано printf("\n"); или же putchar('\n');
    Из двух вариантов, printf("\n"); работает быстрее, как я заметил.

    Когда используется printf("\n"); в приведенном выше коде вместо cout<<endl;

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

    Когда используется putchar('\n'); в приведенном выше коде вместо cout<<endl;

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

Скомпилировано с Cygwin gcc (GCC) 4.8.3 версия. результаты усреднены по 10 выборкам. (Заняло у меня 15 минут)

4

По вопросам рекламы [email protected]