次のマルチスレッドマージソートCプログラムをコンパイルしたいのに、このエラーが表示されるのはなぜですか。
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;
}
_<iostream>
_も_<iostream.h>
_も標準Cヘッダーファイルではありません。コードはC++である必要があります。_<iostream>
_は有効なヘッダーです。 C++コードには_g++
_(および_.cpp
_ファイル拡張子)を使用します。
あるいは、このプログラムは、とにかくCで使用可能な構造を主に使用します。 Cコンパイラを使用してプログラム全体を変換してコンパイルするのは簡単です。単に_#include <iostream>
_と_using namespace std;
_を削除し、_cout << endl;
_をputchar('\n');
で置き換えます... C99を使用してコンパイルすることをお勧めします(例_gcc -std=c99
_)
_size_t
_に関連するより単純な問題に対処していることに気付いた後、新しい質問を投稿したようです。私はあなたがしたことをうれしく思います。
とにかく、_.c
_ソースファイルがあり、ほとんどのコードはC標準に従って見えますが、_#include <iostream>
_と_using namespace std;
_は例外です。
C++標準_#include<iostream>
_の組み込み関数に相当するCは、_#include<stdio.h>
_を介して利用できます。
#include <iostream>
_を_#include <stdio.h>
_に置き換え、_using namespace std;
_を削除します_#include <iostream>
_を無効にすると、printf("\n");
またはputchar('\n');
で実行できる_cout << endl;
_のC標準代替が必要になります。
2つのオプションのうち、printf("\n");
は、私が観察したように高速に動作します。
上記のコードで_cout<<endl;
_の代わりにprintf("\n");
を使用した場合
_$ time ./thread.exe
1 2 3 4 5 6 7 8 9 10
real 0m0.031s
user 0m0.030s
sys 0m0.030s
_
上記のコードで_cout<<endl;
_の代わりにputchar('\n');
を使用した場合
_$ 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分見てください)