Latwy program statki, co jest nie tak? Host z kontraktem i aplikacja ktora sie laczy.

0

Witam, zrobilem program server z kontraktem i aplikacje ktora sie z nim laczy, ale program nie dziala mimo braku bledow. Wszystko zacina sie na foreach. (Wiem ze moglem uzyc arraylisty, ale program powinien dzialac.)

Kontrakt

public class SerwisStatki : ZniszczInnych
{


private int[] polaPolozenia;
private int iloscTrafien = 0;
Boolean czyIstnieje = true;
int iloscRuchow = 0;

public void setPolaPolozenia(int[] polozenia)
{
polaPolozenia = polozenia;

}

public String sprawdz(String stringPole)
{
Console.WriteLine(stringPole);
iloscRuchow++;
int strzal = Int32.Parse(stringPole);
Console.WriteLine("jacek");
String wynik = "pudlo";
Console.WriteLine("jacek"); // tego jacka jeszcze drukuje
foreach (int pole in polaPolozenia) // tu sie program zacina z tego co mi sie wydaje.
{
if (strzal == pole)
{
wynik = "trafiony";
iloscTrafien++;
break;
}
}

Console.WriteLine("jacekasd");
if (iloscTrafien == polaPolozenia.Length)
{
wynik = "zatopiony";
czyIstnieje = false;
}
Console.WriteLine(wynik);
return wynik;


}
public void start()
{

while (czyIstnieje == true)
{


// Console.WriteLine(iloscRuchow + "ruchow");
}
}
}

Host

class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:3000/SerwisStatki");
ServiceHost mojHost = new ServiceHost(typeof(SerwisStatki), baseAddress);
try
{
mojHost.AddServiceEndpoint(typeof(ZniszczInnych), new WSHttpBinding(), "GraWStatki");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
mojHost.Description.Behaviors.Add(smb);

mojHost.Open();
Console.WriteLine("Serwis jest uruchomiony.");
Console.WriteLine("Nacisnij <Enter> aby zakonczyc.");
Console.WriteLine();


ZniszczInnych gra = new SerwisStatki();
//PomocnikGry pomocnik = new PomocnikGry();
Random liczbaLosowa = new Random();
int card = liczbaLosowa.Next(8);

int[] polozenie = {card, card+1, card+2};
gra.setPolaPolozenia(polozenie);
gra.start();
Console.ReadLine();
mojHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("Wystapil wyjatek: {0}", ce.Message);
mojHost.Abort();
}
}
}






**Aplikacja ktora laczy sie z Hostem**



class Program
{
static void Main(string[] args)
{
//Krok 1: Utworzenie instancji WCF proxy.

ZniszczInnychClient client = new ZniszczInnychClient();
Boolean czyIstnieje = true;
Console.WriteLine("Podaj liczbe od 1 do 7 aby wykonac strzal.");
while (czyIstnieje == true)
{
kostka();
string stringPole = Console.ReadLine();
string result = client.sprawdz(stringPole);
Console.WriteLine(result);
if (result == "zatopiony")
{
czyIstnieje = false;
}
}




// Krok 3: Zamknięcie klienta zamyka polaczenie i czysci zasoby

client.Close();
}
public static void kostka()
{
Random szczesliwyRzut = new Random();
int rzut = szczesliwyRzut.Next(8);
Console.WriteLine("Jezeli nie wiesz jakie pole wybrac nasza magiczna kostka proponuje pole " + rzut);
}
} 

Aplikacja laczy sie z hostem, w zalaczniku podalem wrzut z konsoli servera i aplikacji.

0

Użyj debugera (Debugowanie) i samodzielnie namierz swój błąd.

0

Blad sie robi przy for each ale wydaje mi sie ze dobrze uzylem tej petli

foreach (int pole in polaPolozenia) // o tu sie program zacina tylko nie mam pojecia co jest zle
{
if (strzal == pole)
{
wynik = "trafiony";
iloscTrafien++;
break;
1

Widzę, że masz problem z czytaniem ze zrozumieniem, więc powtórzę. Po pierwsze sformatuj kod tak, żeby był czytelny (chodzi o wcięcia), po czym wklej go tutaj jeszcze raz. Po drugie - użyj debugera: ustaw sobie breakpoint (F9) tuż przed podejrzanym miejscem, uruchom program w trybie debugowania (F5), a jak program zatrzyma się na breakpoincie to linijka po linijce (F11 i/lub F10) zobacz (myszka/locals) co się dzieje.

0

Widze ze nie zadales sobie trudu zeby spojrzec na program, znam zasade jak jest blad to uzyj debugowania.
Nie moge kodu sformatowac bo jestem niezarejestrowany.
Blad jest w metodzie w kontrakcie, do ktorego dane sa przekazywane z aplikacji laczacej sie z hostem a w hoscie jest tworzony statek wiec debugowanie nie pomaga.

0

ŁF pisał żebyś w nowym poście wkleił sformatowany kod.

Program raczej nie zacina się na foreach bo niemożliwym jest zrobienie na nim pętli nieskończonej. Może wypisz coś ze środka pętli? Co się dzieje jak debugger przejdzie do środka pętli?

0
public class SerwisStatki : ZniszczInnych
    {

        // ZniszczInnych[] polaPolozenia;
        // polaPolozenia = new ZniszczInnych[7];
        private int[] polaPolozenia;
        private int iloscTrafien = 0;
        Boolean czyIstnieje = true;
        int iloscRuchow = 0;
        
        public void setPolaPolozenia(int[] polozenia)
        {
            polaPolozenia = polozenia;

        }

        public String sprawdz(String stringPole)
        {
            Console.WriteLine(stringPole);
            iloscRuchow++;
            int strzal = Int32.Parse(stringPole);
            Console.WriteLine("jacek");
            String wynik = "pudlo";
            Console.WriteLine("jacek");
            foreach (int pole in polaPolozenia)
            {
                if (strzal == pole)
                {
                    wynik = "trafiony";
                    iloscTrafien++;
                    break;
                }
            }
            
            Console.WriteLine("jacekasd");
            if (iloscTrafien == polaPolozenia.Length)
            {
                wynik = "zatopiony";
                czyIstnieje = false;
            }
            Console.WriteLine(wynik);
            return wynik;


        }
        public void start()
        {

            while (czyIstnieje == true)
            {
          
                
                   // Console.WriteLine(iloscRuchow + "ruchow");
                }
            }
        }








class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:3000/SerwisStatki");
            ServiceHost mojHost = new ServiceHost(typeof(SerwisStatki), baseAddress);
            try
            {
                mojHost.AddServiceEndpoint(typeof(ZniszczInnych), new WSHttpBinding(), "GraWStatki");
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                mojHost.Description.Behaviors.Add(smb);

                mojHost.Open();
                Console.WriteLine("Serwis jest uruchomiony.");
                Console.WriteLine("Nacisnij <Enter> aby zakonczyc.");
                Console.WriteLine();
                
                
		        ZniszczInnych gra = new SerwisStatki();
		        //PomocnikGry pomocnik = new PomocnikGry();
             Random liczbaLosowa = new Random();
              int card = liczbaLosowa.Next(8);
	          
		     int[] polozenie = {card, card+1, card+2};
		        gra.setPolaPolozenia(polozenie);
                  gra.start();
                  Console.ReadLine();
                 mojHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("Wystapil wyjatek: {0}", ce.Message);
                mojHost.Abort();
            }
        }
    }


 class Program
    {
        static void Main(string[] args)
        {
            //Krok 1: Utworzenie instancji WCF proxy.

            ZniszczInnychClient client = new ZniszczInnychClient();
            Boolean czyIstnieje = true;
            Console.WriteLine("Podaj liczbe od 1 do 7 aby wykonac strzal.");
            while (czyIstnieje == true)
            {
                kostka();
                string stringPole = Console.ReadLine();
                string result = client.sprawdz(stringPole);
                Console.WriteLine(result);
                if (result == "zatopiony")
                {
                    czyIstnieje = false;
                }
            }




            // Krok 3: Zamknięcie klienta zamyka polaczenie i czysci zasoby

            client.Close();
        }
        public static void kostka()
        {
            Random szczesliwyRzut = new Random();
            int rzut = szczesliwyRzut.Next(8);
            Console.WriteLine("Jezeli nie wiesz jakie pole wybrac nasza magiczna kostka proponuje pole " + rzut);
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1