gpt4 book ai didi

c - 在C中的不同函数中传递指向数组的指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:03 25 4
gpt4 key购买 nike

我正在尝试传递一个用 memset 初始化为 0 的指针 rgb,然后循环放置一个 32 位整数,仅在我使用高度和宽度输入(h 和 w)以及从二维数组的左上角(x 和 y)。编译后,我似乎在指针的 printf 中得到了它的值,它给出了正确的值(在我的例子中是 0xFFFFFF,r g b 的输入是 255 255 255)但是在它传递给 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;
}

最佳答案

我仔细检查并基本上解决了所有的缺点,并解释了原因。这在很大程度上相当于这样一个事实,即如果您的编译器发出警告,您必须听取它们

/* 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;
}

关于c - 在C中的不同函数中传递指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/952195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com