2015-02-24 4 views
0
// I need to download data from the (json-format) file net_f: 
std::ifstream net_f("filename", std::ios::in | std::ios::binary); 
// to a square int array *net of size n: 
int n; 
int * net; 
load_net(net_f, &n, net); 

// The size is initially unknown, so I want to do it in the procedure: 
void load_net(std::ifstream& f, int *n, int *net) 
{ 
    int size; // # of rows (or columns, it's square) in the array 
    int net_size; // the array size in bytes 
    /* 
     some code here to process data from file 
    */ 
    // Returning values: 
    *n = size; 
    // Only now I am able to allocate memory: 
    *net = (int *)malloc(net_size); 
    /* 
     and do more code to set values 
    */ 
} 

Теперь: компилятор предупреждает меня, что «переменная« сеть »используется до того, как ее значение установлено». Действительно, это потому, что у меня недостаточно информации. Он также всплывает во время выполнения, и я просто игнорирую его. Как я должен переделать свой код, чтобы сделать его более элегантным? (BTW это должен быть массив, а не вектор, я копирую его на устройство CUDA).C++ как передать неинициализированный указатель на функцию

+0

Что это должно означать: '* net = (int *) malloc (net_size);' при условии, что выражение RHS передается в 'int *', а выражение LHS - 'int'? – juanchopanza

+0

http://stackoverflow.com/questions/2838038/c-programming-malloc-inside-another-function – jamesdlin

ответ

3

Поскольку вы пытаетесь изменить net в вызываемой функции, вам необходимо пройти netby reference (так как вы используете C++). Кроме того, это было бы предпочтительнее для n, а также:

void load_net(std::ifstream& f, int &n, int *&net) 
{ 
    // ... 

    /* Set output args */ 
    n = size; 
    net = (int*)malloc(net_size); 
} 

: C путь будет проходить двойной указатель (и не отбрасывать результат malloc!):

void load_net(FILE* f, int *n, int **net) 
{ 
    // ... 

    /* Set output args */ 
    *n = size; 
    *net = malloc(net_size); 
} 

Вы, кажется, для написания комбинации кода C и C++. Не делай этого. Выберите один и используйте его функции по своему усмотрению.

+0

OP фактически пытается изменить вещь, на которую указывает 'net' (и' n'). И так как он не был инициализирован ... – juanchopanza

+0

@juanchopanza Это то, что делает его * код *, но я уверен, что это не то, что он намеревается. Это не имеет никакого смысла. –

+0

Да, наверное. Но, возможно, стоит отметить. – juanchopanza

0

вы можете использовать двойной указатель в качестве аргумента функции и передать адрес указателя в функции

// I need to download data from the (json-format) file net_f: 
std::ifstream net_f("filename", std::ios::in | std::ios::binary); 
// to a square int array *net of size n: 
int n; 
int *net; 
load_net(net_f, &n, &net); 

// The size is initially unknown, so I want to do it in the procedure: 
void load_net(std::ifstream& f, int *n, int **net) 
{ 
    int size; // # of rows (or columns, it's square) in the array 
    int net_size; // the array size in bytes 
    /* 
     some code here to process data from file 
    */ 
    // Returning values: 
    *n = size; 
    // Only now I am able to allocate memory: 
    **net = (int *)malloc(net_size); 
    /* 
     and do more code to set values 
    */ 
} 
Смежные вопросы