простой пример
От: Andruxa-1  
Дата: 09.01.10 12:13
Оценка: :))) :)
Добрый день! Накропал простенькую ф-цию — реверс. Ф-ция не работает — не меняет местами элементы.
В отладке выдает унайбл экцепишн. Компилятор 6 студия.
Кривые руки?

#include "stdafx.h"
#include "iostream.h"
#include "string.h"

void reverse(char *str, int count = 0)
{
    char tch;

    if(!count)
        count = strlen(str) - 1;

    for(int i = 0, j = count; i < count; i++, j--)
    {
        tch = str[i];
        str[i] = str[j]; //Не меняет местами
        str[j] = tch;
    }
}

int main(int argc, char* argv[])
{
    char *str = "1234567890";

    reverse(str, 5);
    reverse(str);

    cout << str;

    return 0;
}
Re: простой пример
От: Turyst  
Дата: 09.01.10 12:40
Оценка:
Здравствуйте, Andruxa-1, Вы писали:

A1>Добрый день! Накропал простенькую ф-цию — реверс. Ф-ция не работает — не меняет местами элементы.

A1>В отладке выдает унайбл экцепишн. Компилятор 6 студия.
A1>Кривые руки?

A1>
A1>#include "stdafx.h"
A1>#include "iostream.h"
A1>#include "string.h"

A1>void reverse(char *str, int count = 0)
A1>{
A1>    char tch;

A1>    if(!count)
A1>        count = strlen(str) - 1;

A1>    for(int i = 0, j = count; i < count; i++, j--)
A1>    {
A1>        tch = str[i];
A1>        str[i] = str[j]; //Не меняет местами
A1>        str[j] = tch;
A1>    }
A1>}

A1>int main(int argc, char* argv[])
A1>{
A1>    char *str = "1234567890";

A1>    reverse(str, 5);
A1>    reverse(str);

A1>    cout << str;

A1>    return 0;
A1>}
A1>


Хмм, ну ты вроде два раза меняешь местами элементы, по этому и кажется, что они не поменялись местами
Цикл должен идти до половины массива.
Re: простой пример
От: LaptevVV Россия  
Дата: 09.01.10 12:43
Оценка: 3 (1)
Здравствуйте, Andruxa-1, Вы писали:

A1>Добрый день! Накропал простенькую ф-цию — реверс. Ф-ция не работает — не меняет местами элементы.

A1>В отладке выдает унайбл экцепишн. Компилятор 6 студия.
A1>Кривые руки?

A1>
A1>#include "stdafx.h"
A1>#include "iostream.h"
A1>#include "string.h"

A1>void reverse(char *str, int count = 0)
A1>{
A1>    char tch;

A1>    if(!count)
A1>        count = strlen(str) - 1;

A1>    for(int i = 0, j = count; i < count; i++, j--)
A1>    {
A1>        tch = str[i];
A1>        str[i] = str[j]; //Не меняет местами
A1>        str[j] = tch;
A1>    }
A1>}
A1>int main(int argc, char* argv[])
A1>{
A1>    char *str = "1234567890";

A1>    reverse(str, 5);
A1>    reverse(str);

A1>    cout << str;

A1>    return 0;
A1>}
A1>

1. Стандартные подключаемые файлы пишутся в угловых скобках, например <iostream.h>
2. В качестве аргумента передается указатель на константу. Не зннаю, как в шестерке, а в дотнете тут точно будет засада — константу изменять нельзя.
3. В цикле j < count; — помысли-ка на д этим...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: простой пример
От: Andruxa-1  
Дата: 09.01.10 16:14
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>1. Стандартные подключаемые файлы пишутся в угловых скобках, например <iostream.h>

Угу.
LVV>2. В качестве аргумента передается указатель на константу. Не зннаю, как в шестерке, а в дотнете тут точно будет засада — константу изменять нельзя.
Пример был взят из книжки Шилдта "Самоучитель С++ 3 изд. дополненное и переработанное" стр.540 8 реш. Вот так.
И как мне теперь доверять всему тому, что я прочитал в ней?
LVV>3. В цикле j < count; — помысли-ка на д этим...
в коде указано i < count. Но и тут ошибка, если следовать этому, то проходить будет весь массив, а count задает интервал,
поэтому нужно i < j тогда будет только заданный интервал.
Re[3]: простой пример
От: LaptevVV Россия  
Дата: 09.01.10 18:53
Оценка:
Здравствуйте, Andruxa-1, Вы писали:

A1>Здравствуйте, LaptevVV, Вы писали:


LVV>>1. Стандартные подключаемые файлы пишутся в угловых скобках, например <iostream.h>

A1>Угу.
LVV>>2. В качестве аргумента передается указатель на константу. Не зннаю, как в шестерке, а в дотнете тут точно будет засада — константу изменять нельзя.
A1>Пример был взят из книжки Шилдта "Самоучитель С++ 3 изд. дополненное и переработанное" стр.540 8 реш. Вот так.
A1>И как мне теперь доверять всему тому, что я прочитал в ней?
LVV>>3. В цикле j < count; — помысли-ка на д этим...
A1>в коде указано i < count. Но и тут ошибка, если следовать этому, то проходить будет весь массив, а count задает интервал,
A1>поэтому нужно i < j тогда будет только заданный интервал.

Ну, это просто говорит о том, что книгам Шилдта доверять не стОит. Или всен проверять. Бывают просто опецитки. Мы как-то взяли и набили его парсер арифметических выражений из какой-то его книжки. Обнаружили три ошибки, но все три можно было отнести к опечаткам — вроде того, что буква не та использовалась, или одна скобка вместо другой.
В книжках часто такое бывает — издательству нужно получать прибыль...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: простой пример
От: Andruxa-1  
Дата: 09.01.10 20:46
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Ну, это просто говорит о том, что книгам Шилдта доверять не стОит. Или всен проверять. Бывают просто опецитки. Мы как-то взяли и набили его парсер арифметических выражений из какой-то его книжки. Обнаружили три ошибки, но все три можно было отнести к опечаткам — вроде того, что буква не та использовалась, или одна скобка вместо другой.

LVV>В книжках часто такое бывает — издательству нужно получать прибыль...
Ну! Там вроде должон сидеть тех редактор (etc) и ошибка на опечатку не похожа — строковый литерал + указатель на него = const char* (вроде)
Re[3]: простой пример
От: ilopX  
Дата: 09.01.10 21:32
Оценка:
Здравствуйте, Andruxa-1, Вы писали:


A1>Пример был взят из книжки Шилдта "Самоучитель С++ 3 изд. дополненное и переработанное" стр.540 8 реш. Вот так.

A1>И как мне теперь доверять всему тому, что я прочитал в ней?
LVV>>3. В цикле j < count; — помысли-ка на д этим...
A1>в коде указано i < count. Но и тут ошибка, если следовать этому, то проходить будет весь массив, а count задает интервал,
A1>поэтому нужно i < j тогда будет только заданный интервал.

Наверное Шилдта имел в виду:


void revers(char * pText)
{
    int coutText = strlen(pText);

    if (coutText <= 0)
        return;

    char tmpChe = '\0';

    int j = coutText-1;
    
    coutText /= 2;

    for (int i = 0; i < coutText; i++)
    {
        tmpChe = pText[i];
        pText[i] = pText[j];
        pText[j] = tmpChe;
        --j;
    }

    return;
}
Re[4]: простой пример
От: Andruxa-1  
Дата: 09.01.10 21:44
Оценка:
Здравствуйте, ilopX, Вы писали:

X>Наверное Шилдта имел в виду: ...


Ну как один из вариантов
Re[5]: простой пример
От: ilopX  
Дата: 09.01.10 22:12
Оценка:
Конечно очень неприятно когда прочитал пол книги, а потом вылазит такое.
Вот так думаю получше будет и интервалом

inline void revers_(char * pText, int coutText )
{
    if (coutText <= 0)
        return;

    char tmpChe = '\0';

    int j = coutText-1;
    
    coutText /= 2;

    for (int i = 0; i < coutText; i++)
    {
        tmpChe = pText[i];
        pText[i] = pText[j];
        pText[j] = tmpChe;
        --j;
    }

    return;
}


void revers(char *pStr, int interval = 0)
{
    int coutText = strlen(pStr);
    
    if ((!interval) || (interval >= coutText)) 
    {
        revers_(pStr, coutText);
        return;
    }

    revers_(pStr, interval);
    return;
}
Re: простой пример
От: FoolS.Top Армения  
Дата: 09.01.10 22:26
Оценка: 3 (1)
Здравствуйте, Andruxa-1, Вы писали:

A1>Добрый день! Накропал простенькую ф-цию — реверс. Ф-ция не работает — не меняет местами элементы.

A1>В отладке выдает унайбл экцепишн. Компилятор 6 студия.
A1>Кривые руки?

A1>
A1>#include "stdafx.h"
A1>#include "iostream.h"
A1>#include "string.h"

A1>void reverse(char *str, int count = 0)
A1>{
A1>    char tch;

A1>    if(!count)
A1>        count = strlen(str) - 1;

A1>    for(int i = 0, j = count; i < count; i++, j--)
A1>    {
A1>        tch = str[i];
A1>        str[i] = str[j]; //Не меняет местами
A1>        str[j] = tch;
A1>    }
A1>}

A1>int main(int argc, char* argv[])

A1>{
A1>    //char *str = "1234567890"; // Здесь str - указатель на константу, менять через него "1234567890" нельзя
          char str[] = "1234567890";

A1>    reverse(str, 5);
A1>    reverse(str);

A1>    cout << str;

A1>    return 0;
A1>}
A1>
Feierlich, misterioso
Re[2]: простой пример
От: alexeiz  
Дата: 10.01.10 03:44
Оценка: 3 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>1. Стандартные подключаемые файлы пишутся в угловых скобках, например <iostream.h>


Нет такого стандартного хедера как <iostream.h>. Есть <iostream>.

Кстати, книжки Шилдта известны очень низким качеством. Никому не рекомендую их читать.

LVV>2. В качестве аргумента передается указатель на константу. Не зннаю, как в шестерке, а в дотнете тут точно будет засада — константу изменять нельзя.


Здесь происходит конверсия строковой константы к char*. Такое компилируется (gcc тоже компилирует, с предупреждением), но потом может упасть в runtime.

Вот так правильно:
    char str[] = "1234567890";
Re[3]: простой пример
От: LaptevVV Россия  
Дата: 10.01.10 05:54
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, LaptevVV, Вы писали:


LVV>>1. Стандартные подключаемые файлы пишутся в угловых скобках, например <iostream.h>

A>Нет такого стандартного хедера как <iostream.h>. Есть <iostream>.
Чел писал на VC6. Это было еще до стандарта...
A>Кстати, книжки Шилдта известны очень низким качеством. Никому не рекомендую их читать.
Да фиг знает. Некоторые — довольно ничего так.
LVV>>2. В качестве аргумента передается указатель на константу. Не зннаю, как в шестерке, а в дотнете тут точно будет засада — константу изменять нельзя.
A>Здесь происходит конверсия строковой константы к char*. Такое компилируется (gcc тоже компилирует, с предупреждением), но потом может упасть в runtime.
A>Вот так правильно:
A>
A>    char str[] = "1234567890";
A>

Эт да...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: простой пример
От: minorlogic Украина  
Дата: 11.01.10 06:04
Оценка:
Здравствуйте, Andruxa-1, Вы писали:

A1>Пример был взят из книжки Шилдта "Самоучитель С++ 3 изд. дополненное и переработанное" стр.540 8 реш. Вот так.

A1>И как мне теперь доверять всему тому, что я прочитал в ней?

Именно этой книге не доверять и выкинуть на помойку.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: простой пример
От: kvasya  
Дата: 11.01.10 07:16
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, Andruxa-1, Вы писали:


A1>>Пример был взят из книжки Шилдта "Самоучитель С++ 3 изд. дополненное и переработанное" стр.540 8 реш. Вот так.

A1>>И как мне теперь доверять всему тому, что я прочитал в ней?

M>Именно этой книге не доверять и выкинуть на помойку.


И вообще самоучителям не доверять.
Re[4]: простой пример
От: Lorenzo_LAMAS  
Дата: 11.01.10 10:08
Оценка:
A>>Кстати, книжки Шилдта известны очень низким качеством. Никому не рекомендую их читать.
LVV>Да фиг знает. Некоторые — довольно ничего так.

То, что книги Шилдта — порядочное дерьмо — факт в мире С/С++ довольно известный. Как я понимаю, исключений нет. Да и если приведенный фрагмент из его книги — то это еще раз показывает качество его книг и его "ничего" книги уже неинтересны, потому как ничего хорошего в них.

accu.org, 11 reviews:

* C/C++ Programmer's Reference 2ed. by Herbert Schildt

* C: The Complete Reference 4ed by Herbert Schildt

* C++ from the Ground Up by Herbert Schildt — Not recommended

* C++ from the Ground Up (2nd ed) by Herbert Schildt — Not recommended

* C/C++ Programmer's Reference by Herbert Schildt — Not recommended

* Expert C++ by Herbert Schildt — Not recommended

* Java Programmers Reference by Herbert Schildt&Joe O'Neil — Not recommended

* MFC Programming from the GROUND UP 2nd Ed by Herbert Schildt — Not recommended

* STL Programming from the Ground Up by Herbert Schildt — Not recommended

* Teach Yourself C++ 3ed by Herbert Schildt — Not recommended

* Windows NT 4 Programming from the Ground Up by Herbert Schildt — Not recommended

Of course, the code must be complete enough to compile and link.
Re: простой пример
От: rg45 СССР  
Дата: 11.01.10 11:42
Оценка: 3 (1)
Здравствуйте, Andruxa-1, Вы писали:

A1>Добрый день! Накропал простенькую ф-цию — реверс. Ф-ция не работает — не меняет местами элементы.

A1>В отладке выдает унайбл экцепишн. Компилятор 6 студия.
A1>Кривые руки?

A1>
A1>void reverse(char *str, int count = 0)
A1>{
A1>    char tch;

A1>    if(!count)
A1>        count = strlen(str) - 1;

A1>    for(int i = 0, j = count; i < count; i++, j--)
A1>    {
A1>        tch = str[i];
A1>        str[i] = str[j]; //Не меняет местами
A1>        str[j] = tch;
A1>    }
A1>}
A1>


Попридираюсь и я немножко.

Некорректное использование данной функции пока оставим за скобками, рассмотрим саму функцию:

Последние два пункта касаются популярного вопроса о преждевременной оптимизации/пессимизации, и часто являются поводом для споров. С одной стороны ну чего "экономить на спичках", оптимизатор и сам сделает все "как надо". С другой стороны, на оптимизатор надейся, а сам не плошай. Зачем писать хуже, если, совершенно ничего не теряя, можно написать лучше?

С учетом сказанного, я бы переписал так:
void reverse(char* p, size_t count)
{
  for(char* q = p + count - 1; p < q;)
    std::swap(*p++, *q--);
}

void reverse(char* p) { reverse(p, strlen(p)); }
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: простой пример
От: Andruxa-1  
Дата: 11.01.10 13:11
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Вот так правильно:

A>
A>    char str[] = "1234567890";
A>


Спасибо, разобрался — почитав Страуструпа
Re[5]: простой пример
От: Andruxa-1  
Дата: 11.01.10 13:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>accu.org, 11 reviews:


L_L>

L_L> * C/C++ Programmer's Reference 2ed. by Herbert Schildt

...

L_L> * Windows NT 4 Programming from the Ground Up by Herbert Schildt — Not recommended


ППЦ одним словом
Re: простой пример
От: Andruxa-1  
Дата: 11.01.10 13:14
Оценка: -3
Всем спасибо! тема закрыта! книги Шилдта — моча!
Re[2]: простой пример
От: Andruxa-1  
Дата: 11.01.10 13:19
Оценка:
Здравствуйте, rg45, Вы писали:

Самый развернутый ответ! Спасибо!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.