С++, нужна консультация по динамическому выделению памяти.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
С++, нужна консультация по динамическому выделению памяти. - 2008-04-15 02:36:06.383333
|
|
|
user545
Сообщений: 167
Оценки: 0
Присоединился: 2006-06-24 05:21:54
|
Есть массив: char *cEx[]={"строка1", "строка2" …. "строка10"}; Когда я начал работать над программой этот массив состоял из 10 строк и все меня более чем устраивало. Но со временем массив разросся до громадного размера. На сегодня массив состоит из более чем 500 строк, что неудобно, во первых код неудобочитаем, во вторых данные постоянно добавляются и при каждом добавлении приходилось заново перекомпилировать программу. Поэтому я вывел данные массива в отдельный файл из которого данные загружаются при старте программы. Т.е. поступил так: char cEx [1000][100]; char cFile[0x400]; // путь к файлу char cBuffer[155]; // буфер int iMax; // счетчик FILE *lst; iMax=0; strcpy(cBufFile,"%s\\файл.cfg"); // определяем путь к файлу if((lst=fopen(cBufFile,"r"))!=NULL) // открываем файл на чтение {// файл есть, все данные берем из него while(!feof(lst)) // пока не закончится файл { fgets(cBuffer,255,lst); // читаем строку в 255 символов или до символа конца строки /* … тут танцы с бубном над полученной строкой */ strcpy(cEx [iMax],cBuffer); // перекладываем из буфера в массив iMax++; // добавляем единицу к счетчику } fclose(lst); // закрываем файл } На сегодня, но только на сегодня, этот алгоритм меня устраивает. Но тут проблема в переменной cEx, точнее в ее размере, сейчас ее размер 1000, половина памяти которого пропадает в пустую. Но пройдет еще какое-то время, и этого объема будет не хватить, тогда заново придется определять размер и заново перекомпилировать. И опять половина объема будет пропадать в пустую. Я знаю что есть функции динамического выделения памяти (malloc, free, new, delete), но не разу еще ими не пользовался, подскажите как выделить память для cEx динамически.
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-15 12:52:52.160000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Во-первых попробуй юзать std::list<char *> str; А выделять просто. Допустим у тебя пользователь ввёл строку в екий буфер s. Тогда выделить память можно так: char *p; p = new char[strlen(s) + 1]; strcpy( p, s );. Освобождать память в таком случае нужно так: delete [] p;
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-15 18:05:18.926666
|
|
|
Absurd
Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
|
quote:
ORIGINAL: user545 Я знаю что есть функции динамического выделения памяти (malloc, free, new, delete), но не разу еще ими не пользовался, подскажите как выделить память для cEx динамически. Тут более полезна функция realloc, которая позволяет динамически увеличить размер памяти выделенной под указатель сохранив те данные которые в эту память записаны. Чтобы сложить этот паззл нужно три переменные char** array - динамический массив (указатель на память заполненную массивом указателей на char), size_t array_size - сколько ячеек в массиве уже заполнено, и size_t array_items_allocated - сколько ячеек выделено, так как размещать надо с запасом. Изначально array == null, array_items_allocated == 0, array_size == 0. В каждой итерации цикла проверяешь чтобы array_size < array_items_allocated. Если условие не выполняется то увеличиваешь array_items_allocated в два раза и делаешь array = (char**)realloc (array, array_items_allocated * sizeof(char*)). Realloc под нулевой указатель допустим, и работает как простой malloc. При первой итерации цикла нужно не умножать array_items_allocated на два, а присвоить ему какую-то константу, например 10. Переместить строчку из массива в динамическую память можно с помощью _strdup(), так что присавивание будет работать как array[index] = _strdup(cBuffer).
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-15 18:07:33.756666
|
|
|
Absurd
Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
|
PS: в конце работы программы надо удалить из динамической памяти все строчки, а потом и сам массив при помощи free()
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 01:14:19.356666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Не стоит изобретать велосипед, если не нужно чрезмерной оптимизации. Для повледневных задач гораздо проще воспользоваться STL.
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 02:15:48.320000
|
|
|
Absurd
Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
|
quote:
ORIGINAL: _SaZ_ Не стоит изобретать велосипед, если не нужно чрезмерной оптимизации. Для повледневных задач гораздо проще воспользоваться STL. Если уже есть работающий Си-код пусть даже и с расширением cpp, то почему бы не оставаться в рамках Си?
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 18:00:25.743333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ну это да =)
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-29 12:38:19.343333
|
|
|
provider
Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
|
найдите пожалуйста ошибку //================================================ // Cross and Null // Alexey Tschubakow [email=sekto3@mail.ru]sekto3@mail.ru[/email] //================================================ #define STRICT #include <windows.h> #include "crossnull.h" #include "resource.h" #include "CrossNullField.h" char const szMainClassName[] = "CrossAppClass"; char const szMainWindowTitle[] = "Cross and Null"; HINSTANCE hInst; // ===================================== // // ===================================== int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hwnd; hInst = hInstance; HBITMAP hBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP_BACK)); HBRUSH hBrush = CreatePatternBrush(hBmp); CCrossNullField::setBmpC(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPC))); CCrossNullField::setBmpN(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPN))); CCrossNullField::setBmpE(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPE))); if(!Register(hInstance, hBrush)) return FALSE; hwnd = CreateWindow( szMainClassName, /* Classname */ szMainWindowTitle, /* WindowTitle*/ WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 140, 80, 550, 400, 0, // 0, // hInstance, // NULL); if(!hwnd) return FALSE; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); CreateWindow("button", "Begin", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 110, 320, 90, 30, hwnd, (HMENU) IDB_BUTTON1, hInstance, NULL); CreateWindow("button", "About", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 230, 320, 90, 30, hwnd, (HMENU) IDB_BUTTON2, hInstance, NULL); CreateWindow("button", "Cancel", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 350, 320, 90, 30, hwnd, (HMENU) IDB_BUTTON3, hInstance, NULL); while(GetMessage(&msg, 0, 0, 0)) { DispatchMessage(&msg); } DeleteObject(hBmp); DeleteObject(hBrush); CCrossNullField::deleteBmpC(); CCrossNullField::deleteBmpN(); CCrossNullField::deleteBmpE(); return msg.wParam; } BOOL Register(HINSTANCE hInstance, HBRUSH hBrush) { ATOM aWndClass; // WNDCLASS wc; // // memset(&wc, 0, sizeof(wc)); wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = hBrush; wc.lpszMenuName = (LPSTR)NULL; wc.lpszClassName = (LPSTR)szMainClassName; aWndClass = RegisterClass(&wc); if(aWndClass == 0) return FALSE; return TRUE; } найдите пожалуйста ошибку на dev c++ выходит ошибка [Linker error] undefined reference to `_Z7WndProcP6HWND__jjl@16' [Linker error] undefined reference to `CCrossNullField::hBmpE' [Linker error] undefined reference to `CCrossNullField::hBmpN' [Linker error] undefined reference to `CCrossNullField::hBmpC' [Linker error] undefined reference to `CCrossNullField::hBmpE' [Linker error] undefined reference to `CCrossNullField::hBmpN' [Linker error] undefined reference to `CCrossNullField::hBmpC' ld returned 1 exit status
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-29 17:04:19.883333
|
|
|
rtw
Сообщений: 1372
Оценки: 0
Присоединился: 2004-08-19 00:28:05
|
вижу 2 выхода из положения: 1. Создавать собственный динамический список (предпочтительно двунаправленный) и писать множество функций для работы с ним, минимум день + время на интегрирование в программу 2. Использовать vector.h - затрачено время на интегрирование в программу.
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-30 23:01:10.790000
|
|
|
CABOK
Сообщений: 11
Оценки: 0
Присоединился: 2007-03-14 12:25:41.170000
|
Компилятор не находит аналогов к функциям: CCrossNullField::setBmpC(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPC))); CCrossNullField::setBmpN(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPN))); CCrossNullField::setBmpE(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAPE))); Решение, объявить функции ( с принимаемами аргументами ) до int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-01 17:35:15.006666
|
|
|
provider
Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
|
а можно на c++ написать программу казино
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-01 17:52:23.750000
|
|
|
Actek
Сообщений: 604
Оценки: 0
Присоединился: 2008-02-24 10:24:14.710000
|
можно : cout<<"Программу казино";
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-02 12:16:15.346666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Но лучше писать на C# + ASP.NET. Писать веб-севисы на плюсах не очень удобно.
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-02 13:09:25.576666
|
|
|
provider
Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
|
example mini casino and poker my experement has no result #include "Cardgame.h" int Cardgame::totalparticipants = 0; int main() { Cardgame *bridge = 0; Cardgame *blackjack = 0; Cardgame *solitaire = 0; Cardgame *poker = 0; bridge = new Cardgame(4); blackjack = new Cardgame(8); solitaire = new Cardgame(1); delete blackjack; delete bridge; poker = new Cardgame(5); delete solitaire; delete poker; return 0; } Na c# asp.net budet lutsche Have you other variations
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-02 16:04:50.816666
|
|
|
BatonXAK
Сообщений: 1137
Оценки: 0
Присоединился: 2007-03-02 20:44:00.803333
|
Народ подскажите в чем ошибка ?
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctime>
#include <iostream.h>
int n=4;
int s=4;
int counf = 0;
int z;
int c;
int A[4][4];
int rez[10],u=0;
void main()
{ int **A;
A=(int**)(malloc(4*sizeof(int*));
for(int i=0;i<4;i++)
A[i]=(int*)malloc(4*sizeof(int));
srand(time(0));
for(int ii = 0; ii < n; ii ++)
for (int i=0;i<s;i++)
A[i][ii]=rand()%-10;
for (int i=0; i < n; i++){
for (int j=0; j < s; j++)
cout<<A[i][j];
printf("\n");
}
cout<<"Vvedite predel A:\n";
cin>>z;
cout<<"Vvedite predel B:\n";
cin>>c;
cout<<"Predel:"<<z<<"\t"<<c<<"\n";
for (int i=0; i < n; i++){
for (int j=0; j < s; j++)
if (A[i][j] <z && A[i][j] <=c)
rez[u]=A[i][j],cout<<rez[u],u++;
}
for(int i=0;i<4;i++)
free(A[i]);
free(A);
while(1);
}
Компилятору не нравится эта строка A=(int**)(malloc(4*sizeof(int*));
|
|
|
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-03 17:10:05.580000
|
|
|
provider
Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
|
maybe it will help you ПРЕДСТАВЛЕНИЕ В ПАМЯТИ МАССИВОВ И МАТРИЦ http://forum.ru-board.com/topic.cgi?forum=33&topic=4338&start=2940 http://khpi-iip.mipk.kharkiv.edu/library/sp/lab1/spl02.html http://forum.codenet.ru/archive/index.php/t-43556.html
|
|
|
|
|