Как преобразовать структуру данных Erlang в список смежности C ++ (график)? - PullRequest
1 голос
/ 18 октября 2011

Отказ от ответственности: автор этого поста - новичок в C ++.

В моем коде Erlang у меня есть структура данных, представляющая ориентированный граф:

-record(vertex_entry, {vertex_name, outgoing_edges}).
-record(outgoing_edge, {edge_weight, neighbour_name}).

Edge1 = #outgoing_edge{edge_weight = 12.5, neighbour_name = 2},
Edge2 = #outgoing_edge{edge_weight = 11.2, neighbour_name = 3},

Edges = [Edge1,Edge2],

Vertex1 = #vertex_entry{vertex_name = 1, outgoing_edges = Edges},
Vertex4 = #vertex_entry{vertex_name = 4, outgoing_edges = Edges},

Graph = [Vertex1,Vertex4].

Я хотел бы передать этот граф в C ++ с помощью функции порта Erlang.

Со стороны C ++ я хотел бы преобразовать этот граф Erlang в граф следующей структуры (это CUDA-оптимизированная смежностьlist структура ):

typedef struct
{
// (V) This contains a pointer to the edge list for each vertex
int *vertexArray;
// Vertex count
int vertexCount;
// (E) This contains pointers to the vertices that each edge
// is attached to
int *edgeArray;
// Edge count
int edgeCount;
// (W) Weight array
float *weightArray;
} GraphData;

Возможно, код генерации графа C ++ из того же источника (глава 16 книги) будет полезен для решения проблемы:

void generateRandomGraph(GraphData *graph, int numVertices, int neighborsPerVertex)
{
    graph->vertexCount = numVertices;
    graph->vertexArray = (int*) malloc(graph->vertexCount * sizeof(int));
    graph->edgeCount = numVertices * neighborsPerVertex;
    graph->edgeArray = (int*)malloc(graph->edgeCount * sizeof(int));
    graph->weightArray = (float*)malloc(graph->edgeCount * sizeof(float));

    for(int i = 0; i < graph->vertexCount; i++)
    {
        graph->vertexArray[i] = i * neighborsPerVertex;
    }

    for(int i = 0; i < graph->edgeCount; i++)
    {
        graph->edgeArray[i] = (rand() % graph->vertexCount);
        graph->weightArray[i] = (float)(rand() % 1000) / 1000.0f;
    }
}

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

Итак, вопрос: Как мне восстановить и преобразовать определенноеErlang структура данных (которая представляет собой граф) в вышеупомянутую указанную пользователем структуру данных графа C ++ в коде C ++?

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Если производительность не критична, рассмотрите возможность сериализации в текст в формате, который легко анализировать.Это сэкономит вам массу усилий по отладке, если вы сможете прочитать вывод, сохранить его в файл при тестировании на стороне чтения и т. Д.

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

Кроме того, если вы относительно новичок в C ++, вы могли бы также начатьпо возможности с хорошим идиоматическим стилем: рассмотрите возможность замены ваших int* массивов и ручного распределения на std::vector<int> и т. д.

1 голос
/ 19 октября 2011

Хорошо, давайте сделаем это шаг за шагом.

1)

int main()
{
  return(0);
}

2)

#include <iostream>
using namespace std; // quick and dirty, not really a good practice

int main()
{
  cout << "hello" << endl;
  return(0);
}

3)

#include <iostream>
using namespace std;
int main()
{
  char c='a'; // this is a single byte
  // in this output it will be interpreted as a single character:
  cout << "c is " << c << endl;

  int n = 5; // the size of this will depend on the architecture
  cout << "the size of an int is " << sizeof(n) << " bytes" << endl;
  cout << "n is " << n << endl;

  return(0);
}

Попробуйте это.Как только вы сможете без ошибок передавать значения в c и n из Erlang, мы можем перейти к указателям, массивам и структурам ...

...