Почему это не возвращает правильное значение? [dубликат]

Альтернатива сериализации и уникальности

  $ test = [['abc', 'def'], ['ghi', 'jkl'],  ['mno', 'pql'], ['abc', 'def'], ['ghi', 'jkl'], ['mno', 'pql'],];  $ result = array_reduce ($ test, function ($ carry, $ item) {if (! in_array ($ item, $ carry)) {array_push ($ carry, $ item);} return $ carry;}, []);  var_dump ($ результат);  / * php unique.php array (3) {[0] = & gt;  array (2) {[0] = & gt;  строка (3) "abc" [1] = & gt;  string (3) "def"} [1] = & gt;  array (2) {[0] = & gt;  строка (3) "ghi" [1] = & gt;  string (3) "jkl"} [2] = & gt;  array (2) {[0] = & gt;  string (3) "mno" [1] = & gt;  string (3) "pql"}}  

* /

37
задан Paul Wicks 20 April 2009 в 05:31
поделиться

5 ответов

Вам нужно передать указатель на указатель, если вы хотите это сделать.

  void barPush (список BarList **, Bar * bar) {if (list == NULL)  вернуть;  // нужно передать указатель на указатель на ваш список.  // если нет добавления для добавления, то мы выполняем if (bar == NULL) return;  // выделяем пространство для нового узла BarList * newNode = malloc (sizeof (BarList));  // присваиваем правильные значения newNode- & gt; val = bar;  newNode- & gt; nextBar = * list;  // и устанавливаем содержимое указателя на указатель на заголовок списка // (то есть: указатель на голову списка) на новый узел.  * list = newNode;  }  

Затем используйте его следующим образом:

  BarList * l;  l = EMPTY_LIST;  barPush (& амп; л, & амп; b1);  // b1 и b2 - это только bar barPush (& amp; l, & amp; b2);   

Джонатан Леффлер предложил вернуть нового руководителя списка в комментарии:

  BarList * barPush (список BarList *, Bar * bar) {//  если нет добавления для добавления, то мы закончили - возвращаем немодифицированный список.  if (bar == NULL) возвратный список;  // выделяем пространство для нового узла BarList * newNode = malloc (sizeof (BarList));  // присваиваем правильные значения newNode- & gt; val = bar;  newNode- & gt; nextBar = list;  // возвращаем новый заголовок списка.  return newNode;  }  

Использование становится:

  BarList * l;  l = EMPTY_LIST;  l = barPush (l, & amp; b1);  // b1 и b2 - это только бары l = barPush (l, & amp; b2);   
44
ответ дан geofftnz 16 August 2018 в 02:54
поделиться
  • 1
    Спасибо, я подумал, что это проблема, но надеялся, что это не так.) – Paul Wicks 20 April 2009 в 05:38
  • 2
    Кроме того, функция возвращает указатель на новый заголовок списка. BarList * barPush (список BarList *, Bar * bar) – Jonathan Leffler 20 April 2009 в 05:40

Общий ответ: передайте указатель на вещь, которую вы хотите изменить.

В этом случае это будет указатель на указатель, который вы хотите изменить.

13
ответ дан aib 16 August 2018 в 02:54
поделиться

Помните, что в C все равно передается по значению.

Вы передаете указатель на указатель, например

int myFunction(int** param1, int** param2) { // now I can change the ACTUAL pointer - kind of like passing a pointer by reference }
7
ответ дан Anthony 16 August 2018 в 02:54
поделиться

Да, вы должны передать указатель на указатель. C передает аргументы по значению, а не по ссылке.

2
ответ дан Charles E. Grant 16 August 2018 в 02:54
поделиться

Это классическая проблема. Верните выделенный узел или используйте указатель указателя. В C вы должны передать указатель на X в функцию, в которой вы хотите, чтобы ваш X был изменен. В этом случае, поскольку вы хотите, чтобы указатель был изменен, вы должны передать указатель на указатель.

2
ответ дан dirkgently 16 August 2018 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: