Передача указателя на массив в другой функции в C - PullRequest
0 голосов
/ 04 июня 2009

Я пытаюсь передать указатель rgb, который инициализируется с memset равным 0, а затем проходит через него, чтобы поместить 32-разрядное целое число только в те границы, которые я создаю, с помощью ввода высоты и ширины (h и w), а также смещения от верхний левый угол 2-го массива (х и у). после компиляции у меня появляется значение с указателем 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 ]

2 голосов
/ 05 июня 2009

Я прошел и в основном разобрался со всеми бородавками и объяснил почему. Во многом это сводится к тому, что , если ваш компилятор выдает предупреждения, вы должны их слушать .

/* 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 голосов
/ 04 июня 2009

Это на самом деле имеет ряд ошибок, но вашей первой проблемой является присвоение значения пикселя массиву:

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

Вы, вероятно, имели в виду что-то вроде этого:

rgb[i][j] = rgbpixel;

Вам не нужно сбрасывать j на 0 - внутренний цикл for немедленно все равно сбросит j до начала.

Кроме того, вы неправильно используете sizeof (). Вы, вероятно, хотите вместо sizeof (rgb).

1 голос
/ 04 июня 2009

Почему бы не использовать структуру? Если код не предназначен для переносимости, вы можете легко получить:

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  = ...;
0 голосов
/ 04 июня 2009

Похоже, вы сохраняете свое однопиксельное значение в указателе на мои данные:

rgb = rgbpixel;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...