小编Arc*_*ord的帖子

如何读取尚未刷新的过程输出?

考虑将这个小程序编译为 application.exe

#include <stdio.h>

int main()
{
    char str[100];
    printf ("Hello, please type something\n");
    scanf("%[^\n]s", &str);
    printf("you typed: %s\n", str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我使用此代码启动application.exe并获取其输出.

#include <stdio.h>
#include <iostream>
#include <stdexcept>

int main()
{
    char buffer[128];
    FILE* pipe = popen("application.exe", "r");
    while (!feof(pipe)) {
        if (fgets(buffer, 128, pipe) != NULL)
            printf(buffer);
    }
    pclose(pipe);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在我输入之前没有输出.然后获取两个输出行.我可以通过在第一个printf语句后添加此行来解决此问题.

fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

然后在我按预期输入之前获取第一行.

但是,如何获取我无法修改且不能fflush()在"实时"中使用的应用程序的输出(在退出之前的意思)?.windows cmd是如何做到的?

c++ winapi stdout process unbuffered

12
推荐指数
3
解决办法
1296
查看次数

什么是Field中原始getter/setter的目的?

在课堂上的public Object get(Object obj)方法文档中Field说明了这一点

如果对象具有基本类型,则该值自动包装在对象中.

并且public void set(Object obj, Object value)

如果基础字段是基本类型,则尝试进行解包转换以将新值转换为基元类型的值.

所以,我说的对,具体的原始吸气的唯一目的和setter喜欢getIntsetInt是为了防止冗余的类型转换?
由于此代码工作正常

public class Test{  
    int i = 1;
    public static void main(String[] args) throws Exception{
        Test inst = new Test();
        Class<?> clazz = inst.getClass();
        Field fi = clazz.getDeclaredField("i");
        int ii = (int) fi.get(inst);
        Integer iii = new Integer(ii * 2);
        fi.set(inst, iii);
    }
}
Run Code Online (Sandbox Code Playgroud)

我问的是,除了性能原因,是否有人知道需要您使用这些方法的场景.

java reflection

7
推荐指数
1
解决办法
238
查看次数

匿名类作为泛型参数


我想创建一个类,从匿名类定义中获取一个对象来存储.我使用泛型类来实现它.然后我想使用功能接口定义一些操作,这些接口将此对象作为要使用的参数.
代码说的不仅仅是文字.所以看看这个:

public class Test<T> {
    @FunctionalInterface
    public interface operation<T> {
        void execute(T object);
    }
    private T obj;
    public Test(T _obj){
        obj = _obj;
    }
    public void runOperation(operation<T> op){
        op.execute(obj);
    }

    public static void main(String[] args){
        Test<?> t = new Test<>(new Object(){
            public String text = "Something";
        });
        t.runOperation((o) -> {
            System.out.println(o.text);  // text cannot be resolved
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是o.text在功能接口的实现中无法解决.这是某种类型的擦除后果吗?
有趣的是,当我在构造函数中实现功能接口时,我可以使用此代码.
看看这段代码:

public class Test<T> {
    @FunctionalInterface
    public interface operation<T> {
        void execute(T object);
    }
    private T obj;
    private …
Run Code Online (Sandbox Code Playgroud)

java generics lambda anonymous-class

6
推荐指数
1
解决办法
885
查看次数

为什么Java CRLF令牌不能用于批处理文件输入?

背景:
我曾经回答过这个问题 ,即将两个输入字符串从Java进程刷新到批处理脚本.由于我找到了一个解决方案解决方案,我仍然非常有兴趣解决剩下的谜团,并找出明显解决方案无效的原因.

问题描述
看到这个非常简单的批处理脚本

@ECHO OFF
SET /P input1=1st Input: 
SET /P input2=2nd Input: 
ECHO 1st Input: %input1% and 2nd Input: %input2%
Run Code Online (Sandbox Code Playgroud)

如果您使用Java运行此批处理脚本ProcessBuilder并将两个输入字符串刷入其中,您会注意到只会消耗第一个输入字符串,而忽略第二个输入字符串.我发现该SET /P命令消耗了来自管道的输入

  • 找到CRLF令牌
  • 超时
  • 通过完全缓冲(1024字节)

我接受的解决方法基于最后两个选项,Thread.sleep(100)在输入之间使用语句或对每个输入使用1024字节缓冲区.

它始终适用于单个输入,或者在这种情况下是第一个输入,因为关闭流具有批处理脚本读取一个输入并且空返回所有后续SET /P语句的效果.

问题
为什么使用CRLF令牌的第一个选项"input\r\n"不起作用?

研究
我已经尝试String.getBytes()通过自己创建一个字节缓冲区\x0d并使用\x0aCRLF令牌的最后字节来解决该方法,但它没有任何效果.

我尝试了所有其他OutputStream包装器,PrintWriter以检查实现是否存在问题flush()而没有任何成功.

我创建了一个C++程序,它基本上与java程序一样,使用CreateProcess和stangely它就像一个魅力.

测试代码
不工作的Java代码:

ProcessBuilder builder = new ProcessBuilder("test.bat");
Process process = builder.start();

OutputStream out = process.getOutputStream();
out.write("foo\r\n".getBytes());
out.flush();
out.write("bar\r\n".getBytes()); …
Run Code Online (Sandbox Code Playgroud)

java windows pipe process batch-file

5
推荐指数
1
解决办法
292
查看次数

“case when”内的聚合 - 执行顺序是什么?

为什么这个简单的查询会导致“除以零”错误?

select 
case when b > 0 then sum(a / b) end
from (values (1,1),(2,1),(1,0),(2,0)) t (a,b)
group by b
Run Code Online (Sandbox Code Playgroud)

我期望输出:

案件
3
无效的

我唯一的解释是 postgres 在进行分组和评估案例之前计算总和。

postgresql evaluation group-by

5
推荐指数
1
解决办法
218
查看次数

如何在这个例子中使用glUniform1f?

我已经搜索,阅读并尝试了许多关于如何将值传递给GLSL程序的不同示例.但遗憾的是每一次尝试都失败了:(

我打算做的很简单:在我的Android应用程序中只需要一个小小的开放式3D动画.由于我的GUI设计,我更喜欢使用TextureView作为OpenGl Surface.我找到了一些适合我项目的代码.

但我的问题似乎完全在这个例子中.

当我编译并运行它时,它确实完成了它应该做的事情.在屏幕上绘制一个三角形.

然后我像这样修改了顶点着色器:

final String vertexShaderSource = 
   "attribute vec4 position;\n" +
   "attribute float myValue;\n" +
   "void main () {\n" +
         "vec4 oo;\n"+
         "oo[0] = position[0];\n"+
         "oo[1] = position[1] * myValue;\n"+
         "oo[2] = position[2];\n"+
         "oo[3] = position[3];\n"+
         "gl_Position = oo;\n" +
   "}";
Run Code Online (Sandbox Code Playgroud)

现在,我想将值传递给属性myValue.

所以这是我对run方法的修改.

public void run() {
   initGL();

   int attribPosition = GLES20.glGetAttribLocation(mProgram,
           "position");
   checkGlError();

   int valuePosition = GLES20.glGetAttribLocation(mProgram,
           "myValue");
   checkGlError();

   System.out.println("att id:"+ attribPosition 
           + " val id:" + valuePosition);

//[...]

   while (true) { …
Run Code Online (Sandbox Code Playgroud)

java android opengl-es textureview

3
推荐指数
1
解决办法
5222
查看次数