как возвратить двумерный C++ массива символов?

AJAX - это асинхронный Javascript и XML. Зачем отправлять обратно HTML?

Указатели

  • Если вы делаете это через Ajax, я бы настоятельно не рекомендовал отправлять чистый HTML. Вы должны отправить обратно некоторые данные JSON и обработать их соответственно на стороне клиента.

  • Используйте PDO вместо MySQLi

Решение PHP

<?php
include "db.php";
if (isset(

AJAX - это асинхронный Javascript и XML. Зачем отправлять обратно HTML?

Указатели

  • Если вы делаете это через Ajax, я бы настоятельно не рекомендовал отправлять чистый HTML. Вы должны отправить обратно некоторые данные JSON и обработать их соответственно на стороне клиента.

  • Используйте PDO вместо MySQLi

Решение PHP

[110]

Решение Javascript:

$.ajax({
  //AJAX type is "Post".
  type: "POST",
  //Data will be sent to "ajax.php".
  url: "ajax.php",
  //Data, that will be sent to "ajax.php".
  data: {
    //Assigning value of "name" into "search" variable.
    search: name
  },
  //If result found, this funtion will be called.
  success: function(data) {
    //Assigning result to "display" div in "search.php" file.
    const list = JSON.parse(data);
    const html = list.length > 0 ? 
      list.map(name=>{
        `<li onclick="${name}">
           <a>${name}</a>
        </li>`
      }).join("") :
      `<li>No matches found</li>`

    $("#display").html(`<ul>${html}</ul>`).show();
  }
});
POST['search'])) { $Name =

AJAX - это асинхронный Javascript и XML. Зачем отправлять обратно HTML?

Указатели

  • Если вы делаете это через Ajax, я бы настоятельно не рекомендовал отправлять чистый HTML. Вы должны отправить обратно некоторые данные JSON и обработать их соответственно на стороне клиента.

  • Используйте PDO вместо MySQLi

Решение PHP

[110]

Решение Javascript:

$.ajax({
  //AJAX type is "Post".
  type: "POST",
  //Data will be sent to "ajax.php".
  url: "ajax.php",
  //Data, that will be sent to "ajax.php".
  data: {
    //Assigning value of "name" into "search" variable.
    search: name
  },
  //If result found, this funtion will be called.
  success: function(data) {
    //Assigning result to "display" div in "search.php" file.
    const list = JSON.parse(data);
    const html = list.length > 0 ? 
      list.map(name=>{
        `<li onclick="${name}">
           <a>${name}</a>
        </li>`
      }).join("") :
      `<li>No matches found</li>`

    $("#display").html(`<ul>${html}</ul>`).show();
  }
});
POST['search']; $Query = "SELECT Name FROM search WHERE Name LIKE '$Name%' LIMIT 5"; $ExecQuery = MySQLi_query($con, $Query); $res = []; while ($Result = MySQLi_fetch_array($ExecQuery)) { $res[] = $Result['Name']; } echo json_encode($res); }

Решение Javascript:

$.ajax({
  //AJAX type is "Post".
  type: "POST",
  //Data will be sent to "ajax.php".
  url: "ajax.php",
  //Data, that will be sent to "ajax.php".
  data: {
    //Assigning value of "name" into "search" variable.
    search: name
  },
  //If result found, this funtion will be called.
  success: function(data) {
    //Assigning result to "display" div in "search.php" file.
    const list = JSON.parse(data);
    const html = list.length > 0 ? 
      list.map(name=>{
        `<li onclick="${name}">
           <a>${name}</a>
        </li>`
      }).join("") :
      `<li>No matches found</li>`

    $("#display").html(`<ul>${html}</ul>`).show();
  }
});
10
задан r4ccoon 6 April 2009 в 09:05
поделиться

8 ответов

Да посмотрите то, что Вы делаете, там возвращает указатель на объект (названный массив board) который был создан на стеке. Массив уничтожается, когда он выходит из объема, таким образом, указатель больше не указывает ни на какой доступный объект (висячий указатель).

Необходимо удостовериться, что массив выделяется на "куче" вместо этого, с помощью new. Освященный метод для создания динамично выделенного массива в современном C++ должен использовать что-то как std::vector класс, хотя это более сложно здесь, так как Вы пытаетесь создать 2D массив.

char **createBoard()
{
    char **board=new char*[16];
    for (int i=0; i<16; i++)
    {
       board[i] = new char[10];
       for (int j=0; j<10; j++)
         board[i][j]=(char)201;
    }

    return board;
}

void freeBoard(char **board)
{
    for (int i=0; i<16; i++)
      delete [] board[i];
    delete [] board;
}
11
ответ дан 3 December 2019 в 15:53
поделиться

Лучший подход, создают класс платы и делают функцию ctreateBoard его конструктором:

class Board {
  private:
   char mSquares[16][10];

   public:
    Board() {
        for(int i=0; i<16;i++){
        for( int j=0;j<10;j++){   
                mSquares[i][j]=201;
        }       
    }

   // suitable member functions here
 };

Для получения информации о том, как использовать такой класс, нет никакой замены для чтения хорошей книги. Я настоятельно рекомендую Ускоренный C++ Andrew Koenig и Barbra Moo.

11
ответ дан 3 December 2019 в 15:53
поделиться

Я действительно рекомендовал бы использовать вектор STL <> или boost/multi_array контейнеры для этого.

Если бы необходимо использовать массивы, то я рекомендовал бы использовать определение типа для определения массива.

typedef char[16][10] TBoard;

Вы могли также возвратиться

 char**

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

Также, поскольку другие предположили, что Вы не можете возвратить объект на стеке (т.е. локальная переменная)

2
ответ дан 3 December 2019 в 15:53
поделиться

Этот подход не будет работать. При возврате указателя на локальную переменную, Вы столкнетесь с неопределенным поведением. Вместо этого выделите массив на "куче" с новым и скопируйте данные в него вручную индексация его.

2
ответ дан 3 December 2019 в 15:53
поделиться

Не возвращайте указатель на локальную переменную как другой упомянутый. Если бы я был вынужден сделать то, чего Вы хотите достигнуть, то сначала я пошел бы для станд.:: вектор. Так как Вы не изучили станд.:: вектор, вот иначе:

void createBoard(char board[16][10])
{  
  int j =0;int i = 0;
  for(i=0; i<16;i++){
        for( j=0;j<10;j++){   
                board[i][j]=(char)201;
        }       
  }
}
1
ответ дан 3 December 2019 в 15:53
поделиться

Необходимо возвратиться char** вместо char*

0
ответ дан 3 December 2019 в 15:53
поделиться

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

Устройство хранения данных, связанное с платой, находится на стопке функции.

0
ответ дан 3 December 2019 в 15:53
поделиться

Простой ответ на Ваш вопрос является символом **.

Однако не ДЕЛАЙТЕ IT! Ваша переменная "платы" не продлится снаружи createBoard ().

Повышение использования:: multi_array и передача это как ссылка на createBoard () или возврат это непосредственно (но если Вы делаете это, это будет скопировано).

0
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

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