Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2008, 08:34   #1
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
Вопрос c++ Builder, проблема с памятью

в общем есть расчетная программа (достаточно большая), выполняющая кучу арифметических операций. притом работа так же идет и со строками (входные данные) и указателями. но вот какая проблема: время от времени вылетает с ошибками (ссылается на память и выдает Invalid pointer operation...) притом что если запустить на расчет еще раз с теми же данными (не выходя из программы), то иногда считает, а иногда просто виснет
подскажите в чем проблема? кто либо сталкивался с таким? или же это просто у меня с памятью проблемы?
Учиться, учиться и еще раз учиться
Ламер_001 вне форума Ответить с цитированием
Старый 20.11.2008, 10:21   #2
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

погонял 2 часа на тестах, в общем ошибка с указателем на файл:

Код:
   
   char *temp = CB_Pot_1->Text.c_str(); /* некий чекбокс в котором перечисляются имена файлов без расширения */
   strcat(temp,".txt \0"); /* добавляем расширение */
   FILE *file = fopen(temp, "r"); /* вот тут выдает ошибку */ 
в чем дело не пойму. причем при первом проходе ошибка, а при повторном все нормально... %)
Учиться, учиться и еще раз учиться

Последний раз редактировалось Ламер_001; 20.11.2008 в 10:23.
Ламер_001 вне форума Ответить с цитированием
Старый 20.11.2008, 17:10   #3
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Ламер_001, ошибка в строчке выше, в:
Код:
strcat(temp,".txt \0");
Место для прибавления расширения откуда в temp? Тем более, что c_str() вообще должен возвращать const char*, а не просто char*
filosof_x86 вне форума Ответить с цитированием
Старый 20.11.2008, 21:11   #4
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

а кто сказал что константу нельзя писать в переменную? int x = 10; то же самое: пишешь в переменную x константу 10
gargon поподробней нельзя? там куча книг. все читать особо времени нет
Учиться, учиться и еще раз учиться

Последний раз редактировалось Ламер_001; 20.11.2008 в 21:15.
Ламер_001 вне форума Ответить с цитированием
Старый 20.11.2008, 21:26   #5
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

Ты пройди отладчиком и посмотри что заносится в твою temp после strcat...
Ну а потом мы уже будем думать!
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 23:01   #6
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Ламер_001, константность гарантирует не изменение объекта. Для случая:
Код:
const int a = 10;
int b = a;
Все нормально, т.к. объект a при копировании не будет изменен. Но так:
Код:
const int a = 10;
int &b = a;
делать нельзя, т.к. ссылка не константа, то по ней может быть изменен объект, что недопустимо для объекта a. Надо делать так:
Код:
const int a = 10;
const int &b = a;
что бы гарантировать невозможность изменения a.

Но главный вопрос (точнее ответ на твой вопрос где ошибка) состоит в том, а откуда лишняя память под расширение?
filosof_x86 вне форума Ответить с цитированием
Старый 21.11.2008, 08:49   #7
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

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

const int a = 10;
int b = a;

и при

const int a = 10;
int &b = a;

одинаковы и значение константы остается таким же:
Код:
 const int a = 10;
 int &b = a;
 int c = 12;
 b = c;
 printf("%d %d", a ,b);
а вот такая программа работает именно так как ты и описал:
Код:
 int a = 10;
 int &b = a;
 b = -1;
 printf("%d %d", a, b);

а память выделять должна strcat:
"Header File

string.h, mbstring.h

Category

Memory and String Manipulation Routines, Inline Routines

Prototype

char *strcat(char *dest, const char *src);

wchar_t *wcscat(wchar_t *dest, const wchar_t *src);

unsigned char *_mbscat(unsigned char *dest, const unsigned char *src);

Description

Appends one string to another.

strcat appends a copy of src to the end of dest. The length of the resulting string is strlen(dest) + strlen(src).

Return Value

strcat returns a pointer to the concatenated strings."

иначе как бы она выполянла "appends a copy of src to the end of dest" без "лишней" памяти?

StarWorm,
в temp заносится путь к файлу. все равно не работает. самое смешное что если даже вместо temp в fopen записать явно путь к файлу ("c:\\file.txt"), то все равно не находит.

в общем решил не мучаться а в чекбокс дописать расширения и оттуда сразу брать имена. вроде заработало. всем спасибо.
Учиться, учиться и еще раз учиться

Последний раз редактировалось Ламер_001; 21.11.2008 в 08:57.
Ламер_001 вне форума Ответить с цитированием
Старый 21.11.2008, 18:48   #8
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Ламер, сравни:
Код:
const char* constStr = "cool";
const char* temp = constStr;
temp[2] = 'c';
и
Код:
const char* constStr = "cool";
char* temp = constStr;
temp[2] = 'c';
Чувствуешь разницу?

Цитата:
а память выделять должна strcat:
Ничего подобного.
strcat

Цитата:
strcat(temp,".txt \0");
И зачем тут \0?
still_alive вне форума Ответить с цитированием
Старый 21.11.2008, 20:46   #9
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Ламер_001 Посмотреть сообщение
уважаемый filosof_x86, предлагаю вам лично убедится в том что результаты работы программы при

const int a = 10;
int b = a;

и при

const int a = 10;
int &b = a;

одинаковы и значение константы остается таким же:
Код:
 const int a = 10;
 int &b = a;
 int c = 12;
 b = c;
 printf("%d %d", a ,b);
Никакого результата быть не может, т.к. нормальный компилятор не скомпилирует программу. Проверяем:
Тестируемый код:
Код:
#include <cstdio>

int main()
{
	const int a = 10;
	int &b = a;
	int c = 12;
	b = c;
	printf("%d %d", a ,b);
}
1) VS2005
Ошибка компиляции:
Цитата:
main.cpp(6) : error C2440: 'initializing' : cannot convert from 'const int' to 'int &'
2) gcc
Ошибка компиляции:
Цитата:
main.cpp: In function `int main()':
main.cpp:6: error: invalid initialization of reference of type 'int&' from expression of type 'const int'
--------------------------------------------------------------------------------------

То, что компилятор от Борланда собрал этот код, говорит лишь о попустительстве самого Борланда, а не о моем незнании вещей. Все выше изложенное мной прописано в стандарте (хотя чтобы все это узнать, необязательно лезть в описание стандарта, достаточно взять более-менее нормальную книгу). Впрочем, Билдер никогда не мог похвастаться хорошим компилятором – хорошо, если багов нет, что уж говорить о следовании стандартам...

Цитата:
Сообщение от Ламер_001 Посмотреть сообщение
а память выделять должна strcat:
иначе как бы она выполянла "appends a copy of src to the end of dest" без "лишней" памяти?
Без "лишней" памяти strcat() залезет за пределы той памяти, что есть у нас в распоряжении. Память strcat() выделять недолжна, "лишнюю" память должен обеспечить сам программист.
filosof_x86 вне форума Ответить с цитированием
Старый 22.11.2008, 11:59   #10
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

ладно хорошо сдаюсь) всем еще раз спасибо. проблема решена.
Учиться, учиться и еще раз учиться
Ламер_001 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с памятью процесса JRcoker Win Api 10 18.07.2009 22:22
Проблема с памятью в С++ rJIaBkoM Помощь студентам 1 14.06.2008 14:25
динамическое управление памятью oblom Общие вопросы C/C++ 12 16.02.2008 15:24
Проблема с C++ Builder 6 Kocapb Софт 0 18.11.2007 18:54
Работа с памятью Shurik Hacker Общие вопросы Delphi 7 22.06.2007 20:51