M
Mr.InF3ction
Гостин
Прво прашање: Имап Java инсталирано на Linux машината?
Пробај соЗдраво момци, имам проблем во врска со ова апликацииве што ги правам во јава. Всушност на крај на проектот тие ги експортирам во .jar датотека. Потоа апликацијата ми работи на Виндоус компјутерите, но кога ќе ја ставам на линукс не да не ја покрева туку не ја дава како java фајл.. имате ли искуство со тоа? што да правам?
java -jar ImetoNaAplikacijata.jar
еве слика.. значи има и јава и се шо треба..Пробај соPHP:java -jar ImetoNaAplikacijata.jar
Проблемот на овој скриншат ти е баш заради тоа /usr/bin/java. На машината имаш restricted shell каде што не можеш да извршуваш наредби кои што содржат коса црта во нив.еве слика.. значи има и јава и се шо треба..
немојте само да ми замерите на тоа патеката на јавата шо ја пишав пред java -jar... затоа што пробав и без патеката но ист проблем беше.. всушност сликава ми е за да ви покажам дека има јава, а фајлот може да видите дека не го дава како јава фајл
Прегледај го приврзокот 110203
Мислам дека ова ќе ти заврши работаВеќе цел семестар работам Јава и имам прашање околу тоа како го решавате проблемот со покажувачи во Јава (оној момент кога ми е потребно да работам со референца на оригинал, а не негова копија, а Јава ги нема класичните покажувачи од Ц и Ц++).
Знам дека Јава работи само со референци, но имам проблем кога сакам да повикувам методи (што е нормално, бидејќи за влезните аргументи се креираат копии, а не се работи со оригиналите). Исто, знам дека единствено за примитивните типови не се праќа копија, туку оригинал.
Она што ме интересира т.е. ми е нејасно како би можело да се изведе најдобро можам да го доловам преку следниот пример:
- да речеме дека програмот 1000 пати врши една работа (најпрост swap нека е и тоа на 2 елементи). Секако, мануелното испишување на истиот код за swap 1000 пати не е опција, па некако интуитивно е да се креира метод за тоа (нека биде static за да не мора да се креира истанца од класата за да биде употребен). Меѓутоа, работам со генерици и бидејќи се објекти од моја класа (не се примитивни типови), кога ги праќам двата елементи за замена ко аргументи, всушност не се заменуваат тие, туку нивните копии (јасно ми е зошто е тоа така). Она што ме интересира е како може (ако може воопшто) да се изведе swap на дадените елементи, ако знаеме дека елементите кои ги заменувам не ги чувам ко елементи на класата и методот го повикувам за внесени броеви од main???
Не станува збор за конкретна задача, туку концептот на работа во било кој проблем од овој тип ме интересира. Еве во една реченица, прашањето е: како ќе обработиш два елементи со (working) swap метод, ако притоа знаеш дека тие елементи не ги чуваш внатре во класата каде ги обработуваш?Ај постирај кодот од се шо имаш, зашто вака некако слабо те разбирам и ако го видам кодот ќе сфатам шо сакаш да направиш и да ти помогнам.
public void swap(T t1, T t2)
{
if(t1.compareTo(t2)>0)
{
T temp=prv;
prv=vtor;
vtor=temp;
}
else
{
T temp=vtor;
vtor=prv;
prv=temp;
}
}
Мешаш баби и жаби, генерици и покажувачиНе станува збор за конкретна задача, туку концептот на работа во било кој проблем од овој тип ме интересира. Еве во една реченица, прашањето е: како ќе обработиш два елементи со (working) swap метод, ако притоа знаеш дека тие елементи не ги чуваш внатре во класата каде ги обработуваш?
Еве со пример:
значи, ако се чуваа прв и втор ко генерици внатре во класата, лесно ќе ја направеше замената, но што ако не ги чуваш? Како да се реализира swap тогаш???Код:public void swap(T t1, T t2) { if(t1.compareTo(t2)>0) { T temp=prv; prv=vtor; vtor=temp; } else { T temp=vtor; vtor=prv; prv=temp; } }
Дополнително, ме интересира зошто 1900 год. java.util.date ја дава ко 3800. Сакам да споредам датум со првиот момент од 1900 год. (креирав Date d = new Date(1900, 0, 1, 0, 0), но не ми ги прави добро споредбите, зошто годината која ја враќа во овој случај е 3800.....
void swap(int * a, int *b)
template <typename T>
void swap(T * a, T *b)
int a[4] = {1,2,3,4}
swap(&a[1], &a[3])
string a[4] = {"1","2","3","4"}
swap<string>(&a[1], &a[3]) // swap se predefinira kako void swap(string * a, string * b)
string * a[4] = {new string("1"), new string("2"), new string("3"), new string("4")}
swap<string*>(&a[1], &a[3]) // swap avtomatski se predefinira kako void swap(string * * a, string * * b) // zapazi dupli dzvezdi
void swap(int[] a, int i, int j)
void swap(String[] a, int i, int j) // tuka rabotime so objekti, String krie edna dzvezda, nemae kontrola vrz toa
void swap(Т[] a, int i, int j) // Т оди на местото од String и автоматски си крие една ѕвезда исто како што си крие String - имаме низа од покажувачи и во јава сите низи од објекти се низи од покжувачи без разлика дали сме ставиле генерик или не, нема низи од цели објекти.
Го исчитав постов и единствен заклучок до кој дојдов е дека ништо не си ме разбрал. Т инаку менува примитивни типови (индиректно), но ако му ја пратиш соодветната wrapper класа. Многу добро знам што означуваат * и & во ц++, ама она јас што го прашувам се однесува на Јава. Па уште еднаш да доконкретизирам без примери и глупости, зошто очигледно инаку го сфаќате контекстот на напишаното:Мешаш баби и жаби, генерици и покажувачи
Во Ц++ негерички swap би одел
А генерички би одел.Код:void swap(int * a, int *b)
И сега, ако менуваме два елементи од низа повикувамеКод:template <typename T> void swap(T * a, T *b)
или генеричка варијантаКод:int a[4] = {1,2,3,4} swap(&a[1], &a[3])
Запази ги ѕвездите во декларацијата на swap и амперсандот. Значи ние викаме извлечија адресата на 2риот елемент во низата, па извлечи ја адресата на 4тиот елемент и прати ги адресите во swap.Код:string a[4] = {"1","2","3","4"} swap<string>(&a[1], &a[3]) // swap se predefinira kako void swap(string * a, string * b)
Е сега што те буни тебе, во Ц++ имаме и ваква можност кога работиме со објекти.
Е во Јава кога работиме со објекти, сите објекти се по референца односно по покажувач со една ѕвезда (таа е скриена во јава) и тоа е единствата дозволена можност (ова е третата можност од ц++). Немаме "чисти" објекти (без ниедна ѕвезда), немаме дупли ѕвездни. Значи не можеме да извлечиме покажувач каде сакаме -- не можеме да извлечиме покажувач кон место на средина во низата.Код:string * a[4] = {new string("1"), new string("2"), new string("3"), new string("4")} swap<string*>(&a[1], &a[3]) // swap avtomatski se predefinira kako void swap(string * * a, string * * b) // zapazi dupli dzvezdi
Па во јава има само еден начин за свап, со индекси.
Негенерички би бил вака
Генерички би билo вакаКод:void swap(int[] a, int i, int j) void swap(String[] a, int i, int j) // tuka rabotime so objekti, String krie edna dzvezda, nemae kontrola vrz toa
И сега да се вратиме горе на бабите и жабите, Темплејт/Генерик само менува ТИП на местото од Т, не дефинира никаков покажувач. Е сега финтата е шо во Ц++ ТИП може да биди примитивен тип, класен тип, покажувач кон нешто (со 5 ѕвезди) и освен тоа можеме да си додаваме ѕвезди после Т.Код:void swap(Т[] a, int i, int j) // Т оди на местото од String и автоматски си крие една ѕвезда исто како што си крие String - имаме низа од покажувачи и во јава сите низи од објекти се низи од покжувачи без разлика дали сме ставиле генерик или не, нема низи од цели објекти.
Во јава типови се само примитицни и класни типови, нема никави дополнителни покажувачи. Променлива од класен тип е „скриен“ покажувач и толку, тоа е тоа. Па и тоа Т е такво -- нема други видови на ТИПОВИ.
И за крај во јава, Т не може да менува примитивни типови.
Само ако ти е декларирана како променлива дел од класатаГо исчитав постов и единствен заклучок до кој дојдов е дека ништо не си ме разбрал. Т инаку менува примитивни типови (индиректно), но ако му ја пратиш соодветната wrapper класа. Многу добро знам што означуваат * и & во ц++, ама она јас што го прашувам се однесува на Јава. Па уште еднаш да доконкретизирам без примери и глупости, зошто очигледно инаку го сфаќате контекстот на напишаното:
како во Јава да се пристапи до соодветната мемориска адреса на било која променлива, во било кој момент (без оглед дали ја праќаме во методи или не)?
class Swapper {
int i1;
int i2;
public Swapper (int i1,int i2){
i1=i1;
i2=i2;
}
public void swap(){
int tmp=i1;
i1=i2;
i2=tmp;
}
}
Шо поента има класава... некако, бескорисна е.Само ако ти е декларирана како променлива дел од класата
Во mainКод:class Swapper { int i1; int i2; public Swapper (int i1,int i2){ i1=i1; i2=i2; } public void swap(){ int tmp=i1; i1=i2; i2=tmp; } }
new Swapper(5,6).swap();
Да направи смена на две променливи во јава, може ти се чини бескорисна, но ако работиш наивно, ќе треба да креираш класа со статички метод и ќе се прашуваш зошто не работи.Шо поента има класава... некако, бескорисна е.
Јас само би ја коригирала да е генеричка и би го исфрлила целиот метод за swap. Swap - от би го реализирала уште во конструкторот, каде this.i1 = i2 и this.i2 = i1;Да направи смена на две променливи во јава, може ти се чини бескорисна, но ако работиш наивно, ќе треба да креираш класа со статички метод и ќе се прашуваш зошто не работи.
Може и така, но во духот на ОО ќе биде лошо, затоа што конструкторот ти е за иницијализација т.е конструкција на објектотЈас само би ја коригирала да е генеричка и би го исфрлила целиот метод за swap. Swap - от би го реализирала уште во конструкторот, каде this.i1 = i2 и this.i2 = i1;