Автор Тема: Компилиране на java код c gcj  (Прочетена 4273 пъти)

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Компилиране на java код c gcj
« -: Oct 18, 2009, 17:47 »
Днес се натъкнах на странен проблем. При компилиране на програма на java с компилатора на javac до баит код и стартиране на програмата в java конзола всичко работи коректно, но при компилиране на кода с gcj посредством командата:
Код
GeSHi (Bash):
  1. desktop:~$ gcj --main=NsiProg -o NsiProg NsiProg.java
програмата не се изпълнява коректно.
Ето и кода:
Код
GeSHi (Java):
  1. /*
  2.  * Програма за познаване на числа.
  3.  * При старт потребителя трябва да зададе максимума,
  4.  * в който да бъде избрано произволно число, след което потребителя трябва
  5.  * да познае генерираното число, като програмата му връща съобщение
  6.  * дали неговото предположение е по-голямо или по-малко и при познаване
  7.  * му съобщава и броят опити, които са му трябвали, за да познае числото.
  8.  */
  9.  
  10. // package javaapplication1;
  11.  
  12. /**
  13.  *
  14.  * @author pikimos 06.10.2009
  15.  */
  16. import java.util.Random;
  17. import java.util.Scanner;
  18.  
  19. /** Генериране на случайно число в зададен обхват */
  20. public final class NsiProg {
  21.  
  22.  public static final void main(String... aArgs){
  23.    Scanner input = new Scanner(System.in);
  24.    System.out.println("Обхват на слъчайно генерирано число от 1 до .....");
  25.    System.out.print("Въведете максималното число за обхвата: ");
  26.    int END = input.nextInt();
  27.    int START = 1;
  28.    Random random = new Random();
  29.        for (int idx = 1; idx <= 1; ++idx){
  30.            showRandomInteger(START, END, random);
  31.        }
  32.  }
  33.  private static void showRandomInteger(int aStart, int aEnd, Random aRandom){
  34.    if ( aStart > aEnd ) {
  35.      throw new IllegalArgumentException("Start cannot exceed End.");
  36.    }
  37.    //get the range, casting to long to avoid overflow problems
  38.    long range = (long)aEnd - (long)aStart + 1;
  39.    // compute a fraction of the range, 0 <= frac < range
  40.    long fraction = (long)(range * aRandom.nextDouble());
  41.    int randomNumber =  (int)(fraction + aStart);
  42.    Scanner input = new Scanner(System.in);
  43.    System.out.print("Въведете предположение за генерираното число: ");
  44.    int mainNumber = input.nextInt();
  45.        for (int count = 1; mainNumber != randomNumber; count++, mainNumber++, mainNumber--) {
  46.            System.out.println("Вашето предположение е грешно.");
  47.            System.out.println("Брой опити: " + count);
  48.            boolean max = mainNumber > randomNumber;
  49.                if (max) {
  50.                    System.out.println("Предложеното от вас число е по-голямо от генерираното.");
  51.                    } else {
  52.                        System.out.println("Предложеното от вас число е по-малко от генерираното.");
  53.                    }
  54.            System.out.print("Въведете предположение за генерираното число: ");
  55.            mainNumber = input.nextInt();
  56.         }
  57.    System.out.printf("Вие познахте!\n" + "Случайно генерираното число е:" + " " + "%d\n", randomNumber);
  58.    }
  59. }
Когато се стартира програмата трябва веднага да се отпечатат в конзолата 24 и 25 ред но това не се случва, при подаване на командата
Код
GeSHi (Bash):
  1. desktop:~$ ./NsiProg
  2.  
Курсора преминава на нов ред без да се отпечата нищо. Там съответно трябва да се въведе числото за обхвата и чак след това се отпечатват 24 и 25 ред и после трябва още веднъж да се въведе числото. Същото се повтаря и когато трябва да се отпечата ред 43.
Стигнах до извод, че изпълнението на кода на ред 23 предизвиква преминаването на курсора на нов ред без отпечатване на нищо и предизвиква въпросното прекъсване на програмата. Ако преместя кода:
Код
GeSHi (Java):
  1. Scanner input = new Scanner(System.in);
под ред 25 тогава и двата реда се разпечатват веднага след стартирането на програмата но пък прекъсването пак е налице. Въпросният ред отговаря за четеното от конзола.
Някой има ли идеи как да се реши проблема?
Просто реших да тествам компилатора с въпросната програма. Предполагам, че ако се направи графичен интерфейс за програмата няма да има проблеми, но в конзолата така стоят нещата.
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Компилиране на java код c gcj
« Отговор #1 -: Oct 19, 2009, 04:01 »
Първо за графичния интерфейс - той си е отделно нещо, да работи "двигателя" под него, пък после му мисли каквито там финтифлюшки си предствяш.
Сега за gcj - никога не съм ползвала този компилатор, но изглежда, че се прави така:
Код
GeSHi (Bash):
  1. gcj -C filename.java #компилация до байткод във файла filename.class
  2. gij filename #само filename, а не filename.class
Т.е. все едно стандартното
Код
GeSHi (Bash):
  1. javac filename.java #компилация до байткод във файла filename.class
  2. java filename #само filename, а не filename.class

После може и:
Код
GeSHi (Bash):
  1. gcj filename.class -o filename --main=filename
  2. ./filename

За твое успокоение - с java-та на Сън, кода си върви:
Код
GeSHi (Bash):
  1. dvd@BlackPearl:~$ javac NsiProg.java
  2. dvd@BlackPearl:~$ java NsiProg
  3. Обхват на слъчайно генерирано число от 1 до .....
  4. Въведете максималното число за обхвата: 233
  5. Въведете предположение за генерираното число: 21
  6. Вашето предположение е грешно.
  7. Брой опити: 1
  8. Предложеното от вас число е по-малко от генерираното.
  9. Въведете предположение за генерираното число: 34
  10. Вашето предположение е грешно.
  11. Брой опити: 2
  12. Предложеното от вас число е по-малко от генерираното.
  13. Въведете предположение за генерираното число: 3421
  14. Вашето предположение е грешно.
  15. Брой опити: 3
  16. Предложеното от вас число е по-голямо от генерираното.
  17. Въведете предположение за генерираното число: 23
  18. Вашето предположение е грешно.
  19. Брой опити: 4
  20. Предложеното от вас число е по-малко от генерираното.
  21. Въведете предположение за генерираното число: ^Cdvd@BlackPearl:~$

Погледни това :)
« Последна редакция: Oct 19, 2009, 04:27 от bop_bop_mara »
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #2 -: Oct 19, 2009, 07:33 »
Да с Java на Сън работи това го знам, но идеята е да се компилира не до байт код а до машинен код и да работи коректно.
Всъщност тя програмата си работи и компилирана с gcj но не се интерпритира от конзолата коректно.
Спазих стъпките, които описваш и няма резултат.
Ако някой знае някой  друг компилатор за java до машинен код нека пише.
« Последна редакция: Oct 19, 2009, 07:36 от pikimos »
Активен

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: Компилиране на java код c gcj
« Отговор #3 -: Oct 19, 2009, 11:05 »
Сигурен ли си че не ти даде грешка при компилирането от сорта на
Код
GeSHi (Bash):
  1. gcj --main=NsiProg -o NsiProg NsiProg.java
  2.  
  3. NsiProg.java:3: error: The import java.util.Scanner cannot be resolved
  4.        import java.util.Scanner;
  5.               ^^^^^^^^^^^^^^^^^
  6. NsiProg.java:9: error: Scanner cannot be resolved to a type
  7.        Scanner input = new Scanner(System.in);
  8.        ^^^^^^^
  9. NsiProg.java:9: error: Scanner cannot be resolved to a type
  10.        Scanner input = new Scanner(System.in);
  11.                            ^^^^^^^
  12. NsiProg.java:47: error: Scanner cannot be resolved to a type
  13.        Scanner input = new Scanner(System.in);
  14.        ^^^^^^^
  15. NsiProg.java:47: error: Scanner cannot be resolved to a type
  16.        Scanner input = new Scanner(System.in);
  17.                            ^^^^^^^
  18. 5 problems (5 errors)
е при мен редовете са други щото поизрязах коментарите, но идеята е следната - gcj е съвместим с java v 5.0 и по-малка а Scanner мисля го въведоха в по-новите версии така че ако държиш много да го ползваш gcj ползвай по-старите алтерантиви там .. по мои спомени то не бяха buffered Reader/Writer та после New IO i.e. nio класове та чак след това опряхме до Scanner(s) след версия 6.0 и нагоре  :)
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #4 -: Oct 19, 2009, 11:33 »
Да най-вероятно проблема е точно това ще пробвам да пренапиша програмата с по старите версии за четене от конзола и ще кажа има ли резултат.
А иначе не ми даде тази грешка при компилиране.
С Убунту 9.10 съм и последната версия на gcj за дистрибуцията но вероятно не са доизпипали както трябва подръжката на java 6.
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Компилиране на java код c gcj
« Отговор #5 -: Oct 19, 2009, 13:49 »
По мои спомени имаше Scanner в java 5 ...
Както и да е, верно, че gcj беше съвместим с някоя по-стара версия на java.
Ама аз разбрах, че се е компилирало успешно и просто като го пуснеш, не върви.
Даде ли ти грешки при компилацията и какви, дай изход от конзолата при компилация и при пускане.
Иначе Scanner наистина не е за препоръчване да се ползва, особено, когато трябва да прочетеш много голям вход.
Активен

ръца-пръца

  • Напреднали
  • *****
  • Публикации: 49
    • Профил
Re: Компилиране на java код c gcj
« Отговор #6 -: Oct 19, 2009, 14:32 »
java.util.Scanner е въведен в Java 5 (вижте http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html).
Според мен пробвай като за начало да добавиш System.out.flush() след System.out.print(... на 25-и ред. По спецификация (http://java.sun.com/j2se/1.5.0/docs/api/java/io/PrintStream.html) никъде не е казано, че autoFlush флага е вдигнат по подразбиране и нищо чудно в не-Sun имплементация да се чака flush-ване и след println()...
Активен

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: Компилиране на java код c gcj
« Отговор #7 -: Oct 20, 2009, 08:59 »
yoakim-е прав си ...обаче зависи явно от коя версия 5.х и нагоре е въведено за gcj - защото аз съм с 5.0  а ми дава горните грешки при компилация

--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
а пък:
gcj --main=NsiProg -o NsiProg NsiProg.java
NsiProg.java:3: error: The import java.util.Scanner cannot be resolved
       import java.util.Scanner;

Код
GeSHi (Bash):
  1. $ gcj -v
  2. Using built-in specs.
  3. Reading specs from /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcj.spec
  4. rename spec startfile to startfileorig
  5. rename spec lib to liborig
  6. Target: x86_64-redhat-linux
  7. Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release
  8.  --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk
  9.  --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode
  10.  --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=x86_64-redhat-linux
  11. Thread model: posix
  12. gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
  13.  
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #8 -: Oct 20, 2009, 09:17 »
Ето какво открих вчера.
До сега правех тестовете с пакетите на openjava. Реших да ги махна и да пробвам с пакетите sun-java.
Само да добавя, че кода е коректен и никога при компилация не ми е давало каквито и да било грешки!
Значи с другите пакети на java пак си минава компилацията успешно и проблема със засичането на програмата на реда Scanner си остава но интересното е, че когато компилирам до байт код със стандартния java компилатор javac и пусна програмата с java NsiProg, ефекта е същия както и когато програмата е компилирана  с gcj до машинен код.
След, като махнах пакетите на sun и върнах пакетите openjava програмата отново заработи коректно но само в конзолата на java.
Това ме навежда на мисълта, че може би трябва да се зададе някакъв специфичен път с параметъра --classpath=/..../..../...... но не знам къде или към кой файл да сочи пъя.
При мен версията на gcj e:
Код
GeSHi (Bash):
  1. desktop:~$ gcj -v
  2. Using built-in specs.
  3. Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libgcj.spec
  4. rename spec startfile to startfileorig
  5. rename spec lib to liborig
  6. Target: x86_64-linux-gnu
  7. Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-5ubuntu2' --with-bugurl=file:///usr/share/doc/gcj-4.4/README.Bugs --enable-languages=c,c++,java --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --disable-libmudflap --enable-java-awt=gtk --enable-gtk-cairo --disable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.4/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.4 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.4 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
  8. Thread model: posix
  9. gcc version 4.4.1 (Ubuntu 4.4.1-5ubuntu2)
  10.  
« Последна редакция: Oct 20, 2009, 09:25 от pikimos »
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #9 -: Oct 22, 2009, 13:19 »
Кратко точно и ясно, компилира се и работи без никакви проблеми. C++ :)
Код
GeSHi (C++):
  1. /*
  2.  * File:   main.cpp
  3.  * Author: niki
  4.  *
  5.  * Created on Четвъртък, 2009, Октомври 22, 9:04
  6.  */
  7.  
  8. #include <stdlib.h>
  9. #include <ctime>
  10. #include <iostream>
  11.  
  12.  
  13. using namespace std;
  14.  
  15. void go();
  16.  
  17. int main(int argc, char**argv) {
  18.    cout << "Обхват на слъчайно генерирано число от 1 до .....\n";
  19.    cout << "Въведете число за максимален обхват ";
  20.     int a;
  21.     cin >> a;
  22.     srand(time(NULL));
  23.     int b = rand() % a + 1;  //number between 1 to ......
  24.     cout << "Въведете предположение за генерираното число: ";
  25.     int mn;
  26.     cin >> mn;
  27.     for (int count = 1; mn != b; count++, mn++, mn--) {
  28.            cout << "Вашето предположение е грешно.\n";
  29.            cout << "Брой опити: "<< count << "\n";
  30.                if (mn > b) {
  31.                    cout << "Предложеното от вас число е по-голямо от генерираното.\n";
  32.                    } else {
  33.                        cout << "Предложеното от вас число е по-малко от генерираното.\n";
  34.                    }
  35.            cout << "Въведете предположение за генерираното число: ";
  36.            cin >> mn;
  37.     }
  38.     cout << "Вие познахте!\n";
  39.     cout << "Случайно генерираното число е: "<< b << "\n";
  40.     return 0;
  41. }
« Последна редакция: Oct 22, 2009, 15:19 от pikimos »
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Компилиране на java код c gcj
« Отговор #10 -: Oct 22, 2009, 14:08 »
//offtopic
Сега ако си унифицираш стила  ::)
Цитат
#include <stdlib.h>
#include <ctime>
#include <iostream>
#include <stdio.h>
C++ или C? stdio или iostream?
Цитат
bool max = mainNumber > b;
               if (max)
if(mainNumber > b) (това и за java)

Предполагам сега се учиш да програмираш, така че не приемай това като заяждане, а като съвети :)
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #11 -: Oct 22, 2009, 14:25 »
Да сега се уча и благодаря за съвета  :)
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #12 -: Oct 22, 2009, 15:24 »
Редактирах кода и сега изглежда по прилично :)
Ползвам netbeans, който е за c/c++ но когато въвеждам #include <iostream.h> ми дава Cannot find include file iostream.h иначе с iostream само няма проблем.
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Компилиране на java код c gcj
« Отговор #13 -: Oct 23, 2009, 11:56 »
Код
GeSHi (C):
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  

Код
GeSHi (C++):
  1. #include <cstdio>
  2. #include<cstdlib>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  

В C няма iostream. То си е за C++, основното му смислено предназначение, ако не бъркам, е в ООП-то и предефинирането на оператори. Иначе функциите в stdio са за предпочитане.

Ползвам netbeans, който е за c/c++
Пробвай да ползваш някой хубав текстов едитор (поне с оцветяване на кода) и компилиране и пускане през конзола. Много по-полезно ще ти е според мен :)
Активен

pikimos

  • Напреднали
  • *****
  • Публикации: 49
  • Distribution: Kubuntu 9.10
    • Профил
Re: Компилиране на java код c gcj
« Отговор #14 -: Oct 23, 2009, 13:58 »
Ще препоръчаш ли някой :)
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
java
Настройка на програми
jojopara 3 4213 Последна публикация Feb 03, 2003, 13:06
от Nerdboy
Приложение на Java под конзола
Настройка на програми
laik 3 3064 Последна публикация Jun 07, 2004, 19:23
от v_badev
приложение на Java
Общ форум
laik 3 3687 Последна публикация Jun 17, 2004, 13:10
от JOKe
JAVA програмиране
Общ форум
smitev 8 4994 Последна публикация Jul 13, 2004, 00:26
от JOKe
За Java програмисти
Общ форум
smitev 1 3221 Последна публикация Sep 15, 2004, 21:49
от JOKe