• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Error argumentu w funkcji main w scala 3.

Object Storage Arubacloud
+1 głos
58 wizyt
pytanie zadane 11 marca w Inne języki przez Arek04 Użytkownik (700 p.)

Pisze kod w jezyku Scala 3. Chcialbym w funkcji main przyjmowac dwie list typu int. Kod:

import scala.annotation.tailrec

def tasuj(l1: List[Int], l2: List[Int]): List[Int] = {
    @tailrec
    def tailrec(l1: List[Int], l2: List[Int], ret: List[Int] = List.empty[Int]): List[Int] = {

        if(l1.length == 0 || l2.length == 0){
            return ret;
        }

        else if(l1.head < l2.head){
            if(ret.length == 0 ){//sprawdzam zeby nie uzyc .last na pustej tablicy
                tailrec(l1.tail, l2, ret :+ l1.head);
            }
            else if(ret.last == l1.head){//jesli sie powtarza to usuwam pierwszy element z tablicy w ktorej zostal znaleziony mniejszy element
                tailrec(l1.tail, l2, ret);
            }
            else{
                tailrec(l1.tail, l2, ret :+ l1.head);//pierwsza tablica traci pierwszy element, ktory dodawany jest do koncowej
            }
        }

        else if(l1.head == l2.head){
            if(ret.length == 0){
                tailrec(l1.tail, l2, ret :+ l1.head);
            }
            else if(ret.last == l1.head){//jesli sie powtarza to usuwam pierwszy element z obu tablic zeby sie nie zapetlilo
                tailrec(l1.tail, l2.tail, ret);
            }
            else{
                tailrec(l1.tail, l2, ret :+ l1.head);//pierwsza tablica traci pierwszy element, ktory dodawany jest do koncowej
            }
        }

        else{
            if(ret.length == 0){
                tailrec(l1.tail, l2, ret :+ l1.head);
            }
            else if(ret.last == l1.head){//jesli sie powtarza to usuwam pierwszy element z tablicy w ktorej zostal znaleziony mniejszy element
                tailrec(l1.tail, l2, ret);
            }
            else{
                tailrec(l1.tail, l2, ret :+ l1.head);//pierwsza tablica traci pierwszy element, ktory dodawany jest do koncowej
            }
        }
}
    tailrec(l1, l2);
}


@main
def zad_04(args1: List[Int], args2: List[Int]): Unit = {
    println(tasuj(args1, args2))
}

Jednak caly czas wyswietla sie blad dotyczacy funkcji main o tresci:

No given instance of type scala.util.CommandLineParser.FromString[List[Int]] was found for parameter fs of method parseArgument in object CommandLineParser

Probowalem przyjmowac w main liste typu string i potem dzielic ja na dwie listy typu int, ale to wciaz nie pomagalo.

1 odpowiedź

0 głosów
odpowiedź 11 marca przez Wiciorny Ekspert (270,190 p.)

Z tegp co widze, błąd nie będzie związany z parsowaniem List[Int], do println(), tylko z użyciem @main 
Skorzystanie z  funkcji @main, która jest częścią pakietu scala.util.CommandLineParser

Funkcja służy do parsowania argumentów wiersza poleceń i uruchamiania funkcji main. Natomiast, w twoim przypadku, próbujesz użyć @main z argumentami typu List[Int],  a tak się nie bardzo da

 

def main(args: Array[String]): Unit = {
    val args1 = args(0).split(",").map(_.toInt).toList
    val args2 = args(1).split(",").map(_.toInt).toList
    println(tasuj(args1, args2))
}

zdefiniuj samodzielnie main i zrób coś takiego. Ręcznie po prostu , przekaż argumenty jako Array[String], a następnie podziel za pomoca splita  i mapuj na listy liczb za pomocą map(_.toInt)

Mówisz, że tak zrobiłeś jaki błąd wtedy masz? 
Bo ten wyraźnie wskazuje, że dalej mamy doczynienia z typen List[INT] podawanym jako argumenty :
 

scala.util.CommandLineParser.FromString[List[Int]] 

Co ważne pokaż mi komende w jaki sposób podajesz argumenty, bo być może autokonwersja idzie na typ INT 

komentarz 11 marca przez Arek04 Użytkownik (700 p.)

Powinien przekazac je z terminala w zapisie "<liczby oddzielone przecinkami, a miedzy tablicami spacja>"? Bo tak wlasnie robie i wyrzuca error:

Wczesniej moj kod wygladal w taki sposob (podawalem tablice string do main zdefiniowanego we wczesniejszy sposob z '@'):

komentarz 11 marca przez Wiciorny Ekspert (270,190 p.)

Wszystko jasne no źle podajesz argumenty, z tego co widze, podajesz jeden agument jako string... a masz podać dwie listy np. 
 

scala zad_04.scala "1,2,3" "4,5,6"

masz tutaj list "1,2,3"  i "4,5,6" u Ciebie z tego co dobrze widze jest wszystko w jednym stringu " liczby spacja liczby", ale to jest jeden agument w którym w stringu massz spacje 

W twojej wersji nie ma 2 agumentów, a podawany jeden argument zawiera spacje w środku, co powoduje, prawdopodobnie problem z konwersja, bo jest to czytane jako znak białej lini) .

jeden argument jako 

"2,4,2,5 spacja 3,2,2,3,1,5"

jest niepoprawny 

 

komentarz 11 marca przez Arek04 Użytkownik (700 p.)

Teraz podaje dwa stringi i wciaz jest blad. Jesli dobrze rozumiem to teraz sczytuje tylko pierwszy z nich:

komentarz 11 marca przez Wiciorny Ekspert (270,190 p.)

Terminal widze masz ustawiony tak aby czytal wszystkie znaki, w sensie, widze ze twoje IDE nie potrafi tego poprawnie sformatować, dlatego " cudzysłow traktuje jako element, spróbuj bez tego. 

 

2,4,2,5 3,2,2,3,1,5

spacje pomiędzy pozostaw, jeśli nie, to polecam sprawdzić z terminala linuxowego albo CMD, itp. bez zbędnego IDE 

I polecam również korzystać z debuggera, jesli już programujesz w środowisku. Wtedy na spokojnie samodzielnie zobaczysz, co przychodzi do programu jako ARGS[] 

komentarz 11 marca przez Arek04 Użytkownik (700 p.)
Dobra, odpalalem zlego maina, bo z niewiadomych przyczyn nie zapisal sie on jako [4] main, tylko jako "[1] Main4$package" i poszedl na sama gore mainow...

Teraz sie odpala tak samo z, jak i bez cudzyslowow. Problem tylko ze zle dziala. Program wypisuje po prostu pierwsza tablice, a drugiej w ogole nie zmienia, co jest totalnie bez sensu i watpie ze tak zle napisalem program, ale zawsze chociaz sie odpala...

Mam nadzieje ze to nie problem zlego odczytywania argumentow i ze nie bede na darmo szukal buga

Tak, czy inaczej - dzieki za pomoc :)

Podobne pytania

0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 24 października 2019 w Inne języki przez Szymon Grzeczkowicz Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 690 wizyt
pytanie zadane 7 marca 2019 w Inne języki przez Pivot Użytkownik (560 p.)
0 głosów
0 odpowiedzi 128 wizyt
pytanie zadane 29 stycznia 2017 w Inne języki przez BiednyStudent Początkujący (250 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...