考虑将这个小程序编译为 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是如何做到的?
在课堂上的public Object get(Object obj)方法文档中Field说明了这一点
如果对象具有基本类型,则该值自动包装在对象中.
并且public void set(Object obj, Object value)该
如果基础字段是基本类型,则尝试进行解包转换以将新值转换为基元类型的值.
所以,我说的对,具体的原始吸气的唯一目的和setter喜欢getInt和setInt是为了防止冗余的类型转换?
由于此代码工作正常
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)
我问的是,除了性能原因,是否有人知道需要您使用这些方法的场景.
我想创建一个类,从匿名类定义中获取一个对象来存储.我使用泛型类来实现它.然后我想使用功能接口定义一些操作,这些接口将此对象作为要使用的参数.
代码说的不仅仅是文字.所以看看这个:
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进程刷新到批处理脚本.由于我找到了一个解决方案解决方案,我仍然非常有兴趣解决剩下的谜团,并找出明显解决方案无效的原因.
问题描述
看到这个非常简单的批处理脚本
@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命令消耗了来自管道的输入
我接受的解决方法基于最后两个选项,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) 为什么这个简单的查询会导致“除以零”错误?
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 在进行分组和评估案例之前计算总和。
我已经搜索,阅读并尝试了许多关于如何将值传递给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 ×4
process ×2
android ×1
batch-file ×1
c++ ×1
evaluation ×1
generics ×1
group-by ×1
lambda ×1
opengl-es ×1
pipe ×1
postgresql ×1
reflection ×1
stdout ×1
textureview ×1
unbuffered ×1
winapi ×1
windows ×1