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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
SlesherY
6 / 6 / 1
Регистрация: 14.11.2011
Сообщений: 54
14.11.2011, 13:12     проблема с передачей параметра функции #1
Здравствуйте. Изучил уже 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. Может есть какой-то способ заставить консоль воспринимать украинскую букву "і"? А то приходиться заменять ее на английский аналог.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 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
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 15:41     проблема с передачей параметра функции #9
SlesherY, хотите изменять буфер - делайте его неконстантным. То есть выделяйте доп. участок памяти, копируйте туда данные, которые планируете менять, и меняйте там.

Добавлено через 47 секунд
Единственное что - можете это делать в вашей функции, а не до её вызова.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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 и прочие).
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:16     проблема с передачей параметра функции #16
Вот вариант с 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
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
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 (string str, char c)
{
    char * buf = new char[str.length() + 1];
    sprintf(buf,"%s",str.c_str());
    cout<<"String: "<<buf<<endl;
    cout<<"Search char: "<<c<<endl;
    int pos = str.find(c,0);
    if(pos != string::npos )
    {
        cout<<"Pos: "<<pos<<endl;
        sprintf(buf,"%s",(str.substr(pos,string::npos)).c_str());
        cout<<"New: "<<buf<<endl;
    }
    else 
       cout<<"Not found"<<endl;
    delete [] buf;
   
}
 
int main() 
{
    char str[] = "ÔèçèêГ*";
    convert(str, 'ГЁ');
    system("pause");
        return 0;
}
PS:В перегрузке не делал вывод украинского i - поэтому искал русскую и в слове Физика, по свободе подлатаю перегрузку ostream operator<<
Миниатюры
проблема с передачей параметра функции  
-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:19     проблема с передачей параметра функции #17
SlesherY,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CharToOem(p,p);
- хорошо сейчас сделаю с ЧарТоОем
talis
14.11.2011, 16:24
  #18

Не по теме:

SlesherY, как ТС той темы заявляю: для винды ответа на поставленный вопрос обнаружено не было. Похоже, только бубны.

-=ЮрА=-
Заблокирован
Автор FAQ
14.11.2011, 16:36     проблема с передачей параметра функции #19
SlesherY, вот ваше задание без лишних функций и хедеров в стиле Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Windows.h>
#include <string.h>
#include <stdio.h>
 
int main() 
{
    char c = 'i';
    char str[] = "Г”içèêГ*";
    char * qwe = strchr( str, c );
    CharToOem(str,str);
    printf( "String :      %s\n", str );
    printf( "Search char:   %c\n", c );
    
    if(qwe != NULL)
    {
        printf( "Result : first %c found at position %d\n", c, strlen(str) - strlen(qwe) );
        printf("New : %s\n",qwe);
    }
    else
        printf( "Result :   %c not found\n",c );
    system("pause");
    return 0;
}
Миниатюры
проблема с передачей параметра функции  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 16:37     проблема с передачей параметра функции
Еще ссылки по теме:

C++ Функции в зависимости от параметра
Вернуть 2 параметра из функции C++
C++ Динамические массивы с передачей в функции

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
14.11.2011, 16:37     проблема с передачей параметра функции
  #20

Не по теме:

PS:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char * qwe = strchr( str, c );
- часть str поєтому
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CharToOem(str,str);
подконвертим как str так и qwe

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

Текущее время: 00:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru