Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача указателя в составе структуры 
:(
    Опции темы
NiJazz
  Дата 24.10.2004, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Структура содержит строку
Код
struct
{
  ...
  LPTSTR   lpStr;
  ...
} MyStruct;

Когда структуру передаю по именованному каналу, строка приходит пустой, хотя остальные элементы структуры, не указатели, доходят нармально. Убирал освобождение памяти, все равно не работает.
Как передать указатель, чтобы значение сохранилось? Спасибо.
PM MAIL   Вверх
chipset
Дата 24.10.2004, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



NiJazz
Покажи плз. как ты её туда засовываешь?



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
S.A.P.
Дата 24.10.2004, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



NiJazz на сколько я понимаю ты передаешь указатель на строку по именованному каналу в другой процесс, или грубо говоря, на другой комп, так делать нельзя, потому, что один процесс не может напрямую обратиться к адресному пространству другого процесса. Если тебе надо передать строку, то можешь использовать массив:
Код
char string[100];

PM MAIL   Вверх
Mad
Дата 24.10.2004, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(Perchilla @ 24.10.2004, 02:25)
так делать нельзя, потому, что один процесс не может напрямую обратиться к адресному пространству другого процесса

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

NiJazz
Между чем (компами, процессами, потоками) ты передаеш этот указатель ?




--------------------
user posted image
PM MAIL   Вверх
S.A.P.
Дата 24.10.2004, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Цитата(Mad @ 24.10.2004, 13:25)
Вообщето можно
Конечно можно, через функции API, но при условии, что все происходит на одной машине. Вот только к чему такой геморрой? Надеюсь NiJazz не собирается передавать сочинения Ленина :)

Цитата(Perchilla @ 24.10.2004, 02:25)
один процесс не может напрямую обратиться к адресному пространству другого процесса
:rtfm

Это сообщение отредактировал(а) Perchilla - 24.10.2004, 13:40
PM MAIL   Вверх
Mad
Дата 24.10.2004, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(Perchilla @ 24.10.2004, 13:37)
Цитата (Perchilla @ 24.10.2004, 02:25)
один процесс не может напрямую обратиться к адресному пространству другого процесса

Да может он, надо тока сегменты заранее выяснить :)


--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 24.10.2004, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Чего-то вы усложняете :)
Идентификаторы процессов, адресные пространства и всё такое -- это, конечно, очень хорошо, но в данном случае -- как из пушки по воробьям...
Код
struct DataContainer // вот это твоя структура
{
   ...
   LPTSTR lpStr;
   ...
};

char* Serialize(DataContainer* dcStruct, int& length)
{
   length = sizeof(DataContainer) + strlen(dcStruct->lpStr) + 1; // вычислим объём передаваемых данных
   char *bytes = new char[length]; // создадим массив
   memmove(bytes,dcStruct,sizeof(DataContainer)); // загоним в него структуру
   memmove(bytes+sizeof(DataContainer),dcStruct->lpStr,strlen(dcStruct->lpStr)+1); // допишем к нему строку
   return bytes;
}

DataContainer Deserialize(char *bytes)
{
   DataContainer temp;
   memmove(&temp,bytes,sizeof(DataContainer)); // сохраним байты в структуре
   temp.lpStr = strdup(bytes+sizeof(DataContainer)); // подправим указатель на строку
   delete[] bytes; // массив байтов нам больше не нужен
   return temp;
}

Работоспособность не проверял, но вроде всё нормально...
Только нужно ещё не забыть после передачи данных удалить массив, полученный из Serialize :)
Добавлено @ 14:50
Тут в Deserialize я предположил, что входным параметром является массив, созданный через new[], и содержащий данные полученные через канал. А в канал, естественно, был заслан массив, возвращённый функцией Serialize :)

Это сообщение отредактировал(а) Дрон - 24.10.2004, 14:52


--------------------
Да. Именно так.
PM   Вверх
S.A.P.
Дата 24.10.2004, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



NiJazz если размер строки не велик, ИМХО удобнее строку держать в шаровом массиве.

Это сообщение отредактировал(а) Perchilla - 24.10.2004, 16:02
PM MAIL   Вверх
bel_nikita
Дата 24.10.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



А про конструктор копирования, случаем, не забыли?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 24.10.2004, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(bel_nikita @ 24.10.2004, 18:29)
А про конструктор копирования, случаем, не забыли?

Там не в конструкторе копирования дело :)
Это ведь не присваивание, а передача данных на другой компьютер.
Фактически моя пара функций Serialize и Deserialize и выполняет функции конструктора копирования.


--------------------
Да. Именно так.
PM   Вверх
bel_nikita
Дата 24.10.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Дрон
не ну мало ли, может по ссылке объект пихают. И симптомы похожие.
Да еще не мешало бы выравнивание структуры добавить.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 24.10.2004, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(bel_nikita @ 24.10.2004, 22:29)
Да еще не мешало бы выравнивание структуры добавить.
Да. Лучше, когда выравнивание 1 байт, хотя sizeof() возвращает правильную длину с учётом выравнивания, т.е. мой пример должен работать.

Цитата(bel_nikita @ 24.10.2004, 22:29)
И симптомы похожие

Симптомы-то похожие :)
Но здесь прикол в том, что при передаче указателя на другой комп сама строка-то не передаётся!
А вот Perchilla предожил относительно простой и правильный выход. Забить постоянный массив внутрь структуры.


--------------------
Да. Именно так.
PM   Вверх
bel_nikita
Дата 24.10.2004, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Но здесь прикол в том, что при передаче указателя на другой комп сама строка-то не передаётся!

Ай-ё! Ну так че тогда голову ломать, конечно неправильно. Надо не указатель передавать, ага, типа, как Perchilla предложил.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Adil'
Дата 25.10.2004, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата(bel_nikita @ 24.10.2004, 22:28)

Надо не указатель передавать, ага, типа, как Perchilla предложил
Ага - очень здорово: если строка длиной 1 символ, 99 "бесполезных" байт туда-сюда гонять - очень экономный подход :rolleyes


--------------------
Удачи
PM MAIL WWW   Вверх
Mad
Дата 25.10.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Вобще пердачу строки лучше делать следующим образом (псевдокод)
Код

str_len = strlen(pStr);
send(&str_len, sizeof(str_len));
send(pStr, str_len);




--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.