Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147

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

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

Студворк — интернет-сервис помощи студентам
Проблема в том, что мне надо получить значение функции через аргумент, через строковый аргумент. Я конкретно запуталась с тем, что мне нужно передавать в качестве параметра функции, чтобы в итоге получить результат в передаваемой переменной.
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2012, 14:26
Ответы с готовыми решениями:

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

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

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

12
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 14:45
Намекаю - char*, конечно, указатель на первый символ в массиве элементов типа char, но это отнюдь не значит, что с его помощью нельзя передавать текст.
Сперва выделяй память под массив, потом передавай указатель на него в функцию, а в ней уж пиши в этот массив сколько угодно, только размер не превышай, получишь access violation.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
07.10.2012, 14:59  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Намекаю - char*, конечно, указатель на первый символ в массиве элементов типа char, но это отнюдь не значит, что с его помощью нельзя передавать текст.
Сперва выделяй память под массив, потом передавай указатель на него в функцию, а в ней уж пиши в этот массив сколько угодно, только размер не превышай, получишь access violation.
Вот такой вариант, не очень для меня желательный (потому что не хочется выделять лишнюю память, а я знать не знаю, сколько мне вернут до вызова) тоже не отрабатывает...
Получаем char[] (или char*). Передаём char[size]. Выдаёт пустоту либо нечто неизвестное...
Я же правильно Вас поняла?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 15:13
Ладно, можно и в функции выделять память, хоть это и не шибко красиво... надеюсь, так будет понятно:
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
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.10.2012, 15:18
А почему std::string не используете? этот тип приятнее в использовании со строками
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
07.10.2012, 15:23  [ТС]
Премного благодарна) Значит я все-таки неправильно делала, хотя мыслила более-менее верно)
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
08.10.2012, 21:13  [ТС]
Недолго я радовалась...Работало недолго(возможно я что-то и исправила, но возвращение того, что было не помогло) и начало вылезать "Ошибка сегментирования(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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2012, 21:26
Как объявлена mysql_row?
1
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
08.10.2012, 22:03  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Как объявлена mysql_row?
MYSQL_ROW mysql_row
Представляет собой массив строк. Возвращает char* как я понимаю. (собственно вывод mysql_row[0] с помощью printf (%s) не вызывает проблем.
Вру...Раньше не вызывал... Сейчас проверила - ошибка сегментации.

Добавлено через 30 минут
Дело было в том, что у меня отсутствовала требуемая запись, а NULL он мне естественно записывать не хотел) Спасибо, я даже не подумала, что проблема с результатом.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2012, 23:07
Вот как все банально... Бери на вооружение трассировщик, один раз с ним аккуратно проходишь по коду и все встает на свои места.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
19.10.2012, 13:19  [ТС]
Думаю можно задать вопрос в этой же теме) Задача та же самая...Передача значения по ссылке. Только теперь через 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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.10.2012, 17:18
Цитата Сообщение от Sweet_Sleep Посмотреть сообщение
Уже не надо, разобралась)
Ну, так поделись со всеми, глядишь, и поможет кому.
0
10 / 10 / 1
Регистрация: 04.11.2009
Сообщений: 147
19.10.2012, 18:02  [ТС]
Там такое явное решение) Объявить структуру результата в .x, а не просто int. И передавать в ней все, что нужно. Не сообразила вначале)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2012, 18:02
Помогаю со студенческими работами здесь

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

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

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

Передача аргумента по ссылке
Почему в этом коде переменная b не состоит из одного элемента? Так как это список, то он ведь по ссылке передаётся def foo(c): c = c ...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru