2010-08-18 21 views
1
// Create test video frame 
void CreateFrame(char * buffer, int w, int h, int bytespan) 
{ 
    int wxh = w * h; 
    static float seed = 1.0; 
    for (int i = 0; i < h; i ++) 
    { 
    char* line = buffer + i * bytespan; 
    for (int j = 0; j < w; j ++) 
    { 
     // RGB 
     line[0] = 255 * sin(((float)i/wxh * seed) * 3.14); 
     line[1] = 255 * cos(((float)j/wxh * seed) * 3.14); 
     line[2] = 255 * sin(((float)(i + j)/wxh * seed) * 3.14); 
     line += 3; 
    } 
    } 
    seed = seed + 2.2; 
} 

quelqu'un peut-il me plaire s'il vous plaît ce qui est line += 3;?Lecture du code C++ Fonction CreateFrame (à partir de C# prespective)

et comment créer une telle fonction analogique en C#?

Répondre

1

en C/C++, la valeur line en ligne est en fait une adresse de mémoire d'un réseau, et line[1] représente en fait la valeur à l'adresse de la variable de line plus un élément de décalage 1. (Si le type des éléments dans line est un int, cela signifie l'adresse de line plus quatre octets, car il est un char, cela signifie que l'adresse de line plus un octet.)

Ainsi, line += 3 signifie que line[1] est maintenant équivalent à [old "line" value][4]. Le codeur aurait pu écrire le code comme:

for (int j = 0; j < w; j ++) 
{ 
    // RGB 
    line[(3 * j)] = 255 * sin(((float)i/wxh * seed) * 3.14); 
    line[(3 * j) + 1] = 255 * cos(((float)j/wxh * seed) * 3.14); 
    line[(3 * j) + 2] = 255 * sin(((float)(i + j)/wxh * seed) * 3.14); 
} 
5

line += 3 incrémente le pointeur line de 3 octets, de sorte qu'il pointe vers le pixel suivant. line Voici un pointeur vers un pixel de 3 octets, il devrait donc être appelé quelque chose d'autre, comme pPixel.

3

Ligne est un pointeur vers une position dans le tampon. La ligne d'incrément avance le traitement dans le tampon.

A C# analogique peut être:

static float seed = 1.0f; 
static void CreateFrame(byte[] buffer, int w, int h, int bytespan) 
{ 
    int wxh = w * h; 
    for (int i = 0; i < h; i ++) 
    { 
    int line = i * bytespan; 
    for (int j = 0; j < w; j ++) 
    { 
     // RGB 
     buffer[line + 0] = (byte)(255 * Math.Sin(((float)i/wxh * seed) * 3.14)); 
     buffer[line + 1] = (byte)(255 * Math.Cos(((float)j/wxh * seed) * 3.14)); 
     buffer[line + 2] = (byte)(255 * Math.Sin(((float)(i + j)/wxh * seed) * 3.14)); 
     line += 3; 
    } 
    } 
    seed = seed + 2.2f; 
} 
1

Ceci est l'arithmétique de pointeur. Puisque vous traitez avec 3 éléments du tableau en une fois, vous devrez mettre à jour le pointeur de façon appropriée, sinon vous lirez le même emplacement deux fois et bien sûr, à tort.

1

Vous remplacez le pointeur par un tableau d'octets et de les indexer par un entier comme suit:

// Create test video frame 
void CreateFrame(byte[] buffer, int w, int h, int bytespan) 
{ 
    int wxh = w * h; 
    static float seed = 1.0; 
    for (int i = 0; i < h; i ++) 
    { 
    int line = i * bytespan; 
    for (int j = 0; j < w; j ++) 
    { 
     // RGB 
     buffer[line + 0] = 255 * sin(((float)i/wxh * seed) * 3.14); 
     buffer[line + 1] = 255 * cos(((float)j/wxh * seed) * 3.14); 
     buffer[line + 2] = 255 * sin(((float)(i + j)/wxh * seed) * 3.14); 
     line += 3; 
    } 
    } 
    seed = seed + 2.2; 
} 

Je viens de quitter le nom de la variable line , même si d'après ce que je comprends, ce n'est pas vraiment une ligne.