10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
1

Получение результата как аргумента, передаваемого по ссылке

07.10.2012, 14:26. Показов 1918. Ответов 12

Author24 — интернет-сервис помощи студентам
Проблема в том, что мне надо получить значение функции через аргумент, через строковый аргумент. Я конкретно запуталась с тем, что мне нужно передавать в качестве параметра функции, чтобы в итоге получить результат в передаваемой переменной.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int getFieldByLogin(char* login,char* fieldName, char* value){ /* Последний параметр - то, что мне требуется как результат. 
Мой самый нормальный, но не приводящий к рез-ту вариант -передача по ссылке */
 
  if (connectBD()==0)
  {
    char log[255]="'";
    strcat(log, login);
    strcat(log,"'");
 
    char str_query[300]="SELECT ";
    strcat(str_query, fieldName);
    strcat(str_query, " FROM users WHERE login = ");
    strcat(str_query, log);
    strcat(str_query, "");
 
    if (mysql_query(&mysql,str_query )!=0){
 
      fprintf(stderr,"Error execute require\n");
      printf("%s\n", mysql_error(&mysql));
      return(-1);                      //Hear must be code error!
    };
 
    if (mysql_field_count(&mysql)==0){
 
      fprintf(stderr, "Not find record in database\n");
      return (-1);                     //Hear must be code error!
    } else {
 
      mysql_res=mysql_store_result(&mysql);
      mysql_row=mysql_fetch_row(mysql_res);
    };
 
    unsigned long* len;
    len = mysql_fetch_lengths(mysql_res);  
    value = new char[len[0]];                 //выделение памяти для результата
    value = mysql_row[0];                    //непосредственно присвоение результата, mysql_row-это строковый //массив
    printf("%s %s \n",value, mysql_row[0]); //просто проверка, выводит все значения верно.
 
  } else {
 
    fprintf(stderr, "Impossible execute require: error connected with DataBase\n");
    return (-1);                       //Hear must be code error!
  };
 
disconnectBD();
 
return(0);
 
}
 
int main(){
 
  char* val;       //объявление переменной, в которую должен быть помещён резульат
  char log[]="login1";
  char pas[]="password";
  getFieldByLogin(log, pas, value);    //вызов функции
  printf("%s\n", value);                     /*вывод показывает, что это всё не работает
 (выводится случайная строка случайных символов случайного размера */
  return(0);
}
По идее это и не должно работать..Потому что char* -это указатель на первый символ, используемый как аналог строки (в моём понимании). В случае с int-ом всё было бы проще. А здесь получается, что необходимо указатель на строку, то есть указатель на указатель? Пробовала такой вариант (char**), но не получилось. Буду очень рада, если надоумите. Прошу не ругаться, если я совсем по-тупому думаю, а вежливо намекнуть))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2012, 14:26
Ответы с готовыми решениями:

Как правильно реализовать проверку типа передаваемого аргумента в шаблонной функции?
Доброго времени суток, уважаемые форумчане! Пытаюсь реализовать проверку типа аргумента,...

Получение значений функцией (что происходит при передаче аргумента по значению/ссылке)
Разъясните, пожалуйста, пояснение в скобках

Фукнкция замены передаваемого аргумента
#include <iostream> #include <cstring> using namespace std; int replace (char * str, char...

Узнать тип объекта передаваемого по ссылке
Есть класс А, класс В наследник, в классе С в методе будет приходить объект по ссылке на базовый...

12
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 14:45 2
Намекаю - char*, конечно, указатель на первый символ в массиве элементов типа char, но это отнюдь не значит, что с его помощью нельзя передавать текст.
Сперва выделяй память под массив, потом передавай указатель на него в функцию, а в ней уж пиши в этот массив сколько угодно, только размер не превышай, получишь access violation.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
07.10.2012, 14:59  [ТС] 3
Цитата Сообщение от BRcr Посмотреть сообщение
Намекаю - char*, конечно, указатель на первый символ в массиве элементов типа char, но это отнюдь не значит, что с его помощью нельзя передавать текст.
Сперва выделяй память под массив, потом передавай указатель на него в функцию, а в ней уж пиши в этот массив сколько угодно, только размер не превышай, получишь access violation.
Вот такой вариант, не очень для меня желательный (потому что не хочется выделять лишнюю память, а я знать не знаю, сколько мне вернут до вызова) тоже не отрабатывает...
Получаем char[] (или char*). Передаём char[size]. Выдаёт пустоту либо нечто неизвестное...
Я же правильно Вас поняла?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 15:13 4
Ладно, можно и в функции выделять память, хоть это и не шибко красиво... надеюсь, так будет понятно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int getFieldByLogin( char* login, char* fieldName, char** value ){
  char * _val = *value = new char[size];
  strcpy(_val, "text");
}
//...
int main(){ 
  char* value = NULL;       
  char log[]="login1";
  char pas[]="password";
  getFieldByLogin( log, pas, &value );    
  printf("%s\n", value);   
  getch();
  if(value) delete[] value;
}
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.10.2012, 15:18 5
А почему std::string не используете? этот тип приятнее в использовании со строками
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
07.10.2012, 15:23  [ТС] 6
Премного благодарна) Значит я все-таки неправильно делала, хотя мыслила более-менее верно)
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
08.10.2012, 21:13  [ТС] 7
Недолго я радовалась...Работало недолго(возможно я что-то и исправила, но возвращение того, что было не помогло) и начало вылезать "Ошибка сегментирования(core dumped). Переделала под std::string. Отрабатывает с присвоением константной строки, но ни в какую не хочет мне возвращать значение массива и выдает ту же самую ошибку... Ну, что ему не нравится?((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int DB::getFieldByLogin(std::string login, std::string fieldName, std::string& value){
 
  if (DB::connectDB()==0){
 
    std::string str_query="SELECT "+fieldName+" FROM important_DB.users WHERE login= '"+login+"'";
    char* query= new char[str_query.size()+1];
    strcpy(query,str_query.c_str());
 
    if (mysql_query(&mysql,query )!=0){
 
      fprintf(stderr,"Error execute require\n");
      printf("%s\n", mysql_error(&mysql));
      return(0x0302);                      //Hear must be code error!
    };
 
    mysql_res=mysql_store_result(&mysql);
    mysql_row=mysql_fetch_row(mysql_res);
 
    //value.assign (mysql_row[0]);    //Так тоже не работает
    value=(const char*) mysql_row[0];  //И так не работает , работает только value="stroka";
  } else {
 
    fprintf(stderr, "Impossible execute require: error connect with DataBase\n");
    return (0x0303);                       //Hear must be code error!
  };
 
  DB::disconnectDB();
 
  return(0);
 
}
int main(){
 
  DB base;
  std::string log="login2";
  std::string pas="name";
  std::string value="Shit";
  base.getFieldByLogin(log, pas, value);
  std::cout<<value;
  return(0);
}
Добавлено через 1 минуту
Цитата Сообщение от I.M. Посмотреть сообщение
А почему std::string не используете? этот тип приятнее в использовании со строками
Я решила, что тем, кто будет пользоваться моими функциями привычнее будет с char*, но они сказали, чтобы я переделала под std::string )
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2012, 21:26 8
Как объявлена mysql_row?
1
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
08.10.2012, 22:03  [ТС] 9
Цитата Сообщение от BRcr Посмотреть сообщение
Как объявлена mysql_row?
MYSQL_ROW mysql_row
Представляет собой массив строк. Возвращает char* как я понимаю. (собственно вывод mysql_row[0] с помощью printf (%s) не вызывает проблем.
Вру...Раньше не вызывал... Сейчас проверила - ошибка сегментации.

Добавлено через 30 минут
Дело было в том, что у меня отсутствовала требуемая запись, а NULL он мне естественно записывать не хотел) Спасибо, я даже не подумала, что проблема с результатом.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2012, 23:07 10
Вот как все банально... Бери на вооружение трассировщик, один раз с ним аккуратно проходишь по коду и все встает на свои места.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
19.10.2012, 13:19  [ТС] 11
Думаю можно задать вопрос в этой же теме) Задача та же самая...Передача значения по ссылке. Только теперь через rpc. Sun-rpc. есть код клиента, который непосредственно вызывает модуль, функция на клиенте отсылает данные серверу, сервер выполняет функцию, используя заранее заготовленный модуль и дальше по цепочке все посылают обратно данные.

такой вызов:
C++
1
2
int val=0;
us.existenceLogin("lofdgsdfg",val);
код клиента:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Функция для проверки существования логина, значение надо вернуть в value
Code::Type US::existenceLogin (std::string login, int& value){
         //тут у нас происходит передача аргументов в структуру для серверной функции
      existenceParameters existence;
      strcpy(existence.login, login.c_str());      
      existence.value[1]=value;  /*в интерфейсной части для rpc прописана следующая структура
 struct existenceParameters{
  char login[32];
  int value[1];
};*/
 
      unsigned int result;
      result=*(existencelogin_1(&existence, client)); //возвращаем результат
 
      return (Code::Type)result;
};
код сервера:
C++
1
2
3
4
5
6
7
8
9
10
/* This function verify login and return 1=if login non existence, 0=if login existence */
int* existencelogin_1_svc (existenceParameters *argp, struct svc_req *rqstp)
{
     US us; //тут мы создаем экземпляр класса, описанный в подключаемом модуле
     std::string login(argp->login);
printf("server1=%d\n", *argp->value); //это для проверки, что данные до и после функции не изменились
     static int result = (int)us.existenceLogin(login,argp->value[1]); //передача данных непосредственно в функцию, где что-то делается
printf("server2=%d\n", *argp->value);
     return (&result);  //возвращаем результат
};]
Модуль, где присваивается значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Code::Type US::existenceLogin (std::string login, int& value){
//!!!Передача второго аргумента идет по ссылке, как и на клиенте
  if (mysql_ping(&mysql)<=0){        //Build query if connect with DB:
    std::string str_query="SELECT * FROM "+USnamedb+"."+UStable+" WHERE "+UStable+".login= '"+login+"'";
    char* query = new char[str_query.size()+1];
    strcpy(query, str_query.c_str());
                                           //Execute query, if !=0=> we have error:
    if (mysql_query(&mysql, query)!=0){
      Log::error("Error execute require\n");
      return(Code::US_QueryError);                  //Hear must be code error!
    };
                                         //Save result query and check result:
    mysql_res=mysql_use_result(&mysql);
    mysql_row=mysql_fetch_row(mysql_res);
                                          //Save result and return and make empty memory:
    if(mysql_row==NULL) value=1; else value=0;  //!!!Вот оно, присваивание результата
    delete[] query;
    mysql_free_result(mysql_res);
                                          //If didn't connect with database:
  }else{
    Log::error("Impossible execute require: error connect with database\n");
    return(Code::US_DBDoesntRespond);                          //Hear must be code error!
  };
  return(Code::Okay);
};
Чуть вопрос не забыла) = Как это сделать?) Приведенный вариант не отрабатывает..

Добавлено через 16 минут
Ошибочка вышла, в серверной части значение как раз таки сохраняется. То есть после выполнение функции Sever2 = нужному значению,а вот уже на клиенте ничего нет.

Добавлено через 12 часов 56 минут
Уже не надо, разобралась)
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.10.2012, 17:18 12
Цитата Сообщение от Sweet_Sleep Посмотреть сообщение
Уже не надо, разобралась)
Ну, так поделись со всеми, глядишь, и поможет кому.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
19.10.2012, 18:02  [ТС] 13
Там такое явное решение) Объявить структуру результата в .x, а не просто int. И передавать в ней все, что нужно. Не сообразила вначале)
0
19.10.2012, 18:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2012, 18:02
Помогаю со студенческими работами здесь

Лямбда выражение в качестве передаваемого аргумента функции
Добрый день! Подскажите пожалуйста, могу ли я в функциях библиотеки Qt использовать в качестве...

Выводить поле либо в Верхнем регистре либо в нижнем, в зависимости от передаваемого аргумента
Здравствуйте! Задание такое:в столбец, нужно выводить содержимое поля Name_Costs либо в Верхнем...

Передача аргумента по ссылке
Почему в этом коде переменная b не состоит из одного элемента? Так как это список, то он ведь по...

Передача аргумента по ссылке
Здравствуйте. Есть число нужно к нему прибавить единицу &lt;?php function chislo(&amp;$var){ ...

MuLISP использование результата в качестве аргумента
Не останавливаясь на способе реализации &quot;программы&quot; (умственных способностях, уровне...)...

Возврат результата из функции через параметр по ссылке
Здравствуйте уважаемый форумчане! Подскажите, как вернуть результат работы функции по ссылке? Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru