Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизПерекинуть данные из переменной в структуру (record) Найти похожие ветки
← →
Ingwar © (2006-10-26 12:47) [0]Задали такую задачку: Есть переменная типа string и есть структура(record).
Нужно перекинуть данные из переменной в структуру. Можно перекинуть по байтам или чем-то подобным, но возможно есть какая-то функции для таких операций. Подскажите Мастера! Спасибо.
← →
Джо © (2006-10-26 12:47) [1]Что значит "перекинуть данные"? Какова структура этой записи (record)?
← →
Сергей М. © (2006-10-26 12:55) [2]
> есть какая-то функции для таких операций
Угу, есть)
var
MyString: string;
MyRecord: TSomeRecord;
..
//подразумевается что Length(MyString) = SizeOf(MyRecord)
CopyMemory(@MyRecord, PChar(MyString), SizeOf(MyRecord));
← →
Ingwar © (2006-10-26 13:01) [3]ТО Сергей М.: А если размер MyString > MyRecord - это не критично?
← →
Сергей М. © (2006-10-26 13:03) [4]
> Ingwar © (26.10.06 13:01) [3]
Ну как же не критично ?
Если, скажем,
Length(MyString) = 4
SizeOf(MyRecord) = 3
куда, спрашивается, девать разницу ?)
← →
Ingwar © (2006-10-26 13:05) [5]И еще вопрос. А если надо брать данные не с самого начала строки?
То есть MyString допустим имеет размер около 1К у нее есть заголовок который мне не нужен, а меня интересует информация где-нить байта с 200го.
← →
Anatoly Podgoretsky © (2006-10-26 13:07) [6]А что структура
b1: Byte
...
bN: Byte
← →
Ingwar © (2006-10-26 13:09) [7]Нет, структура на 600 байт. В основном разнообразные массивы char, есть так же типы byte.
← →
Сергей М. © (2006-10-26 13:10) [8]
> где-нить байта с 200го.
CopyMemory(@MyRecord, @MyString[200], SizeOf(MyRecord));
← →
Anatoly Podgoretsky © (2006-10-26 13:10) [9]
> Если, скажем,
>
> Length(MyString) = 4
> SizeOf(MyRecord) = 3
>
> куда, спрашивается, девать разницу ?)
Думаешь наоборот есть разница?
← →
Anatoly Podgoretsky © (2006-10-26 13:11) [10]
> Нет, структура на 600 байт. В основном разнообразные массивы
> char, есть так же типы byte.
Слова, слова,
Сестра имя, имя скажи
← →
Сергей М. © (2006-10-26 13:13) [11]
> Думаешь наоборот есть разница?
Думаю что автору следует самому об этом подумать)
← →
Ingwar © (2006-10-26 13:16) [12]Кстати, по F1 у меня нет никакой инфы про CopyMemory... Странно.
ТО Anatoly Podgoretsky: Слишком длинная структура, а скопировать мне счаз её неоткуда... Но по памяти, там что связанное с соревнованиями по гандболу... Составы команд, названия команд, имена судей, время матча, кто забил и т.д.
← →
Сергей М. © (2006-10-26 13:20) [13]
> у меня нет никакой инфы про CopyMemory
Есть.
Введи модель поиска вручную.
Если у тебя D7, то подобный "глюк" имеет место быть.
> Слишком длинная структура
Ты лучше объясни, каким образом структурированные данные у тебя оказались в буфере строковой переменной ...
← →
Ingwar © (2006-10-26 13:21) [14]Ответ на [11]: Я уже сам понял, что стормозил с таким вопросом... Просто вначале спросил и отослал, а потом понял, что тормознул =)
← →
Ingwar © (2006-10-26 13:25) [15]Да у меня D7. Это у препода надо спросить... Как раз счаз уезжаю в институт...
← →
Anatoly Podgoretsky © (2006-10-26 13:26) [16]Сусанин?
Веду, но не скажу куда.
Сообственно у нас нет проблем, у нас все копируется.
← →
Anatoly Podgoretsky © (2006-10-26 13:32) [17]Ну так чтобы и дальне не тормозить, просто не заходи в ветку или давай конкретные данные.
Кстати Сусанин завел поляков не потому что он этого хотел, а потому что и сам не знал дороги :-)
← →
Сергей М. © (2006-10-26 13:32) [18]
> Это у препода надо спросить
У вас там что, спецбригада по запутыванию вражеской разведки ?)
← →
Ingwar © (2006-10-26 16:02) [19]При попытке скопировать структуру вылетает по ошибке =(
← →
Ketmar © (2006-10-26 16:05) [20]>[19] Ingwar(c) 26-Oct-2006, 16:02
>При попытке скопировать структуру вылетает по ошибке =(
ошибка в 17-й строке. или в DNA.
← →
Ingwar © (2006-10-26 16:07) [21]Похоже препод хочет деньги на мне заработать =( Ему нужна прога для каких-то соревнований по гандболу... Суть такова, что по UDP получаются пакетики в переменную типа стринг, а потом надо перекинуть в структуру и переменную стринг...
Это делается из-за того, что начало пакета фиксированое, а вот дальнейшая часть может меняться =( Поэтому не могу сразу считать в структуру.
ЧТо-то в этом роде я понял из разговора с преподом
← →
Reindeer Moss Eater © (2006-10-26 16:10) [22]Да препод реально подымется получив эту процедуру копирования.
не иначе хочет новую тачку купить.
← →
Ketmar © (2006-10-26 16:10) [23]>[21] Ingwar(c) 26-Oct-2006, 16:07
>что по UDP получаются пакетики в переменную типа стринг, а
>потом надо перекинуть в структуру и переменную стринг...
>Это делается из-за того, что начало пакета фиксированое, а
>вот дальнейшая часть может меняться =( Поэтому не могу
>сразу считать в структуру.
не того "препод" выбрал, ой, не того. его ж потом претензиями замучают.
зыж не так это пишется. НЕ ТАК! что за манера у людей -- спрашивать не "помогите с направлением для задачи XXX", а "надо YYY". причём это YYY -- чистые лсд-шные измышлизмы автора, не имеющие отношения к самой задаче...
← →
Сергей М. © (2006-10-26 16:14) [24]
> Похоже препод хочет деньги на мне заработать
Ну это, согласись, есть твоя личная половая драма)
> Ему нужна прога для каких-то соревнований
Остерегайся - он может оказаться извращенцем)
> Суть такова, что по UDP получаются пакетики в переменную
> типа стринг
Эт чего, ТЗ такое что ли ?!
> Это делается из-за того, что начало пакета фиксированое,
> а вот дальнейшая часть может меняться =( Поэтому не могу
> сразу считать в структуру.
>
> ЧТо-то в этом роде я понял из разговора с преподом
Пока ты не "разберешься" с "преподом", ни ты его ни он тебя не удовлетворит)
На сей момент из твоих объяснений все изложенное выглядит как галиматьища неесусветная
← →
Ingwar © (2006-10-26 16:19) [25]ТО Ketmar: Понял
Ошибка:
Project D:\Test.exe faulted with message: "access violation at 0x4f4b5320: read of address 0xf4fb5320". Process Stopped. Use Step of Run to continue.
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
buf: string;
len : int64;
begin
AData.ReadBuffer(buf, len);
CopyMemory(@Struct, PChar(buf), 401); //тут выскакивает ошибка
CopyMemory(@Stroka, @buf[402], (len-401));
end;
Struct - структура описаная через record
Stroka : string;
← →
Anatoly Podgoretsky © (2006-10-26 16:20) [26]А я знаю, но тебе нескажу, поскольку это секретно.
← →
Ingwar © (2006-10-26 16:20) [27]Забыл одну строчку в коде
len := AData.Size;
← →
Ketmar © (2006-10-26 16:21) [28]мда... "гляжу в книгу, вижу фигу" (ц)
[4], [9].
плюс: ReadBuffer(buf...)??? "здравствуй, мир на четвереньках" (ц)...
← →
Ingwar © (2006-10-26 16:22) [29]Anatoly Podgoretsky злой ты =)
← →
Сергей М. © (2006-10-26 16:23) [30]
> CopyMemory(@Struct, PChar(buf), 401); //тут выскакивает
> ошибка
Врешь)... причем нагло)
Ошибка возникает здесь:
AData.ReadBuffer(buf, len); //<-- !!!!!!!!!!!!!
← →
Сергей М. © (2006-10-26 16:24) [31]
> Ingwar © (26.10.06 16:22) [29]
> Anatoly Podgoretsky злой ты =)
А ты врун и неуч)
← →
Ketmar © (2006-10-26 16:26) [32]>[30] Сергей М.(c) 26-Oct-2006, 16:23
>Ошибка возникает здесь:
может и там. стек-то уже обгадили. вот и берём адрес buf, которая указывает "в светлое будущее".
← →
Ingwar © (2006-10-26 16:28) [33]Я по степам шел... В buf все нормально прочлось... ВОТ! Так что я не вру!
← →
Сергей М. © (2006-10-26 16:29) [34]
> Ingwar © (26.10.06 16:28) [33]
>
> Я по степам шел
Куда-куда ты шел ?!)
> В buf все нормально прочлось
Тебе просто повезло.
← →
Ketmar © (2006-10-26 16:30) [35]>[33] Ingwar(c) 26-Oct-2006, 16:28
>В buf все нормально прочлось...
да? ты-таки врун... на [28] медитировал?
← →
Anatoly Podgoretsky © (2006-10-26 16:34) [36]
> "access violation at 0x4f4b5320: read of address 0xf4fb5320".
Не трожь чужую память, не твое.
← →
Anatoly Podgoretsky © (2006-10-26 16:36) [37]
> Anatoly Podgoretsky злой ты =)
Я еще не злой, это еще впереди.
Жалко что дальше ветку некуда отправить, нет у нас других конференции, эта последняя.
← →
Сергей М. © (2006-10-26 16:36) [38]
> buf: string;
> ..
> ...
> AData.ReadBuffer(buf, len)
Выделенный жирным тип - это что за хня ?)
Это препод под страхом "низачота" тебе велел эту хню написать ?)
← →
Ingwar © (2006-10-26 16:42) [39]А почему я не могу прочитать в переменную? Это взято в чистом виде из книги Indy in Delphi в переводе некого А.П. Подгорецкого =)
← →
Anatoly Podgoretsky © (2006-10-26 16:49) [40]Почему нельзя, можно, только правильно писать надо.
← →
Германн © (2006-10-26 16:50) [41]
> Ingwar © (26.10.06 16:42) [39]
>
> А почему я не могу прочитать в переменную?
А ты уверен, что ты читаешь именно в переменную?
> взято в чистом виде из книги Indy in Delphi в переводе
> некого А.П. Подгорецкого =)
>
НЕ ВЕРЮ!!!
← →
Ingwar © (2006-10-26 17:02) [42]Уже все сделал =) Просто я не думал, что нужно обязательно принудительно указывать размер переменной, через SetLength =) Просто пока я не применял CopyMemory, все работало, а копимемори оказался привередой.
В любом случае всем спасибо!!! Я разобрался и у меня все работает! Лишний раз убеждаюсь, что я не ошибся в выборе форума =)
Отдельное спасибо Анатолию Подгорецкому за перевод книги!
← →
Сергей М. © (2006-10-26 17:07) [43]
> Ingwar © (26.10.06 17:02) [42]
Удачи.
← →
Anatoly Podgoretsky © (2006-10-26 17:17) [44]А лучше бы поблагодарил за то, что я тебя пинал в этой ветке, правда безрезультатно, но надежды не оставляю.
← →
Сергей М. © (2006-10-26 17:19) [45]
> пинал
Видать не туда)..
Под фаберже трэба було, под фаберже..)
← →
Anatoly Podgoretsky © (2006-10-26 17:20) [46]
> Видать не туда)..
Туда, но пинало плохое.
← →
Сергей М. © (2006-10-26 17:22) [47]
> пинало плохое
Или фабержи протухли)
← →
Ketmar © (2006-10-26 18:37) [48]>[42] Ingwar(c) 26-Oct-2006, 17:02
>Просто я не думал, что нужно обязательно
>принудительно указывать размер переменной, через SetLength
а справку сгрызли термиты. интересно, зачем борланды в справке распинались по поводу AnsiStrings?
>Просто пока я не применял CopyMemory, все работало
да??? обалдеть.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.046 c