将指针传递给C中不同函数中的数组

时间:2009-06-04 18:09:04

标签: c arrays pointers function

我试图将一个用memset初始化的指针rgb传递给0然后循环,只在我用高度和宽度输入(h和w)创建的边界中放置一个32位整数,以及从2d数组的左上角(x和y)。在编译之后,我似乎得到了指针的printf后面的值,它给出了正确的值(在我的情况下为0xFFFFFF,输入为255 255 255为rgb)但是在它传递给rgb2yuv函数后,它我在那里打印时设置为0.

任何建议都很棒!

#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>

/*global definitions*/
#define WIDTH 480
#define HEIGHT 240

/*global declarations*/
int w,h,scrn, bytewrite;
unsigned char  red, green, blue;
static unsigned long rgb[WIDTH][HEIGHT];


/*function declarations*/
void colorq();
void rgb_rectdraw(int x, int y, int w, int h, unsigned char red , 
    unsigned char green, unsigned char blue, unsigned long *rgb);
void rgb2yuv(unsigned long *rgb);


/*
   Function Name: main
   Purpose: main function
*/

int main(int argc, char** argv){
printf("\n");
int x, y;    

/*call colorq to create a 32bit number of RGB*/
colorq();    

/ *call rgb_rectdraw to draw a rectangle RGB array*/
rgb_rectdraw(x, y, w, h, red, green, blue, rgb);

/*call rgb2yuv to take the RGB array and covert it to a YUV array*/
rgb2yuv(rgb);    
return 0;
}

/*
  Function name: color q
  Purpose: asks user to input colors from 0 to 255 in RGB format
*/

void colorq(){    
printf("Please enter a color for Red Green and Blue from 0 to 255:\n");
scanf("%hu", &red);
scanf("%hu", &green);
scanf("%hu", &blue);
printf("\n");    
return;
}        

/*
   Function name: rectdraw
   Purpose: Draws a rectangle array
*/

void rgb_rectdraw(int x, int y, int w, int h,unsigned char red, 
    unsigned char green,  unsigned char blue,unsigned long  *rgb){
unsigned long rgbpixel;

/* testing only take out when 
   finished debugging why red is always 0 after scanf */
red = 255;
printf("red set to 255 for debugging\n");

/*creates a 32-bit number of RGB*/
rgbpixel = (red<<16)|(green<<8)|blue;
printf("%#x\n",rgbpixel);

/*create array of width w height h*/ 
/*initialize array*/

memset (rgb, 0,sizeof(HEIGHT*WIDTH));
int i, j, startx, stopx, starty, stopy;


printf("enter width and height of rectangle in pixels\n");
scanf("%d %d", &w, &h);

printf("enter offset x pixels and y pixels of rectangle:\n");
scanf("%d %d", &x, &y);

startx=x;
starty=y;
stopx=x+w;
stopy=y+w;

/* creates array of w and h of int rgh */ 
for(i=startx; i <= stopx; i++){
   for(j=starty; j <= stopy; j++){
      rgb = rgbpixel;
      }
   j = 0;
   }
printf("original rgb %#x\n",rgb);
return ;
}

/*
 *Function Name: rgb2yuv
 *Purpose: convert the RGB array to a YUV array
 */

void rgb2yuv(unsigned long  *rgb){    
int i,j;
printf("ptrpassed = %#x\n",*rgb);
for(i=0; i<=WIDTH;i++){
   for(j=0; j<=HEIGHT; j++){
   }
}
printf("\n");
return;
}

4 个答案:

答案 0 :(得分:2)

这实际上有很多错误,但你的第一个问题是将像素值分配给数组:

   for(i=startx; i <= stopx; i++){
   for(j=starty; j <= stopy; j++){
      rgb = rgbpixel;
      }
   j = 0;
   }

你可能意味着这样的事情:

rgb[i][j] = rgbpixel;

你不需要将j重置为0 - 无论如何,内部for循环会立即将j重置为starty。

另外,你误用了sizeof()。您可能需要sizeof(rgb)。

答案 1 :(得分:2)

我经历了基本上整理了所有的疣,并解释了原因。很多事情都是因为如果您的编译器发出警告,您必须听取它们

/* Changed: Code formatted for my sanity */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

/*global definitions*/
#define WIDTH 480
#define HEIGHT 240

/*global declarations*/
int w,h,scrn, bytewrite;
/* Changed: to a short because I don't like the fact that I might be overwriting
   memory on accident (in colorq). */
unsigned short red, green, blue;
static unsigned long rgb[WIDTH][HEIGHT];

/* Changed: Some format strings have been changed to get rid of compiler
   warnings. */

/*function declarations*/
void colorq();
/* Changed: Specify the second dimension when you're passing an array. */
void rgb_rectdraw(int x, int y, int w, int h, unsigned char red,
                  unsigned char green, unsigned char blue,
                  unsigned long rgb[][HEIGHT]);
/* Changed: always pass an array of arrays. */
void rgb2yuv(unsigned long rgb[][HEIGHT]);


/*
   Function Name: main
   Purpose: main function
 */

int main(int argc, char** argv)
{
    printf("\n");
    int x, y;


    /*call colorq to create a 32bit number of RGB*/
    colorq();


    /* call rgb_rectdraw to draw a rectangle RGB array */
    rgb_rectdraw(x, y, w, h, red, green, blue, rgb);

    /* call rgb2yuv to take the RGB array and covert it to a YUV array */
    rgb2yuv(rgb);

    return 0;
}

/*
   Function name: color q
   Purpose: asks user to input colors from 0 to 255 in RGB format
 */

void colorq(){
    /* Suggestion: restructure this method to just take in all its input
       locally, then return a rgbpixel. */

    printf("Please enter a color for Red Green and Blue from 0 to 255:\n");
    scanf("%hu", &red);
    scanf("%hu", &green);
    scanf("%hu", &blue);
    printf("\n");

    return;
}



/*
   Function name: rectdraw
   Purpose: Draws a rectangle array
 */

void rgb_rectdraw(int x, int y, int w, int h,unsigned char red,
                  unsigned char green, unsigned char blue,
                  unsigned long rgb[][HEIGHT])
{
    unsigned long rgbpixel;

    /* testing only take out when
       finished debugging why red is always 0 after scanf */
    red = 255;
    printf("red set to 255 for debugging\n");

    /*creates a 32-bit number of RGB*/
    /* Changed: Added the extra 0xFF masking because of shortness rather than
       charness. */
    rgbpixel = ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF);
    printf("%#lx\n",rgbpixel);

    /*create array of width w height h*/
    /*initialize array*/

    /* Changed: fill the size of one element times the number of elements */
    memset(rgb, 0, sizeof(unsigned long) * HEIGHT * WIDTH);
    int i, j, startx, stopx, starty, stopy;


    printf("enter width and height of rectangle in pixels\n");
    scanf("%d %d", &w, &h);

    printf("enter offset x pixels and y pixels of rectangle:\n");
    scanf("%d %d", &x, &y);

    startx=x;
    starty=y;
    stopx=x+w;
    stopy=y+w;

    /* creates array of w and h of int rgh */
    for(i=startx; i <= stopx; i++){
        for(j=starty; j <= stopy; j++){
            rgb[i][j] = rgbpixel;
        }
        j = 0;
    }
    printf("original rgb %#lx\n", (long unsigned int) rgb);
    return ;
}

/*
 *Function Name: rgb2yuv
 *Purpose: convert the RGB array to a YUV array
 */

void rgb2yuv(unsigned long  rgb[][HEIGHT]){

    int i,j;
    /* Changed: You can't just dereference rgb twice -- you have to use array
       notation here. */
    printf("ptrpassed = %#lx\n", rgb[0][0]);
    for(i=0; i<=WIDTH; i++){
        for(j=0; j<=HEIGHT; j++){
        }
    }
    printf("\n");
    return;
}

答案 2 :(得分:1)

为什么不使用结构?如果代码无意可移植,您可以轻松逃脱:

struct rgb_bits {
    int red   : 8;
    int green : 8;
    int blue  : 8;
};
union rgb {
    rgb_bits colour;
    long     array;
}

将像素消隐然后变成:

union rgb pixel;
pixel.array = 0;

并设置个别颜色:

union rgb pixel;
pixel.colour.red   = ...;
pixel.colour.green = ...;
pixel.colour.blue  = ...;

答案 3 :(得分:0)

看起来您将单个像素值存储在指向您的数据指针中:

rgb = rgbpixel;