【问题标题】:C++ using pointers, nothing is passedC++ 使用指针,什么都没有传递
【发布时间】:2011-07-25 22:37:53
【问题描述】:

代码执行,但没有任何东西通过 image_data(第 44 行 write_function)

所以我没有函数的工作数组(第 11 行),为什么会这样?我认为传递 image_data 的参考应该足够了吗? (习惯了,主要是开发JAVA)

#include <iostream>
#include <string.h>
#include <fstream>

using namespace std;

//Expects bgra image data
//Only makes bgr and bgra with 8 bits per pixel pictures
//Expects big endian ushorts
//makes no checks on the data supplied!
void write_tga(ofstream& output,char image_data[],unsigned short xWidth,unsigned short yWidth,bool transparency) //Line 11 - Line 11 - Line 11 - Line 11
{
    char zero = static_cast<char>(0x00);
    char two = static_cast<char>(0x02);

    //Convert uint to char Array
    unsigned char xWidth_arr[2];
    unsigned char yWidth_arr[2];
    memcpy(xWidth_arr, &xWidth, 2);
    memcpy(yWidth_arr, &yWidth, 2);

    char header[18] = {zero,zero,two,zero,zero,zero,zero,zero, zero,zero,zero,zero, xWidth_arr[0],xWidth_arr[1],yWidth_arr[0],yWidth_arr[1],static_cast<char>(0x18),zero};
    //enabling transparency
    if(transparency){
        header[16]= static_cast<char>(0x20);
        header[17]= static_cast<char>(0x08);
    }
    char footer[26] = {zero,zero,zero,zero,zero,zero,zero,zero, 'T','R','U','E','V','I','S','I','O','N','-','X','F','I','L','E','.',zero};

    output.write((char*)&header,sizeof(header));
    output.write((char*)&image_data,sizeof(image_data));
    output.write((char*)&footer,sizeof(footer));
    output.close();
    cout << image_data[0] << endl;
}

int main()
{
    ofstream output("data.tga",ios::binary);
    output.seekp(0);

    char zero = static_cast<char>(0x00);
    char image_data[12] = {static_cast<char>(0xff),static_cast<char>(0xff),static_cast<char>(0xff), zero,zero,zero, zero,zero,zero, zero,zero,zero};

    write_tga(output,image_data,2,2,false); //Line 44 - Line 44 - Line 44 - Line 44
    return 0;
}

【问题讨论】:

  • sizeof (imagedata) 不是你所期望的,插入一些调试代码看看它是什么。 (并将您的 cout 更改为 cout &lt;&lt; image_data &lt;&lt; endl; 以获得“一些”输出 - 尽管没有什么用处)
  • 插入output.write((char*)&amp;image_data,sizeof(image_data));,比如output.write(image_data, n);,你必须以某种方式传递n 的大小,因为数组大小无法在image_data 的衰减指针中存活。 (在你的情况下,你可以说12。)

标签: c++ pointers


【解决方案1】:

你到底想在这段代码中做什么:

output.write((char*)&image_data,sizeof(image_data));

数组名是一个指针。您正在写入output 其内容(内存地址),而不是它指向的实际数据。删除 &amp; 运算符以写入它指向的内容,我认为这就是您想要的。或者在第一个成员上使用&amp;(例如:(char*)&amp;image_data[0])。

sizeof 返回image_data 的指针大小。使用“大小”参数来传达大小。

而且你无缘无故地滥用static_cast

【讨论】:

  • 我认为采用数组的operator&amp; 给出了数组第一个元素的地址;不确定当数组是函数参数时这是否仍然正确,但我敢打赌。
  • 数组作为函数参数是一个指针,获取它的地址给你它的地址,而不是它指向的地址。
  • 搞定了:output.write(image_data,n); n 是必须传递给函数的大小参数。为什么我滥用 static_cast?有没有更简单的方法? (实际上是从其他网站的一个例子中得到的)
  • @whyRegister,你在滥用static_cast,因为这完全没有必要。任何适合的整数常量都将转换为 char 而无需强制转换。
【解决方案2】:

C++ 没有动态数组。有一个不幸的语法选择,char imagedata[] 可以用作参数,但实际上它被视为char * imagedata。这意味着 sizeof 运算符返回的是指针的大小,而不是数组的大小。

【讨论】:

  • imagedata 不是动态数组,它可以作为数组传递(通过引用),但显示的代码不这样做。
  • @Ben,当然imagedata 不是动态数组,因为C++ 没有这种东西! (vector 不算数)。它可以通过引用或不通过引用作为数组传递,但大小需要是参数列表中指定的常量。我相信你已经知道了,但我必须保持记录。
  • 什么意思是 C++ 没有动态数组?你叫什么new int[n]?如果你确实通过引用传递了一个静态大小的数组,编译器可以在模板参数推断期间找到大小。
猜你喜欢
  • 2022-08-20
  • 1970-01-01
  • 2011-02-02
  • 2021-07-23
  • 2012-01-16
  • 1970-01-01
  • 2015-02-11
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多