C dili hakkında sorular - sayfa 8

 
 
Igor Makanu :

evet, hafıza alanları var ve diğer hafıza alanlarında saklanan hafıza alanlarına işaretçiler var

ve beyin algılayabildiği sürece hiyerarşi boyunca, hatta sonsuza kadar

 
Vladimir Simakov :
Ayrıca montajcı ekleri de oldukça fazla kullanılmaktadır.

Sözlerimi kısmen geri alıyorum, 18:00'den itibaren izliyorum, ama asme yazmıyorlar, zaten derlenmiş kodu düzenleyin - o zaman mantıklı

Anladığım kadarıyla, modern derleyicilerin montajcı ekleriyle yaptığı şey sadece asm taklidi, yani. asm eklentisinin bu formdaki derlenmiş koda gireceği bir gerçek değil, ancak asma'daki kodu gerçekten optimize etmek için, hata ayıklayıcıda asma'daki kodun bölümlerini yeniden yazmak yeterlidir - IMHO


 
Maxim Dmitrievsky :

evet, hafıza alanları var ve diğer hafıza alanlarında saklanan hafıza alanlarına işaretçiler var

ve beyin algılayabildiği sürece hiyerarşi boyunca, hatta sonsuza kadar

Evet, ayrıca bağlantının canlı olup olmadığını takip etmemek ve başka bir işlemin kullandığı uzun süredir özgürleştirilmiş bir bellek alanına girip oradaki her şeyi kırmak da harika)))

 
Vladimir Simakov :

Evet, ayrıca bağlantının canlı olup olmadığını takip etmemek ve başka bir işlemin kullandığı uzun süredir özgürleştirilmiş bir bellek alanına girip oradaki her şeyi kırmak da harika)))

Ne peri masalı, bu sadece Windows 3.*'de mümkündü. Windows başka bir işlemin belleğine girmenize izin vermez, her işlem kendi alanında çalışır ve onun için bellek adreslemesi sıfırdan başlar, Windows bunu böyle sunar. Ve genel olarak, Windows yalnızca veriler gerçekten yazıldığında bellek ayırır. Bir diziyi double arr[1024*1024*1024] yapın ve görev yöneticisinde gerçekte ne kadar bellek ayrıldığını görün. Ve hiç de değil! Siz diziye yazmaya başlayana kadar bellek 4 KB'lik parçalar halinde ayrılmayacaktır. Rastgele dizinlere yazsanız bile hala böyle parçalar halinde. Windows'un tüm bunları nasıl sanallaştırdığı benim için anlaşılmaz!

 
Alexey Volchanskiy :

Windows'un tüm bunları nasıl sanallaştırdığı benim için anlaşılmaz!

google'a isteksizlik, ancak Pentium-1'in ortaya çıkmasıyla birlikte, işlemci ayrıca bellek segment tanımlayıcılarına ve sanal belleğe, yani. büyük olasılıkla bu, demir düzeyinde sanallaştırmadır ve Winda bunu ustaca kullanır

 
Alexey Volchanskiy :

Ne peri masalı, bu sadece Windows 3.*'de mümkündü. Windows başka bir işlemin belleğine girmenize izin vermez, her işlem kendi alanında çalışır ve onun için bellek adreslemesi sıfırdan başlar, Windows bunu böyle sunar. Ve genel olarak, Windows yalnızca veriler gerçekten yazıldığında bellek ayırır. Bir diziyi double arr[1024*1024*1024] yapın ve görev yöneticisinde gerçekte ne kadar bellek ayrıldığını görün. Ve hiç de değil! Siz diziye yazmaya başlayana kadar bellek 4 KB'lik parçalar halinde ayrılmayacaktır. Rastgele dizinlere yazsanız bile hala böyle parçalar halinde. Windows'un tüm bunları nasıl sanallaştırdığı benim için anlaşılmaz!

Sayfa hatası. Bdysch istisnası - sayfa başına bellek verdiler ve daha fazlasını vermediler. Bu, uygulamalar için uygun ve şeffaftır, ancak bellek parçalanmasına yol açar. Virtualalloc'tan sonra ortaya çıkan işaretçide virtuallock'u çağırarak fiziksel belleği tek seferde ayırabilirsiniz. Bu arada, ilginç bir boşluk, sunucuyu böyle doldurmanın mümkün olup olmadığını görmemiz gerekiyor.


Üç rublelik banknotta sanallaştırma yoktu, bu farklı bir sistem, NT değil. Orada, genel olarak, dos'tan çok fazla kuyruk vardı, sistem işlevlerinin yarısı int 21'e asıldı.

 

Bu olayı anlamıyorum:

 /*
 * The mine_score structure describes the maximum normalized mutual information
 * scores (i.e. the characteristic matrix if est=EST_MIC_APPROX, the
 * equicharacteristic matrix instead). M[i][j] contains the score using a grid
 * partitioning x-values into i+2 bins and y-values into j+2 bins. m and M are
 * of length n and each M[i] is of length m[i].
 */
typedef struct mine_score
{
   int n;       /* number of rows of M */
   int *m;     /* number of cols of M[i] for each i */
   double **M; /* the (equi)characteristic matrix */
} mine_score;

Ayrıca, f-ii'de M matrisinin boyutunda bir değişiklik var:

/*
* Returns an initialized mine_score structure. Returns NULL if an error
* occurs.
*/
mine_score *init_score(mine_problem *prob, mine_parameter *param) {    int i, j;    double B;   mine_score *score;    if ((param->alpha > 0.0 ) && (param->alpha <= 1.0 ))     B = MAX( pow (prob->n, param->alpha), 4 );    else if (param->alpha >= 4 )     B = MIN(param->alpha, prob->n);    else     goto error_score;   score = (mine_score *) malloc ( sizeof (mine_score));    if (score == NULL )     goto error_score;    score->n = MAX(( int ) floor (B/ 2.0 ), 2 ) - 1 ; задали кол-во строк, ок   score->m = ( int *) malloc(score->n * sizeof ( int )); а кол-во столбцов тут чему равно? кол-ву строк?    if (score->m == NULL )     goto error_score_m;    for (i= 0 ; i<score->n; i++)     score->m[i] = ( int ) floor (( double ) B / ( double ) (i+ 2 )) - 1 ;   score->M = ( double **) malloc (score->n * sizeof ( double *));    if (score->M == NULL )     goto error_score_M;    for (i= 0 ; i<score->n; i++)     {        score->M[i] = ( double *) malloc ((score->m[i]) * sizeof ( double )); а здесь идет просто выделение памяти для матриы М?        if (score->M[i] == NULL )         {            for (j= 0 ; j<i; j++)             free(score->M[j]);           goto error_score_M_i;         }     }    return score;   error_score_M_i:     free(score->M);   error_score_M:     free(score->m);   error_score_m:     free(score);   error_score:      return NULL ; }

Yani, anladığım kadarıyla, tüm bu ayak örtüsü sadece matris için bellek ayırmak içindir, ancak herhangi bir değerle dolu değil mi? Yani, bu kod mql için atılabilir (peki, bir kare matrisin satır sayısını ve aynı sayıda sütunu belirledikten sonra)

veya matris bazı değerlerle başlatıldı mı

 
Alexey Volchanskiy :

... Windows'un tüm bunları nasıl sanallaştırdığı benim için anlaşılmaz!

Richter'i okuyun. Hepsini kalbinde bir acıya kadar çiğnedi.

Ciddi Rakun :
Bu arada, ilginç bir delik, sunucuyu bu şekilde doldurmanın mümkün olup olmadığını görmemiz gerekiyor.

Yasaktır.

 
Maxim Dmitrievsky :

Bu olayı anlamıyorum:

 typedef struct mine_score
{
   int n;       /* number of rows of M */
   int *m;     /* number of cols of M[i] for each i */
   double **M; /* the (equi)characteristic matrix */
} mine_score;
   score->n = MAX(( int ) floor (B/ 2.0 ), 2 ) - 1 ; задали кол-во строк, ок
  score->m = ( int *) malloc(score->n * sizeof ( int )); а кол-во столбцов тут чему равно? кол-ву строк?
 score->M[i] = ( double *) malloc ((score->m[i]) * sizeof ( double )); а здесь идет просто выделение памяти для матриы М?

Ayrıca, f-ii'de M matrisinin boyutunda bir değişiklik var:

Yani, anladığım kadarıyla, tüm bu ayak örtüsü sadece matris için bellek ayırmak içindir, ancak herhangi bir değerle dolu değil mi? Yani, bu kod mql için atılabilir (peki, bir kare matrisin satır sayısını ve aynı sayıda sütunu belirledikten sonra)

veya matris bazı değerlerle başlatıldı mı

mine_score *m'de bir int için bir POINTER'dır ve yorum bunun bir dizi olduğunu, yani her satır için farklı sayıda sütun olduğunu söylüyor, buna dikdörtgen değil "kıvrımlı dizi" denir.

 score->m = ( int *) malloc(score->n * sizeof ( int ))

Sadece bu dizi uzunlukları için bellek ayrılmış, değer yok

M matrisinin kendisi için

score->M = ( double **) malloc (score->n * sizeof ( double *));

burada dize işaretçileri için bellek ayrılmıştır

 score->M[i] = ( double *) malloc ((score->m[i]) * sizeof ( double )); а здесь идет просто выделение памяти для матриы М?

ve burada sütunlar için