Нужно написать простую программкуНе бесплатно !
#24
Отправлено 31.05.2010, 11:01:15
Пользователь вводит исходный код программы в одном текстовом поле формы, нажимает кнопку "Compile and Run". Если во введенном коде нет ошибок, то ваша программа его компилирует, запускает, и отображает результат его работы в другом текстовом поле.
#25
Отправлено 31.05.2010, 12:59:20
"простецкая субд" по сложности примерно равна нейронной сети.писал всякое, от простецких субд до нейронных сетей
ничего сверхестественного в нейронках нет, но для пыли в глаза
упоминать их очень любят.
какой смысл в школьном вопросе, решение которого предложено производителем?А такое можете сделать?
или все велосипедим по незнанию?
http://support.micro...b/304655/EN-US/
но даже если уж совсем не умеем интернетом пользоваться, то не
морочась на всякие ньюансы, если очень надо по быстрому, на
коленке, это пишется за 10 минут.
System.IO.File.WriteAllText(@".\inp.cs", "using System; namespace ConsoleApplication1 { class Program { " + "static void Main(string[] args) { " + textBox1.Text + "}}}"); System.Diagnostics.Process p = System.Diagnostics.Process.Start(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe", @".\inp.cs"); p.WaitForExit(); if (p.ExitCode == 0) { System.Diagnostics.Process p2 = new System.Diagnostics.Process(); p2.StartInfo.RedirectStandardOutput = true; p2.StartInfo.FileName = @".\inp.exe"; p2.StartInfo.UseShellExecute = false; p2.Start(); textBox2.Text = p2.StandardOutput.ReadToEnd(); } else textBox2.Text = "Error";
#27
Отправлено 31.05.2010, 16:20:01
"Велосипедите" (а точнее говоря, хамите без особых на то причин) в данном случае вы. В приведенной вами ссылке говорится: "The code above uses the CompilerParameters object to tell the compiler that you want to generate an executable file (as opposed to a DLL) and that you want to output the resulting assembly to disk". Затем скомпилированный дисковый файл вызывается как отдельное приложение, со своим окном:какой смысл в школьном вопросе, решение которого предложено производителем?
или все велосипедим по незнанию?
http://support.micro...b/304655/EN-US/
... string Output = "Out.exe"; ... if (ButtonObject.Text == "Run") Process.Start(Output);Это лишь отдаленно похоже на картинку в моем сообщении. Вам понятно, в чем разница, или надо объяснять?
А это ваще... Таким "школьным" способом из программы разве что стандартный notepad.exe вызывать. Или calc.exe. Впрочем, способ вполне законный. Я сам такой пример уже показывал здесь, где-то пару лет назад.но даже если уж совсем не умеем интернетом пользоваться, то не морочась на всякие ньюансы, если очень надо по быстрому, на коленке, это пишется за 10 минут.
System.IO.File.WriteAllText(@".\inp.cs", "using System; namespace ConsoleApplication1 { class Program { " + "static void Main(string[] args) { " + textBox1.Text + "}}}"); System.Diagnostics.Process p = System.Diagnostics.Process.Start(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe", @".\inp.cs"); ...
#28
Отправлено 01.06.2010, 10:38:10
Но работает так как на картинке
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = jTextArea1.getText();
s = "public class Test { public Test(){} public void run(){"+s+"} }";
File file = new File("C:\\Test.java");
class GetClass extends ClassLoader{
public GetClass(ClassLoader cl){
super(cl);
}
public Class toClass(String name, byte[] b) {
if (b != null) {
return defineClass(name, b, 0, b.length, this.getClass()
.getProtectionDomain());
} else {
return null;
}
}
}
try {
OutputStream out = new FileOutputStream(file);
out.write(s.getBytes());
out.flush();
out.close();
Runtime.getRuntime().exec("javac C:\\Test.java");
InputStream in = new FileInputStream("C:\\Test.class");
BufferedInputStream bf = new BufferedInputStream(in);
byte[] b = new byte[bf.available()];
bf.read(b);
Class c = new GetClass(null).toClass("Test", b);
Object o = c.newInstance();
o.getClass().getMethod("run", new Class[]{}).invoke(o, null);
out = new OutputStream() {
private int BUFFER_SIZE = 8192;
private JTextArea target;
private byte[] buffer = new byte[BUFFER_SIZE];
private int pos = 0;
@Override
public void write(int b) throws IOException {
buffer[pos++] = (byte)b;
if (pos == BUFFER_SIZE) {
flush();
}
}
@Override
public void flush() throws IOException
{
byte[] flush = null;
if (pos != BUFFER_SIZE) {
flush = new byte[pos];
System.arraycopy(buffer, 0, flush, 0, pos);
}
else {
flush = buffer;
}
jTextArea2.append(new String(flush));
pos = 0;
}
};
PrintStream outStream = new PrintStream(out, true);
System.setOut(outStream);
} catch (Exception ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
#29
Отправлено 01.06.2010, 11:07:31
Я в Java почти ничего не смыслю, и ошибок найти не могу. Но по некоторым строкам кода могу видеть, что используются именно те идеи, которые нужны в данном случае. Нечто подобное технологии Reflection в .NET. С уважением снимаю шляпу. Респект!Вот Вам код. Сделал на скорую ногу ))))
Но работает так как на картинке
...
#33
Отправлено 01.06.2010, 22:24:37
Да эти товарищи и в этой теме тем же занимались.Что за манера на форумах 3.14ськами мериться? Голый флуд. Надо для умников таких соревнование устроить.
Реальных проектов нет, так они на форумах пиарятся
#34
Отправлено 01.06.2010, 23:05:20
Программа не моя, сам изучаю шарп. Исходный код класса, который выполняет основную работу, выглядит так:
public class CodeDriver { private string prefix = "using System;" + "public static class Driver" + "{" + " public static void Run()" + " {"; private string postfix = " }" + "}"; public string CompileAndRun(string input, out bool hasError) { hasError = false; string returnData = null; CompilerResults results = null; using (CSharpCodeProvider provider = new CSharpCodeProvider()) { CompilerParameters options = new CompilerParameters(); options.GenerateInMemory = true; StringBuilder sb = new StringBuilder(); sb.Append(prefix); sb.Append(input); sb.Append(postfix); results = provider.CompileAssemblyFromSource(options, sb.ToString()); } if (results.Errors.HasErrors) { hasError = true; StringBuilder errorMessage = new StringBuilder(); foreach (CompilerError error in results.Errors) { errorMessage.AppendFormat("{0} {1}", error.Line, error.ErrorText + Environment.NewLine); } returnData = errorMessage.ToString(); } else { TextWriter temp = Console.Out; StringWriter writer = new StringWriter(); Console.SetOut(writer); Type driverType = results.CompiledAssembly.GetType("Driver"); driverType.InvokeMember("Run",BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); Console.SetOut(temp); returnData = writer.ToString(); } return returnData; } }
Теперь можно легко написать обработчик нажатия на кнопку в главной форме с использованием этого класса:
private void Compile_Click(object sender, System.Windows.RoutedEventArgs e) { CodeDriver driver = new CodeDriver(); bool isError; textOutput.Text = driver.CompileAndRun(textCode.Text, out isError); if (isError) { textOutput.Background = Brushes.Red; } }
#37
Отправлено 02.06.2010, 12:47:08
#38
Отправлено 02.06.2010, 16:34:43
Эй, умник, насчет дурачья за метлой послеживай. Есть правила на этот счет. (Модеру на заметку!) Просто на большенстве форумов как правило пустая болтовня.Всегда пожалуйста. Очень интересно и полезно, разве нет? А говорят, что мы тут "3.14письками меряемся" и что у нас "голый флуд". Вот ведь дурачье. И откуда такие только берутся.
Спасибо.
Сообщение отредактировал egoist: 03.06.2010, 14:21:54
#39
Отправлено 02.06.2010, 16:42:26
Это называется unix-way и единственный универсальный способ для данной задачи.А это ваще... Таким "школьным" способом из программы разве что стандартный notepad.exe вызывать. Или calc.exe. Впрочем, способ вполне законный.
Смех начнется при попытке сделать парсер жабы или паскаля через всякие CSharpCodeProvider
/* только не надо отмазов, что в исходной задаче этого не требовалось */
Вот и спрашивается зачем делать сложно и специфично, если можно просто и универсально.
этому примеру лет так 40. совпадает с рождением юниха. НеоригинальноЯ сам ...где-то пару лет назад....
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0