Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Зацикливание в вызове функции

Совсем недавно начала изучать язык С# и столкнулась с такой проблемой:
когда вызываю функцию, она работает правильно, находит нужный мне элемент, но почему-то вызывается еще раз и в итоге данные обнуляются т.е. доходя до оператора return функция не заканчивает свою работу.

Код момента вызова функции поиска (SearchElement):
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void button3_Click(object sender, EventArgs e)
        {
            Form1 newForm1 = this.Owner as Form1;
            if (newForm1.perem.Root == null)
            {
                MessageBox.Show("Данных в базе нет");
            }
            else
            {
                Справочник_Автоинспектора.Form1.Node<int> elem;
                elem = null;
                elem=newForm1.perem.SearchElement(newForm1.perem.Root , Convert.ToInt32(maskedTextBox2.Text));
                if (elem != null)
                {
                    maskedTextBox4.Text = Convert.ToString(elem.power);
                    maskedTextBox3.Text = Convert.ToString(elem.year);
                    maskedTextBox5.Text = Convert.ToString(elem.mileage);
                    maskedTextBox1.Text = Convert.ToString(elem.date);
                    comboBox1.Text = Convert.ToString(elem.brand);
                }
            }
        }
Функция поиска:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public Node<T> SearchElement(Node<T> CurrentElem, int iscom)
            {
                Node<T> vozvrat=null;
                if (CurrentElem==null)
                {
                    MessageBox.Show("Элемента не существует в базе!");
                    vozvrat = null;
                }
 
                else if (Convert.ToInt32(CurrentElem.number) == iscom)
                {
                    vozvrat = CurrentElem;
                }
                else if (Convert.ToInt32(CurrentElem.number) < iscom)
                {
                    SearchElement(CurrentElem.left, iscom);
                }
                else if (Convert.ToInt32(CurrentElem.number) > iscom)
                {
                    SearchElement(CurrentElem.right, iscom);
                }
                return (vozvrat);
            }
Ответ: Vikos,
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public Node<T> SearchElement(Node<T> CurrentElem, int iscom)
        {
            if (CurrentElem == null)
                return null;
            
            if (Convert.ToInt32(CurrentElem.number) == iscom)
                return CurrentElem;
            
            if (Convert.ToInt32(CurrentElem.number) < iscom)
                return SearchElement(CurrentElem.left, iscom);
            else
                return SearchElement(CurrentElem.right, iscom);
        }
Вопрос: if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }

Какой вариант предпочтительней

if(A) 
{ 
  return; 
} 
DoSmth(); 


или

if(!A) 
{
  DoSmth(); 
}


вообще наличие нескольких точек выхода из функции считается плохим стилем?
Ответ:
mayton
А я - нет.

Это назвается overengineering. Когда делаешь то что не требуется за счет усложнения архитектуры.

В данном случае по условию задачи сама функция выводит сообщение (а не что-то вне ее), а усложение это переход на джаву )))
Вопрос: MYSQL и BOOLEAN

Есть у меня одна програмка, работает с базой данных Acсess. Дошёл до момента перевода этого софта на удалённую базу на сервере MySQL. Наткнулся на одну нерешимую для меня задачу, дабы софт полностью не переписывать, а именно на то, что в MySQL тип столбца почему-то становится tinyint(1) вместо boolean

Может кто знает решение как адаптировать BOOLEAN в программе и TINYINT(1) в базе, чтобы много кода не менять?
delphi xe5
adoconection
adotable
Ответ:
Решил проблему с помощью двух функций, и перехода в базе от BOOLEAN к INTEGER
    function BtoI(b:boolean):integer;
    begin
      if b=true then result:=1 else result:=0;
    end;
     
    function ItoB(i:integer):boolean;
    begin
      if i=1 then result:=true else result:=false;
    end;

В базе заменил на тип столбца INTEGER и в программе обработал всё через эти две функции
Вопрос: Как по быстрому представить Integer в виде множества Boolean

Тут я спрашивал "Как представить множество boolean в виде Integer" (
Собстно, помогли и вот сделал:
        function BoolsToInt(b: array of boolean): Integer;
        var I, c: Integer;    
        begin
          c := 0;
          Result := 0;
            for I := 0 to High(b) do
            begin
              if c = 0 then c := 1 else
              if c = 1 then c := 2 else c := c*2;
              if b[i] then
               Result := Result + c;
            end;
        end;


Теперь вопрос а как сделать обратно и чтоб было быстро ?
типа
    procedure IntToBools(var b: array of boolean; const Val: Integer);


Мне приходит в голову только перебор всех вариантов комбинаций множества boolean по функции BoolsToInt до тех пор пока результат не будет равен Val,
но уверен что это не самое изящное решение.
Ответ:
MBo
Яж пока учусь, мне как маленькому объяснять лучше.

leo
Ну, опять вы выручили, большой вам THX! :good:

Цитата leo @
И для чего, спрашивается, if else внутри цикла?

Это да, тупанул я с пробуждения от сна, померещелось что (2 * 1) = 1 :facepalm:
Вопрос: Error:(42, 5) java: missing return statement

есть вот такая функция почему выдает ошибку?
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
static boolean allDigitsUnique(int x) {
        assert (x < 1000);
        assert (x > 100);
        int[] mas = new int[3];
        String str = Integer.toString(x);
        for (int i = 0; i < 3; i++) {
            mas[i] = str.charAt(i);
        }
        if (mas[0] == mas[1] || mas[0] == mas[2] || mas[1] == mas[2])
        return false;
    }
Ответ: функция не void. в данном случае она boolean. то есть при любом раскладе она должна вернуть значение true или false.
в вашем случае при условии
Java(TM) 2 Platform Standard Edition 5.0
1
if (mas[0] == mas[1] || mas[0] == mas[2] || mas[1] == mas[2])
она вернёт true, но как быть если условие не выполниться? что она тогда должна вернуть. думаю что false.
то есть, вы в самом конце можете написать просто
Java(TM) 2 Platform Standard Edition 5.0
1
return false;
Или просто удалить ваш if и написать так
Java(TM) 2 Platform Standard Edition 5.0
1
return mas[0] == mas[1] || mas[0] == mas[2] || mas[1] == mas[2];
Вопрос: Boolean=-1?

Доброго времени суток, возникла такая ситуация: Записываю в ini файл значения, проверяю файл все в норме, начинаю считывать значения с помощью команды ReadBool, затем произвожу сравнение ничего не происходит. Решил посмотреть, что происходит внутри с помощью команды ShowMessage, показало, что там где значения принимают 1 считывается -1. Привожу кусок кода и очень прошу помочь мне с этим вопросом.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm3.Button2Click(Sender: TObject);
var
i:integer;
st:string;
bool:boolean;
begin
 nametown:=ListBox2.Items[ListBox2.ItemIndex];
 Ini:=TiniFile.Create(GetCurrentDir+'/config/country and town/'+namecountry+'/'+nameregion+'/'+nametown+'.ini');
 ini.ReadSection('factory',Listbox11.Items);
  for I := 1 to ListBox11.Items.Count-1 do
   begin
    st:=ListBox11.Items[i];
    ini.ReadBool('factory',st,bool);
    ShowMessage(booltostr(ini.ReadBool('factory',st,bool)));
    if bool=true then
     begin
       ShowMessage(st);//Изначально здесь была запись в другой ListBox
     end;
   end;
   Ini.Free
end;
Ответ: Cпасибо c BoolToStr разобрался, но тем не менее вопрос остался, почему , считывая командой ReadBool, ни одна переменная не принимает значения true, если изначально они были записаны в файл с помощью команды WriteBool?
Delphi
1
2
3
4
 if bool=true then
     begin
       ShowMessage(st);//Изначально здесь была запись в другой ListBox
     end;
Добавлено через 4 минуты
Записываю с помощью WriteBool. Попробовал записывать и считывать как вы сказали, ошибка undeclared identifier, гугл не помог, в чем может быть проблема?

Добавлено через 24 минуты
Сообщение от DenNik
попробуй функцию
Delphi
1
Format('%s/config/country and town/%s/%s/%s.ini',[GetCurrentDir,namecountry,nameregion,nametown])
вообще, полезная функция. разберись с ней, понравится
Спасибо, действительно очень полезная функция
Вопрос: Тип boolean

Объясните пожалуйста, будет ли это работать boolean b = x>=10 && x<100; ?
Если будет, то какой результат?
И если можно, простейший пример программы с использованием этого выражения.
Ответ:
Сообщение от focusherad
простейший пример программы
Java
1
2
3
4
5
6
7
8
9
10
    public static void main(String[] args) {
        for (int i = 0; i < 15; i++) {
            int x = (int) (Math.random() * 200);
            System.out.printf("При Х =%4d условие Х >= 10 и Х < 100 %s%n", x, (analysis(x)? "верно" : "не верно"));
        }
    }
 
    public static boolean analysis(int n) {
        return n >= 10 && n < 100;
    }
можно ожидать приблизительно такой вывод в консоль:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
При Х = 169 условие Х >= 10 и Х < 100 не верно
При Х = 179 условие Х >= 10 и Х < 100 не верно
При Х = 149 условие Х >= 10 и Х < 100 не верно
При Х =  89 условие Х >= 10 и Х < 100 верно
При Х =  95 условие Х >= 10 и Х < 100 верно
При Х = 124 условие Х >= 10 и Х < 100 не верно
При Х =  80 условие Х >= 10 и Х < 100 верно
При Х =  21 условие Х >= 10 и Х < 100 верно
При Х = 106 условие Х >= 10 и Х < 100 не верно
При Х = 168 условие Х >= 10 и Х < 100 не верно
При Х =  96 условие Х >= 10 и Х < 100 верно
При Х = 124 условие Х >= 10 и Х < 100 не верно
При Х = 112 условие Х >= 10 и Х < 100 не верно
При Х = 154 условие Х >= 10 и Х < 100 не верно
При Х =  43 условие Х >= 10 и Х < 100 верно
Вопрос: Эксперимент с return

Из книжки Кернигана и Ритчи:
Глава 1. Функции.
Функция не обязательно возвращает какое-нибудь значение. Инструкция return без выражения только передает управление в ту программу, которая ее вызвала, не передавая ей никакого результирующего значения. То же самое происходит, если в процессе вычислений мы выходим на конец функции, обозначенный в тексте последней закрывающей фигурной скобкой. Возможна ситуация, когда вызывающая функция игнорирует возвращаемый ей результат.
Под
Инструкция return без выражения только передает управление...
Авторы имели в виду отсутствие значения оператора return (например, return; ) или отсутствие самого оператора return? Потому что современный компилятор gcc выдает ошибку, если не задать return при указании возвращаемого значения в функции.

Если же не писать return в функции с возвращаемым значением, компилятор не выводит даже предупреждения об этом, но возвращает значение последней инструкции в теле функции, то есть подставляет к ней return.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int test ( int, int );
 
int main ( void ) {
    int m = 3, n = 5;
    printf ( "value until: %3d %3d\n", m, n );
    printf ( "value after: %3d\n", test ( m, n ) );
    return 0;
}
 
int test ( int m, int n ) {
    int i = 13, j = 17;
    n = 33;
    ++m;
}
Вывод:
value until: 3 5
value after: 4
Но если компилятор подставляет return к последней инструкции, то почему при
C
1
2
3
4
5
6
int test ( int m, int n ) {
    int i = 13, j = 17;
    n = 33;
    ++m;
    printf ( "Finish" );
}
возвращается 1, а не количество отображенных символов?
Ответ:
Сообщение от HighPredator
Всегда ли это jmp к метке на выходе из подпрограммы?
Необязательно. Ветвление может быть сделано где-то раньше и точек выхода из функции может быть несколько. Типичный пример: проверка регистрации: BOOL IsRegistered(void);

В одной ветви (опуская эпилог) выход будет: xor eax, eax / retn, в другой: mov eax,1 / retn.

Осуществляется ли запись возвращаемых значений куда-либо?
В зависимости от соглашений, вызываемая функция ожидает входные параметры на стеке и/или в регистрах. Соответственно, часть рабочих регистров может быть сохранена до копирования в них параметров (prolog) и восстановлена на выходе (epilog). Возвращаемое значение ожидается в EAX, но, разумеется, функция может прямо сохранять что-либо в разделяемой (по указателю) памяти.

Случай с несохранением этого значения на стороне вызова, описанный вами выше, понятен. А если функция void?
Ничего не меняется, просто вызываемая функция не записывает ничего принудительно в EAX, а вызывающая игнорирует его содержимое.
Вопрос: В чем разница между boolean и Boolean

В чем разница между boolean и Boolean
Ответ: boolean - примитивный тип данных.
Boolean - класс-обертка boolean.

boolean может быть true или false.
Boolean может быть true, false, null.

Также в классе Boolean есть полезные методы, посмотреть можно .
Вопрос: Функция return в php

Добрый день! Не подскажите что делает функция return в php и в чём его смысл? Я уже читал в php manual про эту функцию, но не понял зачем его использовать и где его применять?
Ответ: Классный вопрос. Приведу два примера.

PHP
1
2
3
4
5
6
function withReturn($a, $b){
$c = $a + $b;
return $c;
}
 
echo withReturn(2, 5);
В результате скрипт передаст в функцию значения 2 и 5, функция их сложит, и вернет 7, в то место, откуда она была вызвана.

PHP
1
2
3
4
5
6
function withoutReturn($a, $b){
$c = $a + $b;
echo "Я сразу выведу результат на экран и ничего не верну. Это значение нельзя будет записать в переменную, в отличие от функции выше. Результат: " . $c;
}
 
withoutReturn(2,5);
Эта функция ничего не возвращает. Она просто выводит сообщение на экран.