Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
#1

проблема с передачей параметра функции - C++

14.11.2011, 13:12. Просмотров 1813. Ответов 41
Метки нет (Все метки)

Здравствуйте. Изучил уже 6 языков программирования, но С++ не дается как-то так просто.
Вот есть например часть кода.
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
#include <cstring>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
 
int convert (){
char str[] = "Фізика";
char qwe[] = "";
   char c = 'і';
   char *p;
   int result;
   printf( "String :      %s\n", str );
   printf( "Search char:   %c\n", c );
   p = strchr( str, c );
   result = (int)(p - str + 1);
   if ( p != NULL )
      printf( "Result :   first %c found at position %d\n", 
              c, result );
   else
      printf( "Result :   %c not found\n" );
   *strchr( str, c ) = 'i';
   CharToOem(str, qwe);
   printf( "New String :      %s\n", qwe );
   int a;
   std::cin>>a;
    return 0;
}
 
int main() {
    convert();
}
если же сделать:
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
int convert [B](char str[])[/B]{
char qwe[] = "";
   char c = 'і';
   char *p;
   int result;
   printf( "String :      %s\n", str );
   printf( "Search char:   %c\n", c );
   p = strchr( str, c );
   result = (int)(p - str + 1);
   if ( p != NULL )
      printf( "Result :   first %c found at position %d\n", 
              c, result );
   else
      printf( "Result :   %c not found\n" );
   *strchr( str, c ) = 'i';
   CharToOem(str, qwe);
   printf( "New String :      %s\n", qwe );
   int a;
   std::cin>>a;
    return 0;
}
 
int main() {
    [B]convert("Фізика");[/B]
}
то идет ошибка:
Первый этап обработки исключения в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Необработанное исключение в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Первый этап обработки исключения в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
Необработанное исключение в "0x0080110a" в "code.exe": 0xC0000005: Нарушение прав доступа при записи "0x008058bd".
2. Может есть какой-то способ заставить консоль воспринимать украинскую букву "і"? А то приходиться заменять ее на английский аналог.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 13:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос проблема с передачей параметра функции (C++):

Проблема, связана с неправильной передачей параметров - C++
Создал на Fortran dll по вычислению некоторой функции: SUBROUTINE ARRAYTEST(x,arr) !MS$ATTRIBUTES DLLEXPORT :: ARRAYTEST use...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

Динамические массивы с передачей в функции - C++
Здравствуйте, завтра у меня обязательная контрольная работа, без права пересдачи, я переболел ветрянкой и не смог разобраться, времени не...

Функции с передачей разного количества параметров - C++
есть код: #include &lt;iostream&gt; using namespace std; void Char(int num, char a1, char a2, ...); void Int(int num, int a1, int...

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов - C++
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов int или float и возвращают...

Использование функции как параметра другой функции - C++
В задании указано, что функция P прибавляет значение функции ff к элементу массива, если он входит в промежуток от C до D, которые вводятся...

41
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,208
Записей в блоге: 27
14.11.2011, 17:59 #31
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- Evg, я под этим подразумевал уже наличие методов find erase sub, которые в char * ещё нужно писать
У string'а - методы класса, у char* - стандартные библиотечные функции

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А вот за strncpy не очень понял я к этому
C
1
2
3
char buf[2];
strcpy (buf, "abcdefg");
sprintf (buf, "%s", "abcdefg");
оба вызова сломаются на исполнении

C
1
2
3
char buf[2];
strncpy (buf, "abcdefg", sizeof (buf));
snprintf (buf, sizeof (buf), "%s", "abcdefg");
оба вызова отработают успешно, молча откинув хвост

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот sprintf вроди как работает с блоками отдельно
Не понял вообще ничего. sprintf ничего не знает о размере буфера и никак его не контролирует.
1
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 18:19 #32
Evg, спасибо я понял наверное в кодах где как мне казалось было перекрытие я сам косячил
Сталкивался с проблеммой связи dst1 и str при этом str[2] = '\0';, но как показал этот код где всё чётко в плане выделения памяти подрезание исходника на производных строках не отображается
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
int main() 
{
    char str[] = "blablabla";
    long sLen = strlen(str);
    char *dst1 = (char *)malloc(sizeof(char)*sLen);
    char *dst2 = (char *)malloc(sizeof(char)*sLen);
    strcpy (dst1,str);      
    sprintf(dst2,"%s",str); 
    
    printf("dst1 : %s\n",dst1);
    printf("dst2 : %s\n",dst2);
    str[2] = '\0';
    printf("dst1 : %s\n",dst1);
    printf("dst2 : %s\n",dst2);
    system("pause");
    return 0;
}
0
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 18:25  [ТС] #33
блин string это же намного проще...
зачем было с этим всем мучится, тем более что они взаимноприсваемые, если судить из кода
C++
1
2
3
4
char * buf = new char[str.length()];
CharToOem(str.c_str(),buf);
str = buf;
delete [] buf;
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 18:28 #34
Цитата Сообщение от SlesherY Посмотреть сообщение
printf( "String : %s\n", str );
printf( "Search char: %c\n", c );
Вы использовали сишный ввод-вывод, вот все и решили, что STL C++ вам не подойдёт.
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,208
Записей в блоге: 27
14.11.2011, 18:40 #35
-=ЮрА=-, в посте #32 при вызове malloc'а надо к размеру добавлять ещё +1, потому как strlen учитывает только значащие символы, но не учитывает хвостовой ноль

Цитата Сообщение от SlesherY Посмотреть сообщение
блин string это же намного проще...
зачем было с этим всем мучится, тем более что они взаимноприсваемые, если судить из кода
То, что ты привёл этот пример - это вовсе не string. Ну а в какой-то момент тебе всё равно придётся опуститься до указателей, как того требует CharToOem
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 18:53 #36
Цитата Сообщение от Evg Посмотреть сообщение
Ну а в какой-то момент тебе всё равно придётся опуститься до указателей, как того требует CharToOem
Да и вообще, полезно знать, как оно работает. Си ещё никто не отменял.
1
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,208
Записей в блоге: 27
14.11.2011, 18:59 #37
Цитата Сообщение от talis Посмотреть сообщение
Да и вообще, полезно знать, как оно работает
Это верно. Только тренироваться лучше на кошках
0
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 19:12  [ТС] #38
а как сделать взаимный переход из одного типа к другому?
ну, string, char[], char*

Добавлено через 18 секунд
кастованием вроде не получится
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,208
Записей в блоге: 27
14.11.2011, 19:40 #39
C++
1
2
3
4
5
char *s;
std::string ss;
 
ss = s; // здесь вовнутрь класса копируются данные из указателя
s = ss.c_str(); // Здесь мы получаем указатель на данные класса, но не копию данных
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 20:41 #40
Evg, простите но здесь с вами не соглашусь (по крайней мере в пределах до VS 2008)
Цитата Сообщение от Evg Посмотреть сообщение
ss.c_str();
это const char * и запихнуть этот указатель в (char *) никак не выйдет
Вижу два варианта
Нужен char-вский буффер, а из него уже можно впихивать в указатель по примеру этого

Цитата Сообщение от SlesherY Посмотреть сообщение
char * buf = new char[str.length()];
CharToOem(str.c_str(),buf);
str = buf;
delete [] buf;
Либо присваивание делать
C++
1
const char * s = ss.c_str();
1
Миниатюры
проблема с передачей параметра функции  
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,208
Записей в блоге: 27
14.11.2011, 21:13 #41
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Evg, простите но здесь с вами не соглашусь
Ага, забыл написать, что это только для чтения. Просто приводил пример как из одного получить другое
0
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
17.11.2011, 19:19  [ТС] #42
да, еще одна проблема.
вобщем, сейчас у меня конвертер в кирилицу примерно такой:
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
void put_mes(string er) {
    string res;
    res = convert(er);
    cout<<res.c_str()<<endl;
}
 
inline std::string replace(std::string text, std::string s, std::string d)
{
  for(unsigned index=0; index=text.find(s, index), index!=std::string::npos;)
  {
    text.replace(index, s.length(), d);
    index+=d.length();
  }
  return text;
}
 
string convert (string str)
{
        char * buf = new char[str.length() + 1];
        size_t found;
        str = replace(str, "і", "i");
        str = replace(str, "І", "I");
        CharToOem(str.c_str(),buf);
        return buf;
        str = buf;
        delete [] buf;
}
если выводить нормально переменную через
C++
1
2
str = "Успіх!";
    put_mes(str);
то все ок.
потом хочу считать переменную и вывести:
CSS
1
2
3
   getline(cin, question);
   cout<<question<<endl;
   put_mes(question);
вот что получается: смотрим скриншот.
вторая строка - єто гетлайн, третья - єто цаут, главное, нормально выводит значение переменной, а вот уже если выводить через ф-ю, то она не работает. По мне, нелогично. Жду мыслей.
0
Миниатюры
проблема с передачей параметра функции  
17.11.2011, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2011, 19:19
Привет! Вот еще темы с ответами:

Передача функции в качестве параметра функции - C++
Дорогие форумчане! Повторяю пример из книжки. До конца не понял его! Помогите разобраться! Тема: односвязный линейный список. Плюс,...

2 параметра в 1 функции - C++
Не знал как точно назвать тему, дело в том, что у меня есть вот такой вот код: void cmd_vcol( char *param ) { int ...

Функции в зависимости от параметра - C++
хз как точнее описать в общем можно ли сделать чтобы в классе появлялись (становились доступными в public) те или иные функции в...

Передача параметра функции - C++
Подскажите пожалуйста каким образом передавать уже явные параметры CreateRectRgn в параметры BitBlt или StreatchBlt не прибегая к...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru