VirtualAlloc

Тема в разделе "LANGS.C", создана пользователем NorB, 22 мар 2009.

  1. NorB

    NorB New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>              // for printf
    3. #include <stdlib.h>             // for exit
    4. #include <conio.h>
    5. #include <string.h>
    6. #include <iostream.h>
    7. #define PAGELIMIT 80            // ask for this many pages
    8.  
    9. LPTSTR lpNxtPage;               // address of the next page to ask for
    10. DWORD dwPages = 1;              // count of pages gotten so far
    11. DWORD count=0;
    12. DWORD count2=0;
    13. DWORD dwPageSize;
    14. LPVOID lpvBase;
    15. LPTSTR lpPtr;
    16.  
    17. struct list {
    18.   char dt[20];
    19.   int x;
    20.   int y;
    21.   int v;
    22.   };
    23.  
    24. list * arr;
    25.  
    26. void add(int val1, int val2,int val3, char *val4){
    27.      if(((count2+1)%128)!=0){
    28.      strcpy(arr[count].dt, val4);
    29.      arr[count].x= val1;
    30.      arr[count].y= val2;
    31.      arr[count].v= val3;
    32.      count++;
    33.      count2++;
    34.      printf ("On saime page # %d.\n", dwPages);
    35.                         }else{
    36.                              
    37.                          lpPtr+=dwPageSize;
    38.  
    39.                          arr=(list*)VirtualAlloc((LPVOID)lpPtr,dwPageSize,MEM_COMMIT,PAGE_READWRITE);
    40.                          
    41.                          if (arr == NULL ){
    42.                          printf("VirtualAlloc failed\n");
    43.                          };
    44.  
    45.                          
    46.                          strcpy(arr[count].dt, val4);
    47.                          arr[count].x= val1;
    48.                          arr[count].y= val2;
    49.                          arr[count].v= val3;
    50.                          dwPages++;
    51.                          count++;
    52.                          count2=0;
    53.                          printf ("On new page ¹ %d.\n", dwPages);
    54.                          }
    55.      };
    56.    
    57.  
    58. int main(int argc, char *argv[])
    59. {
    60.   SYSTEM_INFO sSysInfo;
    61.   GetSystemInfo(&sSysInfo);     // initialize the structure
    62.   printf ("This computer has page size %d.\n", sSysInfo.dwPageSize);
    63.   printf ("size of struct  %d.\n", sizeof(list));
    64.   dwPageSize = sSysInfo.dwPageSize;
    65.  
    66.   arr=(list*)VirtualAlloc(NULL,PAGELIMIT*dwPageSize,MEM_RESERVE,PAGE_READWRITE);
    67.   arr=(list*)VirtualAlloc(NULL,dwPageSize,MEM_COMMIT,PAGE_READWRITE);
    68.  
    69.   lpPtr=(LPTSTR)arr;
    70.  
    71.   printf("vvedite znachenie, stroku, stolbec, tip\n");
    72.   int a,b,c;
    73.   char tipp[20];
    74.   cin>>a>>b>>c>>tipp;
    75.   for (int f=0; f<130; f++){
    76.   add(a,b,c,tipp);
    77. };
    78.   cout<<arr[130].x<<arr[130].y<<arr[130].v<<arr[130].dt;
    79.  
    80.   system("PAUSE"); 
    81.   return 0;
    82. }
    Программа работает с масивом структур и таких структур как у меня на страницу виртуальной памяти 128 помещается, мне нада выделять память какбы не сразу все тоесть я зарезервировал 80 страниц а потом када заполнена мме_коммит другую но в ветки функции add
    lpPtr+=dwPageSize;
    arr=(list*)VirtualAlloc((LPVOID)lpPtr,dwPageSize,MEM_COMMIT,PAGE_READWRITE);

    я чтото делаю неправельно с первым аргументом функции я хочу выделять страницу а выходит так что нечего невыделяется по адресу lpPtr *( помогите посмотрите что тут нетак буду благодарен...
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А вместо 2 и 3й строчки нужно
     
  3. NorB

    NorB New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    ээээээээээээээ я в замешательстве=\
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?pid=270546#p270546
     
  5. NorB

    NorB New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    leo пасиба, немогбы ты мне обьяснить почему так=\ я просто непонял логику немного=\\\\ зато работает..=)
    Аа я вехал=\ блин мсдн гавно =(