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

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

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

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

14.11.2011, 13:12. Просмотров 1782. Ответов 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. Может есть какой-то способ заставить консоль воспринимать украинскую букву "і"? А то приходиться заменять ее на английский аналог.
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, которые вводятся...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 13:34 #2
Правильно, потому что при вызове вы передаёте константный массив char ("Фiзика").

C++
1
convert("Фізика");
А константы изменять нельзя. А вы пытаетесь:

C++
1
*strchr( str, c ) = 'i';
Откройте секрет, для чего вы это делаете?


И вообще:

C++
1
2
3
4
void convert( char * )
{
  //...
}
Смысл тот же самый, но так будет яснее, что передаётся именно указатель.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
14.11.2011, 13:39 #3
В первом случае у тебя есть массив char'ов, который инициализирован строкой. В втором случае у тебя есть строковой литерал

Почитай две ссылки, чтобы понять, как эти конструкции строит компилятор
Изменить значение указателя
Чем по умолчанию инициализируется символьный массив?

В твоём случае ломается на строке 16 из второго исходника: запись в read-only данные

Добавлено через 41 секунду
Кстати, компилятор должен был как минимум предупреждение выдать во втором случае
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 14:20  [ТС] #4
Исправил. Теперь строку возвращает, но все равно есть ошибка.

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
#include <cstring>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
void convert (char str[]){
char qwe[] = "";
   char c = 'і';
   char *p;
   int result;
   cout<<"String: "<<str;
   cout<<"Search char: "<<c;
   p = strchr( str, c );
   result = (int)(p - str + 1);
   if ( p != NULL ) cout<<"Pos: "<<result;
   else cout<<"Not found";
   *strchr( str, c ) = 'i';
   CharToOem(str, qwe);
   cout<<"New: "<<qwe;
}
 
int main() {
    char str[] = "Фізика";
    convert(str);
}
Run-Time Check Failure #2 - Stack around the variable 'qwe' was corrupted.
Первый этап обработки исключения в "0x003a2216" в "code.exe": 0xC0000005: Нарушение прав доступа при чтении "0x0024008c".
Необработанное исключение в "0x003a2216" в "code.exe": 0xC0000005: Нарушение прав доступа при чтении "0x0024008c".
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
14.11.2011, 14:23 #5
При вызове CharToOem под второй параметр у тебя должно быт зарезервировано достаточно памяти. А у тебя только 1 байт (что следует из строки 7 и ссылки, что я давал выше)
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 14:31  [ТС] #6
спасибо.
ну я изменил char qwe[] = ""; на char qwe[255];
все работает.
Но разве если не хватает памяти под строку, не должно автоматически дописыватся нужное к-ство байтов?
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
14.11.2011, 15:02 #7
Цитата Сообщение от SlesherY Посмотреть сообщение
не должно автоматически дописыватся нужное к-ство байтов
Объяснять долго, а потому отвечу кратко: нет
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 15:37  [ТС] #8
а если я все таки хочу передать параметр непосредственно в аргументе ф-и, тоесть convert("text"); а не char t[5] = "text"; convert(t); ? неудобно каждый раз присваивать значения.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 15:41 #9
SlesherY, хотите изменять буфер - делайте его неконстантным. То есть выделяйте доп. участок памяти, копируйте туда данные, которые планируете менять, и меняйте там.

Добавлено через 47 секунд
Единственное что - можете это делать в вашей функции, а не до её вызова.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
14.11.2011, 15:47 #10
Цитата Сообщение от SlesherY Посмотреть сообщение
а если я все таки хочу передать параметр непосредственно в аргументе ф-и, тоесть convert("text"); а не char t[5] = "text"; convert(t); ? неудобно каждый раз присваивать значения.
Так это "const char*", а не "char*". Если хочешь писать - делай копию, и тут никуда не денешься. В реальной жизни тебе не нужен вызов твоей функции с константным строковым литералом. В реальной жизни у тебя всегда будет работа с буфером
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 15:48  [ТС] #11
Цитата Сообщение от talis Посмотреть сообщение
делайте его неконстантным. То есть выделяйте доп. участок памяти,
ну это напрашивается. но как? если char *t то это будет константа? Как иначе выделить?

Не по теме:

Прошу не ругать, но просто такая хрень как указатели мне встречается только в С. Нигде еще не встречался.



Добавлено через 1 минуту
Evg, ясно. Не видел вашего сообщения. Ок.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
14.11.2011, 15:50 #12
Цитата Сообщение от SlesherY Посмотреть сообщение
если char *t то это будет константа?
Это будет неинициализированный указатель, для которого ещё нужно память выделить.

C
1
2
3
4
5
char buf[256];
strcpy (buf, "тыдыщ!");
convert (buf);
strcpy (buf, "опа!");
convert (buf);
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 15:56  [ТС] #13
ясно.спасибо.
да кстати return qwe; из convert() возвращает уже строковую константу. тоесть я должен объявить как char *convert (char str[]) , а потом уже принимать результат char *res;
res = convert(str);
.
qwe - это же чар[1000];
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:01 #14
Цитата Сообщение от SlesherY Посмотреть сообщение
CharToOem(str, qwe);
- сделай CharToOem(p,p); - в итоге преобразуешь саму подстроку p. Вообще же руссификация CharToOem это API, как вариант предлагаю руссификацию в стиле плюсов Русский текст без танцев с бубнами, там в топике ещё много разных вариантов предложено

Добавлено через 5 минут
Вот код без CharToOem
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
#include <iostream>
using namespace std;
 
//ГђГіГ±Г±ГЁГґГЁГЄГ*öèÿ
ostream& operator<<(ostream &stream,char* s)
{
    for(char* ps=s; *ps; ps++)
    {
        if(*ps=='Вё')
            stream<<char(241);
        else 
        if(*ps=='ВЁ')
            stream<<char(240);
        else 
        if(*ps>=-64 && *ps<=-17)                   
            stream<<char(*ps+64+128);
        else 
        if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
void convert (char str[])
{
    char qwe[] = "";
    char c = 'Ві';
    int result;
    cout<<"String: "<<str<<endl;
    cout<<"Search char: "<<c<<endl;
    char *p = strchr( str, c );
    result = (int)(p - str + 1);
    if ( p != NULL ) 
        cout<<"Pos: "<<result<<endl;
   else 
       cout<<"Not found"<<endl;
   *strchr(str, c ) = 'i';
   cout<<"New: "<<p<<endl;
}
 
int main() {
        char str[] = "Ô³çèêГ*";
        convert(str);
        system("pause");
        return 0;
}
Миниатюры
проблема с передачей параметра функции  
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 16:10  [ТС] #15
-=ЮрА=-, єто как бы очень упрощает задачу но вот только был поставлен резонный вопрос:
А если в нативной кодировке системы 241-й символ будет не 'ё'? (есть ведь ещё UTF-8, KOI8R, DOS-886 и прочие).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 16:10
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.11.2011, 16:10
Ответ Создать тему
Опции темы

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