C ++ с использованием указателей, ничего не передается - PullRequest
0 голосов
/ 26 июля 2011

Код выполняется, но ничего не передается в 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;
}

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

C ++ не имеет динамических массивов. Есть неудачный выбор синтаксиса, что char imagedata[] может использоваться как параметр, но на самом деле он рассматривается как char * imagedata Это означает, что оператор sizeof возвращает размер указателя, а не размер массива.

2 голосов
/ 26 июля 2011

Что именно вы пытаетесь сделать в этом коде:

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

Имя массива - указатель.Вы пишете output его содержимое (адрес памяти), а не фактические данные, на которые оно указывает.Удалите оператор &, чтобы написать контент, на который он указывает, и это то, что вы хотели, я думаю.Или используйте & на первом элементе (например: (char*)&image_data[0]).

sizeof возвращает размер указателя для image_data.Используйте параметр "size" для передачи размера.

И вы злоупотребляете static_cast без видимой причины.

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