Указатель, кажется, сбрасывается без видимой причины - PullRequest
2 голосов
/ 02 апреля 2012

Редактировать: Я также не возражаю, если узнаю, что это слишком двусмысленно, чтобы вы могли понять или найти что-то не так, я знаю, что это не так.Это напрямую связано с кодом, потому что изменение происходит правильно, когда я собираюсь выйти из функции ... а не во время реального "кода".Поэтому я надеюсь, что этого достаточно, независимо от того, что я добавлю, если потребуется.Заранее спасибо!

Я пытаюсь создать простой (односторонний) связанный список, и я должен создать его сам, а не использовать STL или любой другой уже созданный динамический контейнер.Я сделал простой, но у меня, похоже, проблема в том, что я просто не могу обернуться.

Всякий раз, когда я делаю новый узел в списке (я всегда возвращаю первый узел списка весли он был изменен, я не использую «дозорный» или «фиктивный» узел), новый узел исправен до тех пор, пока я не достигну определенной точки в программе, когда он сам все сбрасывает до первого представленного мной узла.

Чтобы постарался сохранить чистоту поста, я добавлю меньше кода и больше «функциональности» или шаблона, но если этого недостаточно, я добавлю больше.

Вот как это работает:

Элемент My Node

struct Node {    // simplified example
    string type;    //can be ignored
    int ap_nr;      // I sort by apartment number
    int sum;        // can also be ignored
    Node *next;
};

В основном я инициализирую свой первый узел как "поддельный" узел (ap_nr = -1, другой ap_nr не может быть отрицательным).

int main ()
{
   int command = 1;   // used for loop
   Node *begin;    // head of my list
   begin = new Node;
   begin = create_node();   // initialize
   while (command != 0)    // This is for work with a "handler", accesses different mechanics of the program, I don't know exactly how to explain in english
   {
       input_command(command, begin);    // reads command, sends result to handler
   }
return 0;
}

Вот моя команда ввода:

void input_command (int &command,Node *begin)
{
    cout<<"Option #"; cin>>command;
    input_validation (command, begin);
}

И единственная часть моего обработчика, которую я использую atm:

void input_validation (int command, Node *begin)
{
     if (command == 1 trough 15)    // pseudo code 
         execute (command)    
}

После добавления узлак списку я использовал отладку, чтобы отследить его, и первый остается как есть, но затем второй узел (я добавляю его перед первым и возвращаю новое «начало»), сначала все в порядке (есть новая памятьместоположение и new_begin->next = old_begin, но после выхода из структуры ìnput_command она сбрасывается)

* Вот структура input_command и схема программы: *

Main: - инициализировать «поддельный» узел / войти в цикл меню -> перейти к input_command.

UI: - команда ввода-> команда чтения -> проверяет -> отправляет обработчику.

Список: - добавляет узел желаний в «список» (на самом деле список неse, просто связанные узлы) -> возвращает первый узел.Первый узел в порядке (имеет новый адрес, указывает на старый узел)

Возвращает к пользовательскому интерфейсу: -> команда ввода (нижняя скобка) и сбрасывает (что я имею в видуэто значит, что независимо от того, какой узел я добавляю, он становится первым добавленным узлом. Итак, допустим, я представляю квартиры с 1 по 10, он помнит только «1»).

Я что-то упустил?у меня есть логическая ошибка в моем дизайне?Вам нужно больше кода для ослов?Просто скажите мне, что добавить, я понимаю, что это немного неоднозначно.

Примечания: Теперь я могу добавлять узлы только перед своим главным узлом, я не будусосредоточьтесь на чем-то новом, пока я не выполню эту работу должным образом, пока мой дизайн не является частью проблемы, я тоже не буду это менять, но если это плохо, я буду признателен за замечания и предложения.

Это единственная реализованная часть функции add_node:

Node *add_node (Node *begin,string type, int sum, int ap_nr) // Node begin e primul nod din lista, trebuie mereu plimbat cu toate functiile pe lista
{
// if first node is dummy node

if (begin->ap_nr == -1)
    {
        begin->type = type;
        begin->ap_nr = ap_nr;
        begin->sum = sum;
        begin->next = 0;
        return begin;
    }

 // else create new node and insert it in sorted position

 else
 {

     // if node should be inserted before first node (begin)

     if (ap_nr <begin->ap_nr)
     {
         Node *cursor;
         cursor = new Node;
         cursor->ap_nr = ap_nr;
         cursor->type = type;
         cursor->sum = sum;
         cursor->next = begin;
         return cursor;
     }
 }

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Как сказал RStrad, проблема в том, что вы хотите изменить указатель в функции, и эти изменения остаются там и вне этой функции .

ВC / C ++, все передается по значению.Если вы хотите, чтобы функция что-то изменила, вам нужно передать указатель на это что-то .Таким образом, в случае, когда вы хотите изменить указатель, вам нужно передать указатель на этот указатель, например так:

*Node begin;
input_command(command, &begin);
// the pointer itself has an address, which you are sending with &

Тогда определение input_command() будет:

void input_command (int &command, Node **begin)
// observe here the pointer to your pointer

Изнутри input_command() ваш вызов к input_validation должен быть:

input_validation (command, &(*begin));
// the address of the pointer towards which **begin points

Тогда определение input_validation() будет:

void input_validation (int command, Node **begin)

...и любые дальнейшие вызовы, скажем, например, функции, которая фактически добавляет узел, будут продолжать следовать этому формату.Короче говоря, если у вас есть указатель *P и вы хотите изменить его в функции, вам нужно отправить его адрес &P.Эта функция получит указатель на указатель **P, и любые последующие вызовы, которые будут включать адрес P, должны быть выполнены с помощью &(*P).

1 голос
/ 02 апреля 2012

Мне действительно нужно увидеть добавление узла в список кода.Из того, что вы описываете при добавлении узла перед текущей головой, проблема в том, что начало изменяется ТОЛЬКО в локальной области и не передается обратно из input_command (то есть передается по ссылке или передается по значению)

...