Днес се натъкнах на странен проблем. При компилиране на програма на java с компилатора на javac до баит код и стартиране на програмата в java конзола всичко работи коректно, но при компилиране на кода с gcj посредством командата:
GeSHi (Bash):
desktop:~$ gcj --main=NsiProg -o NsiProg NsiProg.java
програмата не се изпълнява коректно.
Ето и кода:
GeSHi (Java):
/*
* Програма за познаване на числа.
* При старт потребителя трябва да зададе максимума,
* в който да бъде избрано произволно число, след което потребителя трябва
* да познае генерираното число, като програмата му връща съобщение
* дали неговото предположение е по-голямо или по-малко и при познаване
* му съобщава и броят опити, които са му трябвали, за да познае числото.
*/
// package javaapplication1;
/**
*
* @author pikimos 06.10.2009
*/
import java.util.Random;
import java.util.Scanner;
/** Генериране на случайно число в зададен обхват */
public final class NsiProg {
public static final void main
(String...
aArgs){ Scanner input
= new Scanner
(System.
in);
System.
out.
println("Обхват на слъчайно генерирано число от 1 до .....");
System.
out.
print("Въведете максималното число за обхвата: ");
int END = input.nextInt();
int START = 1;
for (int idx = 1; idx <= 1; ++idx){
showRandomInteger(START, END, random);
}
}
private static void showRandomInteger
(int aStart,
int aEnd,
Random aRandom
){ if ( aStart > aEnd ) {
}
//get the range, casting to long to avoid overflow problems
long range = (long)aEnd - (long)aStart + 1;
// compute a fraction of the range, 0 <= frac < range
long fraction = (long)(range * aRandom.nextDouble());
int randomNumber = (int)(fraction + aStart);
Scanner input
= new Scanner
(System.
in);
System.
out.
print("Въведете предположение за генерираното число: ");
int mainNumber = input.nextInt();
for (int count = 1; mainNumber != randomNumber; count++, mainNumber++, mainNumber--) {
System.
out.
println("Вашето предположение е грешно.");
System.
out.
println("Брой опити: " + count
);
boolean max = mainNumber > randomNumber;
if (max) {
System.
out.
println("Предложеното от вас число е по-голямо от генерираното.");
} else {
System.
out.
println("Предложеното от вас число е по-малко от генерираното.");
}
System.
out.
print("Въведете предположение за генерираното число: ");
mainNumber = input.nextInt();
}
System.
out.
printf("Вие познахте!\n" + "Случайно генерираното число е:" + " " + "%d\n", randomNumber
);
}
}
Когато се стартира програмата трябва веднага да се отпечатат в конзолата 24 и 25 ред но това не се случва, при подаване на командата
GeSHi (Bash):
desktop:~$ ./NsiProg
Курсора преминава на нов ред без да се отпечата нищо. Там съответно трябва да се въведе числото за обхвата и чак след това се отпечатват 24 и 25 ред и после трябва още веднъж да се въведе числото. Същото се повтаря и когато трябва да се отпечата ред 43.
Стигнах до извод, че изпълнението на кода на ред 23 предизвиква преминаването на курсора на нов ред без отпечатване на нищо и предизвиква въпросното прекъсване на програмата. Ако преместя кода:
GeSHi (Java):
Scanner input
= new Scanner
(System.
in);
под ред 25 тогава и двата реда се разпечатват веднага след стартирането на програмата но пък прекъсването пак е налице. Въпросният ред отговаря за четеното от конзола.
Някой има ли идеи как да се реши проблема?
Просто реших да тествам компилатора с въпросната програма. Предполагам, че ако се направи графичен интерфейс за програмата няма да има проблеми, но в конзолата така стоят нещата.