2013-11-24 7 views
-1

У меня есть текстовый файл, в котором я прочитал в 2D массив как это:Передача указателя из функции C++

153 62 328 71 0.998263 0 0 0 0 0 0 0 0 0 
160 58 335 67 0.99699 0 0 0 0 0 0 0 0 0 
192 43 362 53 0.998 0 0 0 0 0 0 0 0 0 
224 34 389 45 0.994047 0 0 0 0 0 0 0 0 0 

Мне нужно только первые четыре столбца. Я создаю функцию, которая хранит числа в 2D-массив. Я хочу передать указатель от этой функции на главную, которая указывает на адрес первого элемента массива.

В основной функции я пытаюсь увеличить индекс указателя, чтобы снова получить значения из массива, но я не могу получить правильные цифры. Очевидно, что мое понимание с помощью указателей 2D-массивов ограничено, и я был бы признателен за любую помощь.

Мой код здесь:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <typeinfo> 
#include <string> 
#include <cstring> 
using namespace std; 

/////////////////////////////////////////////////////////////////////////////// 
int lines_in_pos_obj_file(int i = 0) 
{ 
    string pos_obj_file_line; 

    ifstream pos_obj_file("correspondencePOS000_sphere.txt"); 
    if(pos_obj_file.is_open()) 
    { 
     while(getline(pos_obj_file, pos_obj_file_line)) 
     { 
      i++; 
     } 
    } 

    else cout << "Unable to open file"; 
    return(i); 
} 
/////////////////////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////////////////////////// 
int *get_pos_obj_positions(int k) 
{ 
    int pos_obj_positions[k][4]; 
    int i = 1; 

    string pos_obj_file_line; 

    ifstream pos_obj_file("correspondencePOS000_sphere.txt"); 
    if(pos_obj_file.is_open()) 
    { 

     pos_obj_file >> pos_obj_positions[0][0] >> pos_obj_positions[0][1] >> pos_obj_positions[0][2] >> pos_obj_positions[0][3]; 

     while(getline(pos_obj_file, pos_obj_file_line)) 
     { 

      pos_obj_file >> pos_obj_positions[i][0] >> pos_obj_positions[i][1] >> pos_obj_positions[i][2] >> pos_obj_positions[i][3]; 

      i++; 
     } 
    } 

    else cout << "Unable to open file"; 

    int (*pos_obj_pointer)[4] = &pos_obj_positions[0]; 
    return(pos_obj_pointer[0]); 
} 
/////////////////////////////////////////////////////////////////////////////// 

int main() 
{ 
    int pos_obj_lines; 
    int *pos_obj_positions; 

    pos_obj_lines = lines_in_pos_obj_file(0); 
    pos_obj_positions = get_pos_obj_positions(pos_obj_lines); 

    for(int l = 0; l < pos_obj_lines; l++) 
    { 
    cout << pos_obj_positions[l] << endl; 
    } 

    return 0; 
} 

Это выход:

153 
0 
1670302324 
32656 
-1690506736 
1 
3 
0 
6 
0 
1672415896 
32656 
+0

Рассмотрите возможность использования векторов векторов, например. 'std :: vector >'; или используйте простой массив (или простой вектор) и получите доступ к 'a [W * i + j]' вместо 't [i] [j]' .... И, пожалуйста, отложите свой код так, чтобы он соответствовал (не более чем 72 символа в ширину). –

ответ

3

Вы возвращаете указатель на локальную переменную int pos_obj_positions[k][4];. Переменная разрушается, когда функция заканчивается.

Выделите массив в main и передайте его функции get_obj_pos_positions.

+0

И большинство компиляторов предупредили бы вас об этом, если вы включите все предупреждения (например, 'g ++ -Wall -g') –

2

Я предлагаю вам передать 2D-массив как входной параметр, а не возвращаемое значение. Или лучше использовать вектор.

void get_pos_obj_positions(int k, int pos_obj_positions[][4]) 
{ 
    int i = 1; 

    string pos_obj_file_line; 

    ifstream pos_obj_file("correspondencePOS000_sphere.txt"); 
    if(pos_obj_file.is_open()) 
    { 

     pos_obj_file >> pos_obj_positions[0][0] >> pos_obj_positions[0][1] >> pos_obj_positions[0][2] >> pos_obj_positions[0][3]; 

     while(getline(pos_obj_file, pos_obj_file_line)) 
     { 

      pos_obj_file >> pos_obj_positions[i][0] >> pos_obj_positions[i][1] >> pos_obj_positions[i][2] >> pos_obj_positions[i][3]; 

      i++; 
     } 
    } 

    else cout << "Unable to open file"; 
} 

int main() 
{ 
    int pos_obj_lines; 
    int **pos_obj_positions; 

    pos_obj_lines = lines_in_pos_obj_file(0); 

    pos_obj_positions = new int[ pos_obj_lines ]; 
    for (int I = 0; I < pos_obj_lines; I++) { 
     pos_obj_positions = new int[4]; 
    } 
    get_pos_obj_positions(pos_obj_lines,pos_obj_positions); 

    return 0; 
} 
Смежные вопросы