Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Как передать указатель в другую программу?

Автор: Galicarnax
Дата сообщения: 02.08.2008 21:52
Имеются две программы, запускаются в линуксе, соединяясь через стандартный поток, т.е. так:
./prog_out | ./prog_in

В первой программе создается большой динамический массив. Вторая программа тоже с ним должна работать, но она его не меняет, только считывает. Поэтому нелогично создавать в ней такой же массив и копировать в него первый через стандартный поток. Хочется передать второй программе только указатель. Но оказалось, что передать тупо указатель (т.е. адрес массива) в стандартный вывод можно, а вот принять - нет.

Пример. Программа prog_out:

int *a;
a = new int;
*a = 100;
cout << a;

Программа prog_in:

int *b;
cin >> b;

Первая компилится, вторая при компиляции выдает ошибку.
Кто-нибудь знает, как добиться цели?
Автор: Cheery
Дата сообщения: 02.08.2008 22:37
Galicarnax

Цитата:
сокдиняясь через стандартный поток

способен передавать текст..
поэтому, как мне кажется, вариант либо массив в файл, либо передавать в текстовом виде адрес памяти, где расположен массив, и размерность
Автор: Galicarnax
Дата сообщения: 03.08.2008 12:28
Второй вариант я обдумывал, но не нашел, как можно перевести адрес (и базовый размер), содержащийся в указателе, в текстовый формат, а потом обратно.

PS
Упс, в первом сообщении очепятка была, исправил.
Было:
int b;
cin >> b;

А надо, конечно же:
int *b;
cin >> b;
Автор: KADABRA
Дата сообщения: 03.08.2008 16:34
Galicarnax

Цитата:
Поэтому нелогично создавать в ней такой же массив и копировать в него первый через стандартный поток. Хочется передать второй программе только указатель.

А какой смысл если вторая программа не сможет обращатся не к своей памяти?
Советую про shared memory почитать.
Автор: f_serg
Дата сообщения: 04.08.2008 07:57
Galicarnax

Цитата:
Советую про shared memory почитать.

Присоединяюсь. И советую использовать вот эту библиотечку:
http://www.ossp.org/pkg/lib/mm/
Автор: BornLeader
Дата сообщения: 05.08.2008 13:49
Galicarnax

Под Windows эта задача может быть решена так, подумай сам как переделать под Linux.

// prog_out.cpp

#include <iostream>
#include <conio.h>
using namespace std;

int main(int argc, char* argv[])
{
int* a;
a = new int;
*a = 100;
cout << (char*)a << endl;
return 0;
}

// prog_in.cpp

#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
FILE* handle;
char message[4];

handle = _popen("prog_out.exe", "rt");
if(handle == NULL)
cerr << "_popen error";

fgets(message,sizeof(message),handle);
cout << ((int)message[0]) << endl;

if(-1==_pclose(handle))
cerr << "_pclose error";

return 0;
}

Страницы: 1

Предыдущая тема: Как из bat сделать exe?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.