为什么当我想编译以下多线程合并排序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;
}
答案 0 :(得分:29)
<iostream>
和<iostream.h>
都不是标准C头文件。您的代码应该是C ++,其中<iostream>
是有效的标头。使用g++
(以及.cpp
文件扩展名)来表示C ++代码。
或者,该程序主要使用C中可用的构造。使用C编译器将整个程序转换为编译很容易。只需删除#include <iostream>
和using namespace std;
,然后将cout << endl;
替换为putchar('\n');
...我建议使用C99进行编译(例如gcc -std=c99
)
答案 1 :(得分:4)
在您意识到处理与size_t
相关的更简单问题后,似乎您发布了一个新问题。你很高兴。
无论如何,您有一个.c
源文件,除了#include <iostream>
和using namespace std;
C ++标准#include<iostream>
的内置函数的等效C可以通过#include<stdio.h>
#include <iostream>
替换为#include <stdio.h>
,删除using namespace std;
取消#include <iostream>
后,您需要cout << endl;
的C标准替代方案,可由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分钟)
答案 2 :(得分:0)
lol 我测试它 TDM c++ https://jmeubank.github.io/tdm-gcc/ 作为 C++ 初学者(我从 1992 年开始知道很多语言但从来没有 C++)..所以我写了一些 printf 行,我编译它们以输出一些示例 cgi 无聊的东西然后我尝试使用 getenv(来自 google samples 的东西示例)我在这里遇到了一个问题。如果我从这里或其他页面中使用了一些答案,其中所有人都说您应该将页面扩展名 .c 重命名为 .cpp 并运行特定的 cmd 行,但我的文件“compile.bat”与行 gcc++ compile line 和然后在 strip.exe 之后我得到了 17kb 然后通过将 .c 更改为 .cpp 即使我使用 strip.exe 我也得到了超过 1 mb 超过 .exe ! 所以我一直对此感到无聊......
#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;
}
所以我在 xampp 窗口中使用 http://localhost/cgi-bin/test.exe?sdasd=23&pag=23 调用它(只是为了好玩)。 也许其他人没有像我一样进行测试,需要这些废话(我这么说是因为很明显你 5 年前问过这个问题)
ps。如果您需要小型可执行文件,我会在此处发布我之前提到的 bat,以防您需要它
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
工作条件是编译器应该加载到 c:\TDM-GCC-64\bin\ 并且在你放置这个 compile.bat 的同一个文件夹中你应该有你的 main.c