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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача std::string через strnicmp в realloc, некорректная передача 
:(
    Опции темы
Syberex
Дата 4.12.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть функция собственная
Код

unsigned long*  FindWordMass(char* pointer, char* word)
  {
     unsigned long LenFile=strlen(pointer);
     unsigned long kolSlov=0;
     unsigned long *answer;
     answer=(unsigned long*)malloc(1);  // задание начального размера массива
     unsigned long poz=0; // для цикла по длине файла
     unsigned long LenthWord=0;     // для определения длины слова в массиве
     unsigned long LenthPoiskWord=0;  // для определения длины переданного слова
     LenthPoiskWord=strlen(word);  // вычисляем длину слова
     while(poz<LenFile)     // цикл
        {
           if(pointer[poz]!='\n')   // если не энтер то
             {
             LenthWord++;    // увеличить длину слова на 1
             }  else         // иначе
                 {
                   if(LenthWord==LenthPoiskWord)
                    {
                      if(strnicmp(word,(&pointer[poz]-LenthWord),LenthWord)==0)
                          {
                          kolSlov++;
                          answer=(unsigned long*)realloc(answer,kolSlov);
                          answer[kolSlov]=poz-LenthWord;
                          answer[0]=kolSlov;
                          };
                     };
                 LenthWord=0;
                 };
        poz++;
        };
    return answer;
  }


передаю ей указатель массива и слово посредством 

Код

char word[50];
cin>>word;
unsigned long*  FindWordMass(char* mas, char* word);
unsigned long*  mass2=FindWordMass(mass,word);
for(unsigned int y=0;y<(mass2[0])+1;y++)
cout<<mass2[y]<<endl;
free(mass2);


всё работает супер, но когда я пытаюсь передать тоже слово которое нужно найти то очень сильно ругается компилятор когда уже стартует прога, но сразу компилит и ошибок не выдаёт. Делаю так

Код

std::string WordFromArray(pointer,(poz-LenthWord),LenthWord);
char * WordArray=new char[WordFromArray.size()+1];  
strcpy(WordArray,WordFromArray.c_str());
unsigned long * mass2=FindWordMass(pointer,WordArray);
for(unsigned int y=0;y<(mass2[0])+1;y++);
cout<<mass2[y]<<endl;
free(mass2);


массиве все слова разделены энтером '\n'. в чём трабла? думаю как то не корректо идёт передача std но как надо чтоб работало?


моя функция принимает в качестве параметра указатель на массив и указатель на слово, после этого ищет в массиве слова и подсчитывает количество их и адреса(позицию в массиве) заносит в массив где были найдены слова.


не использую new потому, что в цикле переназначение длины массива, думаю с realloc быстрее и удобней.



Это сообщение отредактировал(а) Syberex - 4.12.2006, 17:12
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
JackYF
Дата 4.12.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

Репутация: 18
Всего: 162



Syberex, а тэги кода? ну неудобно же читать...
Исправь, пожалуйста...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 4.12.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата

то очень сильно ругается компилятор когда уже стартует прога, но сразу компилит и ошибок не выдаёт.


Какой злой компилятор. Откомпилил, запустил и ругается!
 smile 
А если серьезно - то лияно я ничего не понял из вопроса.

Например, что должна делать функция FindWordMass, на какой строчке выскакивает ошибка (и какая ошибка), и если не трудно воспользоваться тегами, чтобы код можно было нормально прочитать
PM MAIL ICQ   Вверх
JackYF
Дата 4.12.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

Репутация: 18
Всего: 162



Цитата(Syberex @  4.12.2006,  16:45 Найти цитируемый пост)
free(mass2);


Это к чему? Во-первых, где выделение того, что ты удаляешь...
Во-вторых, почему не new/delete?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Syberex
Дата 4.12.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



компилятор пишет что память не может быть рид, ну видно что-то не туда залезло. smile

Добавлено @ 17:16 
free(mass2); это потому, что моя функция возвращает указатель на массив созданной функцией alloc
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
JackYF
Дата 4.12.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

Репутация: 18
Всего: 162



А ты проверяешь, что тебе realloc возвращает?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Syberex
Дата 4.12.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



в первом случае всё правильно работает и выводит кучу значений правильных, это когда через cin , во втором случае уже бред какой то и ошибку выдаёт и воводит полный бред кучу нулей адресов явно не моих.
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
JackYF
Дата 4.12.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

Репутация: 18
Всего: 162



Syberex,
как минимум realloc может не сделать ничего! То есть не выделить тебе память под твои нужды... Ты должен это проверять.
Код

void* res = realloc(answer,kolSlov);
if ( res )
{
  answer = res;
  ...
}
else
{
  throw std::bad_alloc;
}

А вообще, ИМХО...

либо выдели про запас
либо пользуйся new/delete с перевыделением по нужде.

А вообще, чем тебе std::vector<...> не подходит под твои нужды?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Mayk
Дата 4.12.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Syberex @  4.12.2006,  20:45 Найти цитируемый пост)
answer=(unsigned long*)realloc(answer,kolSlov);

realloc выделяет байты. А не long'и. realloc(answer,kolSlov) выделит kolSlov байт, а не long'ов.
Для того чтобы выделить память достаточную для размещению kolSlov longов надо делать realloc(kolSlov*sizeof(long)). 

Цитата(Syberex @  4.12.2006,  20:45 Найти цитируемый пост)

answer=(unsigned long*)malloc(1);  // задание начального размера массива

здесь тоже надо домножить на sizeof(long).

Правда лучше забить на эти сишные ф-ции и использовать
Цитата(JackYF @  4.12.2006,  22:19 Найти цитируемый пост)
std::vector





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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