Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция два раза подряд не.... не понял юмора 
:(
    Опции темы
apook
Дата 6.8.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Ни как не врублюсь. Есть функция возврашающая -1 в случае ошибки
Так вот если запустить ее один раз с параметро заведомо  возращающими
 > -1  все отлично а если сразу запустить ее же с теми же параметрами то
она возвращает -1 (ну или правильно >0  как будет настроение) Тенденцию
при каких случаях она все же нормально сробатывает я так и не уловил
Понял одно : ECЛИ после первого запуска написать printf (" ");  или
 cout << " "; то второй раз срабатывает правильно.


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
vinter
Дата 6.8.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Давай текст ф-ии.. smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
apook
Дата 6.8.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



?? Название естественно не принципиально
Код

int strccmp(const char *sstr, const char *samplestring, int flg)
{
int n, i, a, wn, x, ex, ret;
i = strlen(sstr); //длина основной строки

ret = -1;
x = ret;
a = 0;
n = 0; //счетчик

for (n=0; n < i; n++)
    {
     if (strlen(samplestring) > i) break; //если длина подстроки больше длины основной строки выход из цикла 
     wn = n; //счетчик для основной строки равен общему счетчику

     while(wn < i)//проверка продолжается пока счетчик для подстроки меньше длины основной строки
         {
          if (sstr[wn] == samplestring[a])
              { //если символ из основной строки совпал с символом подстроки
               if (ret < 0) ret = wn; //удачно(совпал один символ(первое вхождение))
               if (a == (strlen(samplestring) - 1))
                    {
                     ex = 1; //удачно(совпали все символы)
                     break;
                         }
               a++; //счетчик верных вхождений (от него и все символы за ним должны совпасть)
               wn++;
                   }
           else
               {//неудачно
                ret = -1;
                a = 0; //если один из символов не совпал, счетчик верных вхождений обнуляется  
                break; 
                    }

              }
          if (ex == 1) break; //получен код 1(удачно)пора прекращать сравнение
         }
if ((flg == 'L' || flg == 'l') && ret > -1) x = ret;
else if ((flg == 'R' || flg == 'r') && ret > -1) x = wn;
return x;
   }
/*конец функции strccmp*/



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
ptr
Дата 6.8.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Да что-то ты намудрил. Покажи как вызываешь функцию. И ещё поясни что она делает, например, зачем нужен flg.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
vinter
Дата 6.8.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



У меня вот так работает без проблем...Всегда инициализируй переменные когда их определяешь, т.к может быть исп. неинициализированная переменная из за чего могут быть "глюки". Как раз из за неинициализации у меня тоже ошибочно выводило..
Код

#include<iostream>
#include <string.h>
using namespace std;
int str(const char *sstr, const char *samplestring, int flg);
int main()
{
    int v = 0;
    char s[] = "asd";
         char s1[] = "asd";
    char s2[] = "ghy";
    char s3[] = "ghyt";
    v = str(s, s1, 'L');
    v = str(s, s1, 'L');
    v = str(s2, s1, 'L');
    v = str(s, s1, 'L');
    v = str(s1, s3, 'L');
    return 1;
}



int str(const char *sstr, const char *samplestring, int flg)    
{    
int n = 0, i = 0, a = 0, wn = 0, x = 0, ex = 0, ret = -1;    
i = strlen(sstr); //длина основной строки    
ret = -1;    
for (n=0; n < i; n++)    
    {    
     if (strlen(samplestring) > i) break; //если длина подстроки больше длины основной строки выход из цикла    
     wn = n; //счетчик для основной строки равен общему счетчику    
     while(wn < i)//проверка продолжается пока счетчик для подстроки меньше длины основной строки    
         {    
          if (sstr[wn] == samplestring[a])    
              { //если символ из основной строки совпал с символом подстроки    
               if (ret < 0) ret = wn; //удачно(совпал один символ(первое вхождение))    
               if (a == (strlen(samplestring) - 1))    
                    {    
                     ex = 1; //удачно(совпали все символы)    
                     break;    
                         }    
               a++; //счетчик верных вхождений (от него и все символы за ним должны совпасть)    
               wn++;    
                   }    
           else    
               {//неудачно    
                ret = -1;    
                a = 0; //если один из символов не совпал, счетчик верных вхождений обнуляется    
                break;    
                    }    
              }    
          if (ex == 1) break; //получен код 1(удачно)пора прекращать сравнение    
         }    
if ((flg == 'L' || flg == 'l') && ret > -1) x = ret;    
else if ((flg == 'R' || flg == 'r') && ret > -1) x = wn;    
return x;    
   }    
/*конец функции strccmp*/    

Цитата

 ECЛИ после первого запуска написать printf (" ");  или
 cout << " "; то второй раз срабатывает правильно.

Совпадение smile  
Цитата

зачем нужен flg.

Тоже кстати не понял smile поставил просто 'L'


--------------------
Мой блог
PM MAIL WWW   Вверх
apook
Дата 6.8.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

Покажи как вызываешь функцию


Вызывал в целях тестирования по разному, во всех случаях имеется тенденция к этому глюку Например:


x = strccmp(buf, argv[1], 'L');
тут-же
y = strccmp(buf, argv[1], 'L');
cout << x << "  " << y << endl;
Получим 15  -1
и т.д Я уже не говорю о включении в оператор if если к примеру надо зделать так: if ((strccmp(......,'R') > -1) && (strccmp(.....,'L') < 20))
Цитата

зачем нужен flg

вообще это поиск подстроки в строке(стандартные одолели своей ограниченностью) flg по замыслу типа флаг Параметер L - left R-right т.е слева или справа Надо понимать вернуть первое вхождение или последнее
Цитата

Совпадение

Совпадение не совпадение а всегда сробатывает Но конечно не серьезно
использовать такой "прием"
Цитата

Всегда инициализируй переменные 

Ща испытаю эту фишку





--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 6.8.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

Всегда инициализируй переменные 

Совет и впрямь оказался полезным

А тогда почему бы компилятору так не делать или в целях экономии времени
Ну в общем причины могут быть (например экономия времениuser posted image)


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
vinter
Дата 6.8.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

А тогда почему бы компилятору так не делать или в целях экономии времени

так он инициализирует только произвольными значениями...


--------------------
Мой блог
PM MAIL WWW   Вверх
Mayk
Дата 6.8.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(apook @  6.8.2006,  18:00 Найти цитируемый пост)

А тогда почему бы компилятору так не делать или в целях экономии времени

Потому что это затратит нехилое CPU-шное время. Особенно в циклах.
Код

while(sth){
  char a_lot_of_memory[1024*1024];
  readFromFileTo(a_lot_of_memory);
}

Ну и зачем здесь инициализировать мегабайт памяти, который будет изменён в следующей же инструкции?

Это сообщение отредактировал(а) Mayk - 6.8.2006, 14:36


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Oleg_Ci
Дата 6.8.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Мой велосипед smile 
Код

#include<iostream>
#include<cstdlib>
#include <cstring>
using namespace std; 

int strccmp(const char *str, const char *control, int flg);

void main()    
{    
    char *s = "asdfghjkl";
    char *c = "gh";
    cout << s << endl << c << endl;
    cout << strccmp( s, c, 'l' ) << endl;
    system("pause");
}
////////////////////////////////////////////////////////////////

int strccmp(const char *str, const char *control, int flg)
{
    const char *s = str;
    const char *c = control;
    while ( *s )
    {
        if ( *s == *c )
        {
            if(!*(++c))  break; 
        } else c = control;
        s++;
    }
    if ( !*s ) return -1;
    if (flg == 'L' || flg == 'l') return s - str - strlen( control ) + 1;
    else if (flg == 'R' || flg == 'r') return (int)strlen(s) -2 + c - control;
    return -1;
}

PM MAIL   Вверх
BreakPointMAN
Дата 6.8.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(Mayk @  6.8.2006,  15:27 Найти цитируемый пост)
Ну и зачем здесь инициализировать мегабайт памяти? 

Это уже гигабайт получается... ;)


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Mayk
Дата 6.8.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(BreakPointMAN @  6.8.2006,  19:01 Найти цитируемый пост)

Это уже гигабайт получается... ;)

 fixed  smile  




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
apook
Дата 6.8.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

Мой велосипед

Конечно с флагом R перестарался можно просто к первому вхождению
прибавить стрлен он строки dest .Но ниче пригодится . Короче в следующих великах.... 

Цитата

так он инициализирует только произвольными значениями...

Аааа !! понял !! (почти) но не важно

Это сообщение отредактировал(а) apook - 6.8.2006, 16:26


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
ManiaK
Дата 9.8.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(apook @  6.8.2006,  16:08 Найти цитируемый пост)
так он инициализирует только произвольными значениями...

Шо, rand для каждого байтика что ли запускает? smile  smile  smile 
Не инициализирует он их.

Кстати, шестая студия в Debug-сборке забивает всю выделяемую раму определёнными значениями (по-моему нулями), а в Release - нет. Поэтому иногда в Debug программы, где не инициализируются переменные нормально работают, а хочешь релизнуть - хоть вешайся... smile 
PM MAIL WWW   Вверх
vinter
Дата 9.8.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

Не инициализирует он их.

Да ну?? то есть создал переменную и все, там ничего нет??Какое либо значение в ней все равно содержится!
И как это не назови инициализация или нет все равно у переменной есть какое-то значение!
Цитата

Шо, rand для каждого байтика что ли запускает?

Нет просто берет мусор из памяти



--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.