sziasztok,
van egy működő példa, amit nem értek.
Próbáltam volna debuggerrel követni a változókat, az szokott segíteni felfogni a kódot, de most "Szegmentálási hiba"-val elszáll a padre debuggere.
Már a 3. sorral gondjaim vannak :)
Továbblépni nem szeretnék, amíg ezt meg nem értem.
Minden segítő szándékot előre köszönök!
- 1339 megtekintés
Hozzászólások
Perl sigsegv??? Látatlanba perl bug/hibás telepítés lenne a tippem. Vagy annyira rég volt, ogy rosszul emlékszem a működésére. (a debugger elszállás már belefér)
- A hozzászóláshoz be kell jelentkezni
Nagyon túlbonyolítva (mintha a nyelv lehetséges poénjait akarná felvonultatni) megvalósítja a halmazok metszetét (intersection, innen az inter szubrutinnév).
A @one és @two rendezett listák közös elemeit adja vissza.
- A hozzászóláshoz be kell jelentkezni
Na jó, de azt a szegmentálási hibát hogy sikerülhetett?
- A hozzászóláshoz be kell jelentkezni
Tényleg valami telepítési gond lehet, ha ez nem fut le, ui. nincs benne semmi nemstandard.
- A hozzászóláshoz be kell jelentkezni
Storno, figyelmetlen voltam/félig vak vagyok: a debugger szállt el.
- A hozzászóláshoz be kell jelentkezni
Detto.
Viszont a debugger se hajlandó belehalni, se n-nel, se s-sel végigkövetve.
- A hozzászóláshoz be kell jelentkezni
Valószínűleg én fogalmaztam pontatlanul, tudom, hogy mit csinál a szubrutin, csináltam már metszetet más nyelvben, csak ennek a működése nem volt tiszta.
Szeretem nézni, hogy más hogyan oldja meg a feladatot, abból sokat lehet tanulni, de ez a pár sor a fejlődésemben többet ártott, mint használt :)
Amióta a padre-ra rászoktam, nem debuggoltam parancssorban, ez egy újabb hibapont nekem :)
Egy hétvégi hobbyprogramozó ne legyen lusta :)
- A hozzászóláshoz be kell jelentkezni
Aki azt a harmadik sort leírta, az valószínűleg más aljasságra is képes.
my @first = splice(@_,0,shift);
Ezzel az a probléma, hogy a shift a @_ tömb első elemét eltávolítja és azt adja vissza értékül. Normál függvényhívás esetén a @_ az argumentum listában már kiértékelésre kerülne a shift hívás végrehajtásának idejére és az argumentum listába belekerülne a később a shift által eltávolítandó első elem is, amit itt az első tömb hossza lenne.
Azonban a splice nem normál függvényhívás, hanem C kódban megvalósított beépített függvény. Ő valójában nem @_ elemeit kapja meg az első paraméterben, hanem a @_ tömbre való belső (C kódbeli) hivatkozást. Emiatt viszont a harmadik paraméterben levő shift hívás a splice lefutása elött már eltávolítja az első elemet, megváltoztatva a @_ változót, így a splice valóban csak első tömb elemeit távolítja el a @_ listából és adja vissza őket.
Általánosságban is kifejezetten rossz ötlet az argumentum listában változó értékét módosítani, külön nagyon rossz ötlet a argumentum listában egyébként másik paraméter pozícióban is használt változó értékét módosítani, de a normál függvény és a beépített függvény paraméter átadása közötti különbség miatt hatványozottan félrevezető és a lehető legrosszabb fenti példa.
- A hozzászóláshoz be kell jelentkezni
És valószínűleg a debuggert is az téveszti meg hogy az egyik paraméter a hívás során megváltozik, és ezt nem jó kezeli.
- A hozzászóláshoz be kell jelentkezni
Hálás köszönet a részletes magyarázatért, éppen erre voltam kíváncsi.
és ezt nem jó kezeli
Ezt (a padre beépített debuggerére nézve) inkább jó vagy rossz tulajdonságnak szántad?
Azaz jó, ha egy debugger elszáll egy nyelvtanilag ugyan helyes, de egyébként messziről kerülendő szerkezettől?
szerk.: ..mert számomra ez a debugger fejlett intelligenciájára utal :)
- A hozzászóláshoz be kell jelentkezni
Valóban nem szerencsés ez a trükközés, főleg, hogy két tömb metszetének az előállításra a perlfaq4 tartalmazza a kanonikus megoldást.
Jó lenne tudni, hogy a kérdező melyik perl verzióval tapasztalta a segfault, lehet, hogy talált egy bugot az interpreterben (amit lehet, hogy azóta már javítottak is). A p5p levlistán "stack is not refcounted" kulcsszóval időnként előkerülnek hasonló hibák.
- A hozzászóláshoz be kell jelentkezni
A perl verzió v5.24.1.
A parancssoros debugger nem okoz hibát. Ott már látok mindent, ami segít eligazodni.
A padre debuggere, aminek a verziója 1.01 :) száll el.
- A hozzászóláshoz be kell jelentkezni