2016-04-24 5 views
-2

Я довольно новичок в c/C++, и я пытаюсь создать программу для генетического алгоритма (используя MS Visual Studio 2013). Я пощажу вам подробности этой программы, но у меня есть проблема с «передачей параметров по ссылке». Могу ли я передать параметр по ссылке на другую функцию внутри функции? Здесь вы можете найти простой пример моего кода.C++ передать параметр по ссылке на другую функцию в функции

struct solution{ 
int list1[100]; 
int list2[100]; 
int list3[100]; 
int list4[100]; 
}; 

void function1(solution& foo) 
{ 
// Algorithm that fills list2 
function2(foo); // Fills in list3 
function3(foo); // Fills in list4 
} 

void function2(solution& foo) 
{ 
// algorithm to fill in list3 
} 

void function3(solution& foo) 
{ 
// algorithm to fill in list4 
} 

void localSearch(solution& foo) 
{ 
for(int i = 0; i < 10; i++) 
{ 
    // Change a random value in list1 of foo 
    // Rerun function1 and see if it is a better solution 
    function1(foo); 
} 
} 

int main() 
{ 
solution bar; 
// Fill list1 of bar randomly by other function 

function1(bar); 
// Output finished solution 

return 0; 
} 

Если я пытаюсь сделать это, я получаю все виды ошибок ... Рядом с этим, моим решением структуры повреждается и первая позиция в list1 случайным образом изменяется обратно на 0. Я попробовал несколько вещей смягчите это, но ничего не работает. Если я просто передаю решение функции1 по значению, программы, похоже, работают, но медленнее, потому что он должен скопировать эту большую структуру.

Так что мои вопросы:

1) Можно ли передать (по ссылке) на параметр, который передается по ссылке на другую функцию, в function1?

2) Что было бы лучшим решением?

+0

Пропустите их, в чем проблема? Специального синтаксиса не требуется. –

+1

Думаю, вам нужно форвардно объявить 'function2' и' function3', потому что вы используете их в 'function1', не разделяя их. Или, альтернативно, вы можете перемещать оба над 'function1'. – PcAF

+0

Пожалуйста, ** отредактируйте свой пост ** с образцом сообщений об ошибках (скажем, первые 10). –

ответ

0

1) Можно ли передавать (по ссылке) по параметру, переданному ссылкой на другую функцию, в функции1?

Да, можно передавать одну и ту же переменную, ссылаясь на другую функцию.

void f1(My_Class& m); // Forward declaration. 
void f2(My_Class& m); 

void f1(My_Class& m) // Definition. 
{ 
    f2(m); 
} 

void f2(My_Class& m) 
{ 
    ; 
} 

Вперед-декларация дает компилятору «хедз-ап» о том, как использовать функции (их синтаксис). Без форвардных объявлений компилятор получит знания из своих определений. Тем не менее, определения или форвардные декларации должны поступать перед вызовом функции.

2) Что было бы лучшим решением?

Вот некоторые идеи, чтобы улучшить свое решение:
1) Используйте std::vector вместо массивов.

2) Рассмотрим std::vector структур, а не структура массивов:

struct List_Record 
    { 
     int item1; 
     int item2; 
     int item3; 
     int item4; 
    }; 
    std::vector<List_Record> My_Lists(100); 
// or 
    List_Record My_Array[100]; 

Имея детали в структуре или записи позволяет улучшить управление кэша данных процессором (все элементы в строка помещается смежно).

3) Создайте метод в структуре для инициализации.
У вас должен быть конструктор, который загружает элементы данных со значением по умолчанию.
Рассмотрите возможность добавления метода, который загружает элементы данных из файла (очень полезно для тестирования).

Смежные вопросы