- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码来测试阿克曼函数,我称之为程序P1。在 ackerman(int m, int n) 中。我的目的是,如果没有定义 OUT,程序将运行并在完成后打印结果。如果定义了 OUT,程序将在每个“循环”中打印“xxx”,并等待来自标准输入的字符输入。我有一个外部进程来读取 P1 的输出,捕获“xxx”字符串(做某事)并将一个字符写回 P1,这样它就可以继续.如果我在没有定义 OUT 的情况下编译,并独立运行 P1,代码可以完全运行,并打印出 ack(3,6) = SomeValue,但是如果我启用 OUT,并使用 P1 运行外部进程,P1 可以接收 char一会儿,突然“暂停”,没有崩溃,没有错误,没有退出。我用c变量统计了P1停止前的次数,这不是一个固定的数字(3813、3951、3804……)。外部进程是用C#写的,测试的很好。我在很多情况下都使用过它,但在这个 ackermann 函数中,它停止了。为什么它不会在第一个循环中停止,而是在相当多的循环中停止?打印和停止有什么关系吗?
P1:
int MAX = 99999;
class stack {
private:
int num[99999];
int size;
public:
stack() {
size = 0;
}
void push(long x) {
if(size < MAX)
num[++size] = x;
else {
cout<<"Full Stack"<<endl;
return;
}
}
int pop() {
if(size==0) {
cout<<"Out of stack memory"<<endl;
return -1;
}
return num[size--];
}
bool isEmpty() {
if(size == 0)
return true;
else
return false;
}
};
int ackman(int m,int n)
{
stack v;
v.push(m);
int c = 0;
while(!v.isEmpty()) {
m = v.pop();
if(m==0 ||n==0)
n+= m+1;
else {
v.push(--m);
v.push(++m);
n--;
}
c++;
#ifdef OUT
printf("c is %d\n",c );
cout << endl;
//flush(stdin);
//flush(stdout);
cout << "xxx" << endl;
getchar();
//sleep(200);
#endif
}
return n;
}
void ack()
{
int m = 3, n = 6;
#ifdef DEMO
m = 3;
n = 4;
#endif
try{
int k = ackman(m,n);
printf("Ack %d , %d = %d\n",m,n,k );
}catch(...){
cout << "Co loi khi ack";
}
}
//just example
int main(){
ack();
return 0;
}
外部进程
static List<BenchMemory> benchMemory(String exeName, String caseName)
{
int count = 0;
Console.Title = "Bench memory: " + exeName + " case: "+caseName;
Console.WriteLine("Exe: {0}, case: {1}", exeName, caseName);
using (Process process = new Process())
{
/* Create the start info object */
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = exeName + ".exe";
startInfo.Arguments = caseName;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
List<BenchMemory> listMemResult = new List<BenchMemory>();
#region handler
DataReceivedEventHandler outDataHandler = (object sender, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
count++;
Console.WriteLine(e.Data);
if (!process.HasExited && e.Data != null && e.Data.ToLower().Equals("xxx"))
{
var bMem = getProcessMemory(process, exeName, caseName);
listMemResult.Add(bMem);
process.StandardInput.WriteLine("k");
}
}
};
#endregion
process.StartInfo = startInfo;
process.OutputDataReceived += outDataHandler;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
var topPeak = listMemResult.Take(10).ToList();
process.Refresh();
return topPeak;
}
}
最佳答案
在您的 C++ 程序中添加 fflush(stdin);
应该可以解决问题(下面是一段修改后的代码):
#ifdef OUT
printf("c is %d\n",c );
cout << endl;
cout << "xxx" << endl;
fflush(stdin); // note
getchar();
#endif
出于调试目的,我还稍微修改了您的 C# 代码,但没有什么值得一看的:
DataReceivedEventHandler outDataHandler = (object sender, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
var senderProcess = sender as Process;
if(sender == null)
Console.Write("Sender == NULL?");
if(senderProcess.HasExited)
Console.WriteLine("Exited");
count++;
Console.WriteLine(e.Data);
// e.Data != null redundant check, already everything wrapped in if(e.Data != null)
if (e.Data.Trim().ToLower().Equals("xxx"))
{
senderProcess.StandardInput.Write("k");
Console.WriteLine("Pass");
}
}
};
在用 Write
替换 WriteLine
之后,我第一次得到的数字总是 2047(WriteLine
打印两个字符,注意 \n
),我得到了 4095。再次是 2 的幂(加 +1)?缓冲?使用调试器 StandardOutput
检查,您会注意到输出缓冲区中确实有 4096 个字符。此外,如果将断点设置为 Write
,您会注意到在 4095 之后它会卡在那里(使用条件断点来缓解您的生活)并且永远不会到达 Console.WriteLine( “通过”)
。
StandardOutput.Flush
并没有真正解决问题(在文档中也找不到原因)而且 getchar
如果我没记错的话也没有清除它.
向 C++ 程序添加 fflush(stdin)
清除它,为 C# 继续写入它腾出空间。
关于c# - C++ 程序在多次打印 (cout) 后停止(卡住、无错误、无退出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531576/
我想知道 cout<
这可能是一个初学者问题,了解 cout 的工作原理可能是这里的关键。如果有人可以链接到一个好的解释,那就太好了。 cout(&cout) 的地址. cout << &cout打印出 cout 的地址.
经过一整天的编码,我不小心写了 cout << "some text" << cout; 代替 cout << "some text" << endl; 现在它打印出一个内存地址。它指向什么? 最佳答
这与 difference-between-cout-x-and-cout-operator-x 有关问题,但还是有点不同... #include int main(){ std::cout
我是 C++ 的新手,最近我花了几天时间阅读有关指针的内容。我意识到下面的 2 段代码给我不同的结果,尽管它们看起来相同。 第一段代码: int a = 5; int* ptr = &a; cout
我尝试使用更短的语法并避免在任何地方使用 std::,所以我开始使用新的别名语法。在一些例子中,我看到人们这样使用它: using json = nlohmann::json; 并尝试使用 std::
这是我的头文件 #ifndef KINGDOM_H_ #define KINGDOM_H_ #include using namespace std; namespace sict{ cla
我经常遇到要将二维数组打印到屏幕或文件的情况。我的标准方法是这样的: for(int q=0; q #include void printNumber(int x) { std::cout
有一些 cout 语句,但第一个 cout 语句末尾的空格出现在第二个 cout 语句的开头。这是代码: #include int main() { using namespace std;
我在搞乱代码时遇到了这种相当模糊的行为,这是示例: #include using namespace std; int print(void); int main(void) { cout
我收到所有 cout 和 endl 的这些错误消息: main.cc:17:5: error: ‘cout’ was not declared in this scope main.cc:17:5:
这个问题在这里已经有了答案: What is the meaning of prepended double colon "::"? (9 个回答) 关闭 7 个月前。 有一个简单的代码,包含::操
我有下面的代码,我不太明白为什么结果恰好像下面这样: #include #include using namespace std; int main () { std::stringstre
在 C++ 中,当我在 .h 文件中声明自己的命名空间时,如下所示: namespace my_own { //... } 那么,如果我在命名空间 my_own 内部或外部声明 using s
背景 IIRC,来自 Release 2.0 C++ 将单字符常量存储为类型 char而不是 int .但是在 Release 2.0 之前声明如下 cout #include using name
Problem was in IDE I am using - CLion 1.2.4 gives incorrect output inside its own output window, sol
我知道有几个这样的拷贝,但到目前为止,没有一个对我有用。我正在尝试使用 g++ 在 Ubuntu 上编译一个非常简单的 C++ 程序,但它给了我范围错误。 #include using namesp
我在这里有一个难题,我无法解决,也没有在网上找到正确的答案: 我创建了一个带有清理路由的分离线程,问题是在我的 Imac 和 Ubuntu 9.1(双核)上。我无法正确取消空闲代码中的分离线程: #i
#include #include #include using namespace std; int main() { ofstream fout("test.txt"); f
我是一名优秀的程序员,十分优秀!