Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > возвратить значение


Автор: susanin 20.3.2007, 11:55
здравствуйте, великие спецы в с++!!! у меня тут возник такой вопрос...мне необходимо из функции возвратить в основную программу значение типа char...как мне это сделать????

Автор: RatHat 20.3.2007, 11:57
А функция какая?
что возвращает? какой тип данных?
код в студию ;)

Автор: RatHat 20.3.2007, 12:16
Код

//объявление функции:
char MyFunction(char *c);

//реализация функции:
char MyFunction(char *ch)
{
    //ну например вот так
    *ch = 'q';
    return *ch;
}


//использование функции:
//выведем сообщение по нажатию кнопки
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    char mychar;
    String s = String(MyFunction(&mychar));
    ShowMessage(s);
}

Автор: susanin 20.3.2007, 12:21
к примеру у меня сделано вот так...
Код

char sum(char bin1[], char bin2[])
{
//.........здесь код, который складывает 2 двоичных числа
//........
return();//что надо писать в return чтобы потом в main возвращалось значение типа char???
}


Автор: Fazil6 20.3.2007, 12:35
Цитата(susanin @  20.3.2007,  11:21 Найти цитируемый пост)
return();//что надо писать в return чтобы потом в main возвращалось значение типа char???

в чем проблема? тебе надо символ вернуть или строку С ?

Автор: susanin 20.3.2007, 12:42
мне надо вернуть результат работы char sum(char bin1[], char bin2[])....т.е. сумму двух двоичных чисел bin1 и bin2...  а она в формате строки...  к примеру 
Код

char sum(char bin1[], char bin2[])
{
    bin1[5];
     bin2[5];
    char rez[5],mem= '0';
   int i,j, len_bin1=strlen(bin1),len_bin2=strlen(bin2),rezult;
for (i=len_bin1;i>=0;i--)
 for (j=len_bin2;j>=0;j--)
    {
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '0')
            rez[i]= '0', mem = '0';
       else
       if (bin1[i] == '0' && bin2[i] == '1'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '0'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '0')
            rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '1')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i]== '0' && bin2[i] == '1' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '0' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '1')
          rez[i] = '1', mem = '1';
    }
return ?;//чтобы потом в главной программе можно было вызвать фун-ю sum и она бы сложила 2 числа
}

Автор: RatHat 20.3.2007, 12:49
ну так...

return *rez;

только почему у тебя результат тоже массив на 5 символов?
должен быть на 6. потому что при условии что складываешь, например 10010 и 11010 получишь результат  101100 - 6-тизначный.

Автор: Fazil6 20.3.2007, 12:54
передавай 3-м параметром буфер для результата
Код


void sum(char bin1[], char bin2[], char rez[])
{
   char mem= '0';
   
    int len_bin1=strlen(bin1);
    int len_bin2=strlen(bin2);

    for (int i = len_bin1; i >= 0 ; i--)
    for (int j = len_bin2; j >= 0; j--)
    {
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '0')
            rez[i]= '0', mem = '0';
       else
       if (bin1[i] == '0' && bin2[i] == '1'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '0'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '0')
            rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '1')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i]== '0' && bin2[i] == '1' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '0' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '1')
          rez[i] = '1', mem = '1';
    }
}


Добавлено @ 12:55 
Цитата(RatHat @  20.3.2007,  11:49 Найти цитируемый пост)
ну так...return *rez;

щас... 
нельзя.

Автор: susanin 20.3.2007, 18:15
Цитата(Fazil6 @  20.3.2007,  12:54 Найти цитируемый пост)
передавай 3-м параметром буфер для результата

передал...а что возвращать то??? что то не пойму никак... если написать просто return rez; товыдается ошибка о невозможности конвертации char* to char..

Автор: Fazil6 20.3.2007, 18:33
Цитата(susanin @  20.3.2007,  17:15 Найти цитируемый пост)
передал...а что возвращать то??? что то не пойму никак... если написать просто return rez; товыдается ошибка о невозможности конвертации char* to char..

я же написал. Функция ничего не возвращает. Внутри функции пишется в твой массив rez и после вызова в нем будет лежать твой результат. return здесь не нужен

Автор: susanin 20.3.2007, 18:46
Fazil6, мне необходимо чтобы потом можно было вызвать эту функцию... чтобы например потом ввести 2 двочных числа а эта функция бы их сложила...
например
Код

char sum(char bin1[], char bin2[])
{...........
...........
...........
return ?;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char x1[]={'1','0','1','0','\0'};
char x2[]={'0','1','0','1','\0'};
rez = sum (x1,x2);
Panel1->Caption = rez;
}

вот что то вроде такого надо...если я неправильно начал что то делать, то подскажи как мне и что надо поправить...

Автор: UniBomb 20.3.2007, 19:36
Код

void sum(char bin1[], char bin2[], char *rez[])
{
 //тут делай что хочеш, главное в качестве результата используй rez.
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char x1[]={'1','0','1','0','\0'};
char x2[]={'0','1','0','1','\0'};
char result[];
sum (x1,x2,&result); //в переменной result сохранится готовое значение
Panel1->Caption = result;

}

Автор: Fazil6 20.3.2007, 19:38
Код

void sum(char bin1[], char bin2[], char *rez)
{...........
...........
...........
rez[n] = '\0' ; // ставим завершающий 0
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char x1[]={'1','0','1','0','\0'};
char x2[]={'0','1','0','1','\0'};
char rez[8];
sum (x1,x2, rez);
Panel1->Caption = rez;
}

тока с размерами акуратнее, чтобы не вылезти за пределы rez

Добавлено @ 19:41 
UniBomb, твое даже не скомпиллируется...

Автор: susanin 20.3.2007, 19:50
Fazil6,странно..но все равно не пашет...пишет ошибки 
  [C++ Error] Unit1.cpp(18): E2188 Expression syntax
  [C++ Error] Unit1.cpp(67): E2293 ) expected
  [C++ Error] Unit1.cpp(67): E2141 Declaration syntax erro
Код

char sum(char bin1[], char bin2[], *rez)
{
    char bin1[];
    char bin2[];
    char rez[6];
    char mem= '0';
   int i,j, len_bin1=strlen(bin1),len_bin2=strlen(bin2),rezult;
for (i=len_bin1;i>=0;i--)
 for (j=len_bin2;j>=0;j--)
    {
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '0')
            rez[i]= '0', mem = '0';
       else
       if (bin1[i] == '0' && bin2[i] == '1'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '0'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '0')
            rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '1')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i]== '0' && bin2[i] == '1' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '0' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '1')
          rez[i] = '1', mem = '1';
    }
    rez[n] = '\0' ;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char x1[]={'1','0','0','1'};
char x2[]={'0','1','1','0'};
char rez[8];
rez = sum(x1,x2,rez);
Panel1->Caption = rez;
}

где же у меня все таки ошибка?

Автор: UniBomb 20.3.2007, 19:59
Fazil6, 

Хех, это почему же? В смысле я показал как делать, а не что делать. Если немного поправить, то получится следующее:

Код

char sum(char bin1[], char bin2[], char *rez)
{
    char bin1[];
    char bin2[];
    char mem= '0';
    rez = new char(6+1);  //+1 для символа конца строки
   int i,j, len_bin1=strlen(bin1),len_bin2=strlen(bin2),rezult;
for (i=len_bin1;i>=0;i--)
 for (j=len_bin2;j>=0;j--)
    {
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '0')
            *rez[i]= '0', mem = '0';
       else
       if (bin1[i] == '0' && bin2[i] == '1'&& mem == '0')
            *rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '0'&& mem == '0')
           *rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '0')
            *rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '1')
            *rez[i] = '1', mem = '0';
       else
       if (bin1[i]== '0' && bin2[i] == '1' && mem == '1')
           *rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '0' && mem == '1')
           *rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '1')
          *rez[i] = '1', mem = '1';
    }
    *rez[n] = '\0' ;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char x1[]={'1','0','0','1'};
char x2[]={'0','1','1','0'};
char rez[6];
rez = sum(x1,x2,&rez);
Panel1->Caption = rez;
}

Автор: susanin 20.3.2007, 20:08
UniBomb, это следующее выдало целую кучу ошибок......

Автор: Fazil6 20.3.2007, 20:20
Цитата(susanin @  20.3.2007,  18:50 Найти цитируемый пост)
где же у меня все таки ошибка?

ты сделай как я написал.
разве у меня так?
Код

char sum(char bin1[], char bin2[], *rez)

надо
Код

void sum(char bin1[], char bin2[], char *rez)


это
Код

char x1[]={'1','0','0','1'};
char x2[]={'0','1','1','0'};

rez = sum(x1,x2,rez);

надо
Код

char x1[]="1001";
char x2[]="0110";

sum(x1,x2,rez);

и еще куча галиматьи в sum. Такое впечатление, что ты понятия не имеешь о элементарных правилах С++.
я же написал тебе функцию, я правда не вдавался там в подробности алгоритма, но у тебя в этой функции ошибок тьма.
Код

void sum(char bin1[], char bin2[], char rez[])
{
   char mem= '0';
   
    int len_bin1=strlen(bin1);
    int len_bin2=strlen(bin2);

    // по моему алгоритм твой дальше неправильный.
    // непонятно куда денется 1 если в старших битах слагаемых 1
    for (int i = len_bin1; i >= 0 ; i--)
    for (int j = len_bin2; j >= 0; j--)
    {
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '0')
            rez[i]= '0', mem = '0';
       else
       if (bin1[i] == '0' && bin2[i] == '1'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '0'&& mem == '0')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '0')
            rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '0' && bin2[i] == '0' && mem == '1')
            rez[i] = '1', mem = '0';
       else
       if (bin1[i]== '0' && bin2[i] == '1' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '0' && mem == '1')
           rez[i] = '0', mem = '1';
       else
       if (bin1[i] == '1' && bin2[i] == '1' && mem == '1')
          rez[i] = '1', mem = '1';
    }
     // тут надо как-то поставить ограничитель в rez
}



UniBomb, что ты там подправил? ошибок куча, причем уровня "C++ за 21 день"

Автор: susanin 20.3.2007, 20:27
Fazil6 , просто я еще переполнение не отслеживал в этом алгоритме, а так он праильный...вроде.....
Цитата(Fazil6 @  20.3.2007,  20:20 Найти цитируемый пост)
void sum(char bin1[], char bin2[], char *rez)
 
на это выдается ошибка неизвестный размер sum..

Автор: Fazil6 20.3.2007, 20:33
Цитата(susanin @  20.3.2007,  19:27 Найти цитируемый пост)
на это выдается ошибка неизвестный размер sum..

покажи весь код свой и что в ошибках пишет. Нету ошибки в этой строке.

Автор: susanin 20.3.2007, 20:42
Fazil6 , там я нашел ошибку ...тема закрыта

Автор: Fazil6 20.3.2007, 21:41
вот так с двоичными работать
Код

#include<math.h>
#include<iostream>
#include <string>
#include <algorithm>

namespace BIN_OPERATIONS
{

int binToint(const std::string &s1)
{// перевод строки в 10-е число
    int z1 = 0;
    for(int i = (int)s1.length() - 1; i > -1  ; --i)
    {
        if((s1[i] != 0x30) && (s1[i] != 0x31)) 
            throw std::runtime_error("not bin symbol") ;

        if((s1[i] - 0x30))
            z1 = z1 + (int)pow(2, int(s1.length() - 1 - i)   );
    }
    return z1;
}

std::string intToBin(int value)
{// перевод в двоичное

    std::string bufer; 
    if(!value) { bufer.push_back('0'); return bufer; }

    while(value)
    {
        bufer.push_back(char(value % 2 + 0x30));
        value /= 2;
    }

    std::reverse(bufer.begin(), bufer.end());
    return bufer;
}

std::string bin_sum(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) + binToint(s2));
}

std::string bin_minus(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) - binToint(s2) );
}
std::string bin_mult(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) * binToint(s2));
}

std::string bin_div(const std::string &s1,  const std::string &s2)
{
    int z = binToint(s2); 
    if(!z) throw std::runtime_error("divide by zero") ;
    return intToBin(binToint(s1) / z );
}

};  // END namespace

int main()
{
    std::string s1("101");
    std::string s2("011");
    

    try
    {
        std::cout << BIN_OPERATIONS::bin_sum(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_minus(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_mult(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_div(s1, s2) << std::endl;

    }
    catch(const std::runtime_error &e)
    {
        std::cout << e.what();
    }
    return 0;
}


Автор: susanin 20.3.2007, 22:59
Fazil6 , для меня это пока что выглядит как что то ужасное....непонятное и страшное!! smile 

Автор: Fazil6 20.3.2007, 23:50
Цитата(susanin @  20.3.2007,  21:59 Найти цитируемый пост)
Fazil6 , для меня это пока что выглядит как что то ужасное....непонятное и страшное!! 

чего тут страшного? Билдер схавает на ура. Главное, чтобы ему страшно небыло...

Автор: UniBomb 20.3.2007, 23:51
Цитата

UniBomb, что ты там подправил? ошибок куча, причем уровня "C++ за 21 день"


Ну да, действительно)) Короче, что я хотел сказать - надо использовать переменную-"ссылку". Вот так:

Код

void sum(char bin1[], char bin2[], char &rez[]);


Автор: Fazil6 20.3.2007, 23:52
Цитата

Fazil6 , для меня это пока что выглядит как что то ужасное....непонятное и страшное!!


этот код намного проще твоего и в нем отсутствует масса проблем, которые приходится решать в твоем. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)