Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[PowerShell] Warunek się nie wykonuje



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Inne języki skryptowe, przetwarzanie danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
PS
Gość





PostWysłany: Wto Mar 17, 2015 10:33 pm  OP    Temat postu: [PowerShell] Warunek się nie wykonuje Odpowiedz z cytatem Pisownia

Chciałbym napisać program szyfrujący szyfrem cezara.
Dlaczego ten od nie działa? [Warunek się chyba nie wykonuje]
oraz dostaje mnóstwo błędów:

Cytat:
Unable to index into an object of type System.Int32.
At C:\Users\\Desktop\Untitled1.ps1:13 char:48
+ if($plaintext[$x].CompareTo($alphabetL[ <<<< $d])){$ciphertext[$x] += $alphabet[[int]$d+[int]$shift]}
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
Powyższy cytat nie jest kodem, więc stosuj właściwe znaczniki do cytowania Zobacz: znaczniki formatujące - jak stosować. - Samolot

Proszę o jakąś podpowiedź.
Kod:
$alphabet = "abcdefghijklmn"
$ciphertext = ""
Write-Host "PROGRAM SZYFRUJACY SZYFREM CEZARA"
$plaintext = Read-Host "PODAJ TEKST DO ZASZYFROWANIA"
[int]$shift = Read-Host "PODAJ PRZESUNIECIE"
[int]$plaintextL = $plaintext.Length
[int]$alphabetL = $alphabet.Length

for([int]$x = 0; $x -le $plaintextL; $x++)
{
    for([int]$d = 0; $d -le $alphabetL; $d++)
    {
        if($plaintext[$x].CompareTo($alphabetL[$d])){$ciphertext[$x] += $alphabet[[int]$d+[int]$shift]}
        else {Write-Host "QWERTY"} # Warunek sie nie wykonuje ?
    }
}
Write-Host "WYNIK"$ciphertext $plaintext
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8316
Skąd: Toruń

PostWysłany: Wto Mar 17, 2015 11:00 pm      Temat postu: Odpowiedz z cytatem Pisownia

Strzelam, bo nie znam składu tego jezyka.
Zacytowany komunikat coś wspomina o tym, że w wierszu 13 nie udało się uzyskać indeksu typu Int32

Wyżej w kodzie masz wiersze 5,6,7:
Cytat:
[int]$shift = Read-Host "PODAJ PRZESUNIECIE"
[int]$plaintextL = $plaintext.Length
[int]$alphabetL = $alphabet.Length

Spróbuj może te dakaracje int pozamieniać na Int32 ?

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
PS
Gość





PostWysłany: Wto Mar 17, 2015 11:09 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Niestety nie pomogło.
Problem leży [tak mi się wydaje] w instrukcji warunkowej gdyż się nie wykonuje.

Szukam tak po sieci i piszą coś że rozwiązaniem tego błędu są tablice jednak nie wiem jak je zastosować w tym kodzie.
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8316
Skąd: Toruń

PostWysłany: Sro Mar 18, 2015 12:30 am      Temat postu: Odpowiedz z cytatem Pisownia

Piszesz, że warunek się nie wykonuje, a kod się w ogóle wykonuje do końca?

Bo jeśli masz komunikat o błędzie, to znaczy, że kod napotyka na błąd, kompilator wiec, jak sadzę, przerywa działanie programu. No to skąd możesz wiedzieć, że warunek się nie wykonuje, skoro wykonanie kodu zostaje przerwane?
Chyba, że ja Cię nie rozumiem, ale bardziej prawdopodobne jest, że nieprecyzyjnie tłumaczysz?

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Olo



Dołączył: 22 Sty 2010
Posty: 172

PostWysłany: Sob Kwi 04, 2015 11:55 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wiersz 13.
dla $shift > 0
$d+$shift > $alphabetL-1

Chyba się nie mylę?

_________________
2 × 2 = 3,999999999997
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
M'cin
Gość





PostWysłany: Sob Lut 06, 2016 3:50 pm      Temat postu: Odpowiedz z cytatem Pisownia

Sorki za drobny necroposting, ale przypadkiem tu trafiłem i chyba znam rozwiązanie problemu, a może autor jeszcze zajrzy albo komuś się przyda ta wiedza.
Autor kodu próbuje wywołać zmienną $alphabetL z indeksem $d. alphabetL jest zmienną typu int więc nie ma indeksów. Powinien się tutaj raczej odwołać do zmiennej $alphabet zawierającą litery. Kod błędu jest więc jak najbardziej poprawny, Ps nie wywoła zmiennej int z indeksem.

Kod i tak nie będzie poprawny, bo jeśli damy literę, której indeks po zwiększeniu o dany shift będzie większy niż największy indeks to wyskoczy błąd. Do tego rację ma Olo, bo Powershell indeksuje od zera, więc odwołujemy się do $alphabetL-1.

Autor też niepotrzebnie twardo deklaruje zmienne w tylu miejscach, PS jest idiotoodporny i sam bardzo ładnie nadaje typy zmiennym.

Pozdrawiam.
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8316
Skąd: Toruń

PostWysłany: Sob Lut 06, 2016 8:06 pm      Temat postu: Odpowiedz z cytatem Pisownia

Może i kompilator "sam bardzo ładnie nadaje typy zmiennym" , ale podstępnie. Niebezpieczne jest to dla kogoś, kto zaczyna dopiero poznawać programowanie i nie zdaje sobie sprawy z tego, co kompilator robi "pod podszewką" jego programu. To prowadzi do niezrozumienia działania kodu i trudności ze znalezieniem błędów. Także jawne deklarowanie zmiennych jest jak najbardziej wskazane.
_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Inne języki skryptowe, przetwarzanie danych Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.15390 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |