Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

С++, нужна консультация по динамическому выделению памяти.

Пользователи, просматривающие топик: 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  динамически.
Post #: 1
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;
Post #: 2
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).
Post #: 3
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-15 18:07:33.756666   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
PS: в конце работы программы надо удалить из динамической памяти все строчки, а потом и сам массив при помощи free()
Post #: 4
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 01:14:19.356666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Не стоит изобретать велосипед, если не нужно чрезмерной оптимизации. Для повледневных задач гораздо проще воспользоваться STL.
Post #: 5
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 02:15:48.320000   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666

quote:

ORIGINAL: _SaZ_

Не стоит изобретать велосипед, если не нужно чрезмерной оптимизации. Для повледневных задач гораздо проще воспользоваться STL.

Если уже есть работающий Си-код пусть даже и с расширением cpp, то почему бы не оставаться в рамках Си?
Post #: 6
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-16 18:00:25.743333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ну это да =)
Post #: 7
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
Post #: 8
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-04-29 17:04:19.883333   
rtw

Сообщений: 1372
Оценки: 0
Присоединился: 2004-08-19 00:28:05
вижу 2 выхода из положения:
1. Создавать собственный динамический список (предпочтительно двунаправленный) и писать множество функций для работы с ним, минимум день + время на интегрирование в программу
2. Использовать vector.h - затрачено время на интегрирование в программу.

Post #: 9
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) 
Post #: 10
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-01 17:35:15.006666   
provider

Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
а можно на c++ написать программу казино
Post #: 11
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-01 17:52:23.750000   
Actek

Сообщений: 604
Оценки: 0
Присоединился: 2008-02-24 10:24:14.710000
можно :
cout<<"Программу казино";
Post #: 12
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-02 12:16:15.346666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Но лучше писать на C# + ASP.NET. Писать веб-севисы на плюсах не очень удобно.
Post #: 13
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

Post #: 14
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-02 16:04:50.816666   
BatonXAK

Сообщений: 1137
Оценки: 0
Присоединился: 2007-03-02 20:44:00.803333
Народ подскажите в чем ошибка ?
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; #include &lt;iostream.h&gt; 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&lt;4;i++) A[i]=(int*)malloc(4*sizeof(int)); srand(time(0)); for(int ii = 0; ii &lt; n; ii ++) for (int i=0;i&lt;s;i++) A[i][ii]=rand()%-10; for (int i=0; i &lt; n; i++){ for (int j=0; j &lt; s; j++) cout&lt;&lt;A[i][j]; printf("\n"); } cout&lt;&lt;"Vvedite predel A:\n"; cin&gt;&gt;z; cout&lt;&lt;"Vvedite predel B:\n"; cin&gt;&gt;c; cout&lt;&lt;"Predel:"&lt;&lt;z&lt;&lt;"\t"&lt;&lt;c&lt;&lt;"\n"; for (int i=0; i &lt; n; i++){ for (int j=0; j &lt; s; j++) if (A[i][j] &lt;z && A[i][j] &lt;=c) rez[u]=A[i][j],cout&lt;&lt;rez[u],u++; } for(int i=0;i&lt;4;i++) free(A[i]); free(A); while(1); } Компилятору не нравится эта строка A=(int**)(malloc(4*sizeof(int*));
Post #: 15
RE: С++, нужна консультация по динамическому выделению памяти. - 2008-05-03 17:10:05.580000   
provider

Сообщений: 100
Оценки: 0
Присоединился: 2008-04-12 15:31:33.813333
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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
Post #: 16
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> С++, нужна консультация по динамическому выделению памяти.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.