我试图将一个用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;
}
答案 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;