Проблема с возвратом в C # - PullRequest
       1

Проблема с возвратом в C #

0 голосов
/ 20 декабря 2010

Из-за того, что я задал мой последний вопрос , я изменил свой код, чтобы использовать return. У меня всегда есть эта проблема с return: я знаю, что должен использовать return (где я комментирую в коде ниже), но я не знаю, как мне определить, чтобы он работал? Спасибо за вашу помощь.

public double bigzarb(int u, int v)
{
    double n;
    int x=0;
    int y;
    int w=0;
    int z;
    string[] i = textBox7.Text.Split(',');
    int[] nums = new int[i.Length];
    for (int counter = 0; counter < i.Length; counter++)
    {
        nums[counter] = Convert.ToInt32(i[counter]);
    }

    u = nums[0];
    double firstdigits =Math.Floor(Math.Log10(u) + 1);
    v = nums[1];
    double seconddigits = Math.Floor(Math.Log10(v) + 1);
    if (firstdigits >= seconddigits)
    {
        n = firstdigits;
    }
    else
    {
        n = seconddigits;
    }
    if (u == 0 || v == 0)
    {
        MessageBox.Show("the Multiply is 0");
    }
    string threshold = textBox9.Text;
    int intthreshold = Convert.ToInt32(threshold);
    int intn = Convert.ToInt32(n);
    if (intn <= intthreshold)
    {
        double uv = u * v;
        string struv = uv.ToString();
        MessageBox.Show(struv);
        ///i know here should be a return but i dont know how to define it to work
    }
    else
    {
        int m = Convert.ToInt32(Math.Floor(n / 2));

        x = u % 10 ^ m;
        y = u / 10 ^ m;
        w = v % 10 ^ m;
        z = v / 10 ^ m;

        return  bigzarb(x, w) *Math.Pow(10,m) +(bigzarb(x,w)+bigzarb(w,y))*Math.Pow(10,m) +bigzarb(y,z);
    }
}

Ответы [ 7 ]

2 голосов
/ 20 декабря 2010

arash, ваша проблема не с этим возвратом, ваша проблема bigzarb() объявлена ​​как void, что означает, что она не имеет возвращаемого значения, но вы используете ее в своей последней строке как bigzarb(x,w) * ...., что приведет к ошибке.Кроме того, поскольку вы объявили свой bigzarb () как void, вы не можете вернуть значение в нем.Также ^ не означает силу в .net, вместо этого вы должны использовать Math.Power.

Редактировать: вам следует изменить свой метод с void bigzarb() на double bigzarb() и заменить ^ на Math.Power и повторить попыткучтобы увидеть, работает ли yit.

Последнее редактирование: измените тип возвращаемого вами метода на double с int и измените последнюю строку на:

return bigzarb(x, w) * Math.Pow(Convert.ToDouble(10), Convert.ToDouble(m)) + (bigzarb(x, w) + bigzarb(w, y)) * Math.Pow(Convert.ToDouble(10), Convert.ToDouble(m)) + bigzarb(y, z);
1 голос
/ 20 декабря 2010

У вас есть только один возврат, и это рекурсивный вызов (вызывающий сам себя) -> переполнение стека! Вам нужно другое возвращение куда-нибудь без рекурсивного вызова

1 голос
/ 20 декабря 2010

Мой вам совет - структурировать ваш код, извлечь часть кода для разделения функций со значимыми именами, а также переименовать ваши переменные в некоторые значащие.Это облегчит чтение, понимание, и вы получите лучший «поток» в вашем коде.Кроме того, вы должны дополнить свой текст актуальным вопросом.Попробуйте вставить дополнительный оператор возврата в блок кода if, вполне нормально иметь несколько операторов возврата.

if(logic check)
{
     return something;
}
else
{
     return something else;
}

Вы должны иметь возврат либо в обоих операторах, либо один возврат после блока if-elseв противном случае вы получите сообщение об ошибке компилятора о том, что не все пути кода возвращают результат или что-то подобное.

1 голос
/ 20 декабря 2010
    public int bigzarb(int u, int v)
    {
        double n;
        int x = 0;
        int y;
        int w = 0;
        int z;
        string[] i = textBox1.Text.Split(',');
        int[] nums = new int[i.Length];
        for (int counter = 0; counter < i.Length; counter++)
        {
            nums[counter] = Convert.ToInt32(i[counter]);
        }

        u = nums[0];
        double firstdigits = Math.Floor(Math.Log10(u) + 1);
        v = nums[1];
        double seconddigits = Math.Floor(Math.Log10(v) + 1);
        if (firstdigits >= seconddigits)
        {
            n = firstdigits;

        }
        else
        {
            n = seconddigits;

        }
        if (u == 0 || v == 0)
        {
            MessageBox.Show("the Multiply is 0");
        }
        //string threshold = textBox9.Text;
        int intthreshold = Convert.ToInt32(textBox9.Text);//Edited by me
        int intn = Convert.ToInt32(n);
        if (intn <= intthreshold)
        {

            double uv = u * v;
            string struv = uv.ToString();
            MessageBox.Show(struv);
            ///i know i should use return here but how can i implement that to work?
        }
        else
        {
            int m = Convert.ToInt32(Math.Floor(n / 2));

            x = u % 10 ^ m;
            y = u / 10 ^ m;
            w = v % 10 ^ m;
            z = v / 10 ^ m;

            return bigzarb(x, w) * (10 ^ m) + (bigzarb(x, w) + bigzarb(w, y)) * 10 ^ m + bigzarb(y, z);
        }
        return 0;
        }
1 голос
/ 20 декабря 2010

Если ваш метод определен как «return void», вы не можете вернуть какое-либо значение. Поэтому замените это "void" на "int" или "double", независимо от того, какой тип значения вы хотите вернуть.

Следующий вопрос: какую ценность вы хотите вернуть в этом месте? Верни это.

Кстати: если вы действительно не хотите возвращать значение (когда-либо!), Тогда это «void» является правильным, и вы должны использовать только «return» без значения (или позволить методу работать до последней строки метод).

0 голосов
/ 20 декабря 2010

Объявите целочисленную переменную для возврата значений Пример:

 public int func()
{
 int l_nData  = 0;

if(condition)
{
  l_nData = 1;
  return l_nData;
}
else
{
  l_nData = 2;
  return l_nData;
 }
 return l_nData;

}

0 голосов
/ 20 декабря 2010

Это сбивает с толку. Поскольку ваша функция содержит Void в качестве типа возврата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...