Kotlin programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


-v-
(addikt)

+1 :K


csendes
(őstag)
Blog

Sziasztok, elég kihalt itt, de talán olvassa valaki. Kezdő tanfolyam vizsgafeladatnál akadtam el a függvényeknek történő paraméterátadás rejtélyeinél. A példa egy vizsgafeladatból lett kimazsolázva, önmagában nincs értelme, csak szemléltetésképpen készült. [Kotlin Playground]-on lett futtatva, a vizsga is hasonló környezetben volt. Utólag sikerült az eredeti feladatot másképp megoldani, de nem értem, hogy miért módosulnak az értékként a függvény hívásakor átadott paraméterek. :F
Kód:
/*
* You can edit, run, and share this code.
* play.kotlinlang.org
*/
import java.util.Arrays

fun mySubFunction(entry: Int):Int {
var newentry=entry
newentry+=10
return newentry
}

fun myMainFunction(anyArray: Array<Int>):Int {
val constArray=anyArray
println("This is the original constArray in myMainFunction: ${Arrays.toString(constArray)}")
var newArray=constArray
val n=newArray.count()-1
for (i in 0..n){
newArray[i]=mySubFunction(newArray[i])
}
println("This is the new anyArray in myMainFunction: ${Arrays.toString(anyArray)}") // Why is it modified?
println("This is the new constArray in myMainFunction: ${Arrays.toString(constArray)}") // How can a const Array change?
println("This is newArray in myMainFunction: ${Arrays.toString(newArray)}") // This is OK
var k=1
return k
}

fun main() {
var myArray=arrayOf<Int>(1,2,3,4,5)
var counter: Int
counter=myMainFunction(myArray)
println("This is the new myArray in Main: ${Arrays.toString(myArray)}") // How can this change, the function has only returned an integer?
}

Eredmény/output:
This is the original constArray in myMainFunction: [1, 2, 3, 4, 5]
This is the new anyArray in myMainFunction: [11, 12, 13, 14, 15]
This is the new constArray in myMainFunction: [11, 12, 13, 14, 15]
This is newArray in myMainFunction: [11, 12, 13, 14, 15]
This is the new myArray in Main: [11, 12, 13, 14, 15]


LioshDev
(friss újonc)

Látom hogy régi hozzászólás, de most ismerkedek a nyelvvel és kíváncsi voltam a megoldásra.

var newArray=constArray
helyett
var newArray=constArray.clone()

Gondolom az eredeti verzióban csak a tömb címe másolódik, nem a tartalma új tömbként


csendes
(őstag)
Blog

Köszönöm :R. Azért érdekes ez, mert a val constArray=anyArray (vagyis nem változó, hanem konstans) alapján az értéke nem változhatna, de constArray valójában egy pointer, ami a tömb első elemére mutat.

[ Szerkesztve ]


Reno7
(senior tag)

Sziasztok
Most ismerkedek a nyelvvel mint hobbista, és nem értem hogy miért nem tudok listOf meg arrayOf -ban lévő számokkal műveleteket végezni, a neten talált magyarázatokkal sem lettem okosabb sajna. Pythonnal kezdem programozni és ott nem futottam bele ilyen gondba.

fun main(){
    val adat = arrayOf(
    arrayOf("a", "b", "c"),
    arrayOf(1, 5, 6),
    arrayOf(9, 4, 3)
)

    val osszeg =adat[2][0] / adat[1][1]

    println(osszeg)
}

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline operator fun BigDecimal.div(other: BigDecimal): BigDecimal defined in kotlin
public inline operator fun BigInteger.div(other: BigInteger): BigInteger defined in kotlin

[ Szerkesztve ]


csendes
(őstag)
Blog

A Kotlin a Javahoz közeli programozási nyelv, statically typed, szemben a Pythonnal, ami dynamically typed.
Próbáld futtatni az alábbi kódot szemléltetésként, itt is eléred [link]:
import java.math.BigDecimal
import java.math.BigInteger

fun main(){
var adat = arrayOf(
arrayOf("a", "b", "c"),
arrayOf(1, 5, 6),
arrayOf(9, 4, 3)
)
println(adat::class.simpleName);
println(adat[2][0]::class.simpleName);
println(adat[1][1]::class.simpleName);
val osszeg = BigDecimal(adat[2][0].toString())/BigDecimal(adat[1][1].toString());
println("%.1f".format(osszeg));
println(osszeg::class.simpleName);
val osszeg1 = BigDecimal(adat[2][0].toString().toDouble().toString())/BigDecimal(adat[1][1].toString());
println(osszeg1);
println(osszeg1::class.simpleName);
val osszeg2 = BigInteger(adat[2][0].toString())/BigInteger(adat[1][1].toString());
println(osszeg2);
println(osszeg2::class.simpleName);
val osszeg3 = BigDecimal(9.toDouble()/5);
println(osszeg3);
val osszeg4 = 9/5;
println(osszeg4);
}

Ha jól másoltam be, akkor az eredmény:
Array
Int
Int
2.0
BigDecimal
1.8
BigDecimal
1
BigInteger
1.8000000000000000444089209850062616169452667236328125
1

[ Szerkesztve ]


Reno7
(senior tag)

Így már sikerült működésre bírni :R
De nem értem hogy miért is kell stringgé alakítanom, mikor eleve számként szerepel a tömbben? Se nem integerként nem értelmezi, és a toDouble-t sem tudom használni...

üzenetek