Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Консоль С++, устранить ошибку / 11 сообщений из 11, страница 1 из 1
05.11.2007, 14:41:14
    #34916685
Orb*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Функция переводит каракули ,в консоле, на русский язык, все компилиться тока когда запускаеться вылетает AV, подскажите где ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
AnsiString rus(AnsiString msg)
{
 int i;
 for (i= 1 ; msg.Length();i++)
 {
  switch (msg[i])
   {
    case 'А..п':msg[i]= char(AnsiString(msg[i])- 64 );
    case 'р..я':msg[i]= char(AnsiString(msg[i])- 16 );
   }
 }
 return msg;
}

void main()
{
 printf("%s",rus("Привет"));
 getch();

}
...
Рейтинг: 0 / 0
05.11.2007, 14:52:17
    #34916697
Orb*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Исходник это функции написан на Делфи
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function Rus(mes:string):string;
var
 i:integer;
begin
 for i:= 1  to length(mes) do
    case mes[i] of
         'A'..'п' : mes[i]:=Chr(Ord(mes[i])- 64 );
         'р'..'я' : mes[i]:=Chr(Ord(mes[i])- 16 );
    end;
rus:=mes;
end;
Подскажите как переделать на Си
...
Рейтинг: 0 / 0
05.11.2007, 15:07:37
    #34916719
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Orb* wrote:
> Функция переводит каракули ,в консоле, на русский язык, все компилиться
> тока когда запускаеться вылетает AV, подскажите где ошибка
>
....
> switch (msg )
> {
> case 'А..п':msg= char(AnsiString(msg)-*64*);


Тут две ошибки - во первых та case-ов в C не бывает. во вторых - забыл
поставить break.

со switch придется делать так :
case 'А': case 'Б': case 'В':
... и так далее ...
case 'п':
msg= char(AnsiString(msg)-64);
break;

case 'р': case 'с': case 'т':
... и так далее ...
case 'я':
msg= char(AnsiString(msg)-64);
break;


или без него:

if (msg >= 'А' && msg <= 'п')
msg= char(AnsiString(msg)-64);
else if (msg >= 'р' && msg <= 'я')
msg= char(AnsiString(msg)-16);
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.11.2007, 15:16:51
    #34916735
AndrewP_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Ошибка здесь:
авторfor (i=1; msg.Length();i++)

Надо:
Код: plaintext
for (i= 1 ; i<=msg.Length();i++)
...
Рейтинг: 0 / 0
05.11.2007, 15:28:04
    #34916762
Orb*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
AndrewP_Ошибка здесь:
авторfor (i=1; msg.Length();i++)

Надо:
Код: plaintext
for (i= 1 ; i<=msg.Length();i++)


выражения равносильны, Вообщето
...
Рейтинг: 0 / 0
05.11.2007, 15:37:59
    #34916790
Orb*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
teras
Orb* wrote:
> Функция переводит каракули ,в консоле, на русский язык, все компилиться
> тока когда запускаеться вылетает AV, подскажите где ошибка
>
....
> switch (msg )
> {
> case 'А..п':msg= char(AnsiString(msg)-*64*);


Тут две ошибки - во первых та case-ов в C не бывает. во вторых - забыл
поставить break.

со switch придется делать так :
case 'А': case 'Б': case 'В':
... и так далее ...
case 'п':
msg= char(AnsiString(msg)-64);
break;

case 'р': case 'с': case 'т':
... и так далее ...
case 'я':
msg= char(AnsiString(msg)-64);
break;


или без него:

if (msg >= 'А' && msg <= 'п')
msg= char(AnsiString(msg)-64);
else if (msg >= 'р' && msg <= 'я')
msg= char(AnsiString(msg)-16);

так то оно так, да вот AV никуда не исчезла ((((
...
Рейтинг: 0 / 0
05.11.2007, 17:15:49
    #34916965
Leshij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
On Mon, 05 Nov 2007 15:28:04 +0300, Orb* <nospam@sql.ru>; wrote:

> выражения равносильны, Вообщето
Кто вам сказал?
for (x; y; z)
Выражение y вычисляется перед каждым витком цикла, и если возвращает
истину, цикл продолжается. GetLength() на каждой итерации вернет не-ноль,
что трактуется как true, и цикл никогда не закончится.
--
Здесь у нас туманы и дожди, здесь у нас холодные рассветы,
Здесь на неизведанном пути ждут замысловатые сюжеты!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.11.2007, 18:25:28
    #34917061
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Orb* wrote:
> AndrewP_
> Ошибка здесь:
> автор
> for (i=1; msg.Length();i++)
>
> Надо:
>
> for (i=1; i<=msg.Length();i++)
>
> выражения равносильны, Вообщето

Нет, не равносильны - в первом цикле отсутствует проверка условия
окончания, а значит он никогда не заканчивается (если строка не пуста),
обращаясь на чтение/запись за пределами строки - отсюда и AV.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.11.2007, 19:17:03
    #34917136
Koka_SS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
Orb*Функция переводит каракули ,в консоле, на русский язык, все компилиться тока когда запускаеться вылетает AV, подскажите где ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
AnsiString rus(AnsiString msg)
{
 int i;
 for (i= 1 ; msg.Length();i++)
 {
  switch (msg[i])
   {
    case 'А..п':msg[i]= char(AnsiString(msg[i])- 64 );
    case 'р..я':msg[i]= char(AnsiString(msg[i])- 16 );
   }
 }
 return msg;
}

void main()
{
 printf("%s",rus("Привет"));
 getch();

}


и что компилятор не ругается на такой Case?
...
Рейтинг: 0 / 0
05.11.2007, 19:37:04
    #34917158
Koka_SS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
так отлично работает
char* rus_code(char* msg)
{
int i;

for(i=0; ( i < strlen(msg))&&( i < 255 );i++ )
{
if( (msg >= 'А') && (msg <= 'п') )
{
msg = msg - 64;
}
if( (msg >= 'р') && (msg <= 'я') )
{
msg = msg - 16;
}
}
return msg;
}

int main()
{
char str[255];


strcpy( str,"привет");
printf("%s", rus_code(str) );


return 0;
}

когда ты передаеш rus_code("привет") то под строку "привет" выделяется память
в которую нельзя писать а при
msg = msg - 16;
идет попытка записи и вызывается исключение :)
...
Рейтинг: 0 / 0
05.11.2007, 19:40:08
    #34917160
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консоль С++, устранить ошибку
А с чего ему ругаться опреатор [] верняк возвращает char или wcahrб а они типы целочисленные
PS А что так много внимания такому ничтожному вопросу, неужто так сложно нарисовать codecvt
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Консоль С++, устранить ошибку / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]