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

» Вопросы по программированию на C/С++

Автор: akaGM
Дата сообщения: 28.01.2008 17:24
vecialfor
может ошибка в "C:\test\" ? надо "C:\\test\\"

...

Цитата:
c:\тест\

а, блин...
тогда смотри на кодировку при запуске проги... win1251 или 866? или ваще юникод...
текст на Сях где создавался?

------------------
всем дискутирующим об изменение void*
чтобы изменить void* P; на 2, по-моему, просто достаточно след.:

Код: void* P;

(long)P += 2;
Автор: Bender_R
Дата сообщения: 28.01.2008 17:38

Цитата:

Код:
void* P;

(long)P += 2;

такое не должно работать.
даже (long*)P += 2; не факт, что будет работать

UPD:
вижла говорит
error C2106: '+=' : left operand must be l-value


Цитата:

просто человек задачу не полностью описал:
_просто_ "на два", или на два, как на _указываемый тип_...

эт да...

Автор: akaGM
Дата сообщения: 28.01.2008 17:47
Bender_R


Цитата:
такое не должно работать.
...
вижла говорит...

ну а у меня работает, и по идее должно работать...
правда, не С++, а С, но тоже очень даже визуальный...
Автор: Bender_R
Дата сообщения: 28.01.2008 18:35
akaGM
т.е. у вас работает

Код:
void* P;
(long)P += 2;
Автор: akaGM
Дата сообщения: 28.01.2008 19:18
Bender_R

Цитата:
с приведением void* к long или к long*?

и так и эдак... работает, на С это вполне нормальная практика...


Цитата:
left operand must be l-value
это если как С++ компилировать...


Цитата:
дома посмотрю на gcc
не знаю как под Линь, но под винды minGW'шный Си только ругнётся на "деприкатед каст", но экзюк сделает. а вот g++ уже нет...

--------------------------
короче...

Код: // test.c

#include <stdio.h>

void * BA;

void main(void) {
BA =(void*)0x00495498;
printf("%X\n", BA); //495498 origin
(long)BA += 2;
printf("%X\n", BA); //49549A изменяет "на 2"
(long*)BA += 2;
printf("%X\n", BA); //4954A2 изменяет на "два размера указателя на лонг", т.е. на 8 для вин32
}
Автор: Bender_R
Дата сообщения: 28.01.2008 21:00
akaGM

Цитата:
и так и эдак... работает, на С это вполне нормальная практика...


а..ну на С быть может и нормальная практика.
"такое не должно работать" это применительно к С++. gcc, как и vc, не без оснований требует "lvalue required as left operand of assignment".
Автор: akaGM
Дата сообщения: 28.01.2008 21:30
Bender_R
а я в танке, я С++ не знаю...
хотя вот так работает и на С++:


Код:
void * BA;

BA =(void*)0x00495498;
printf("%lX\n", BA);
_asm {
add dword ptr BA, 2
}

printf("%lX\n", BA); //изменяется на 2

BA = (long*)BA + 2;
printf("%lX\n", BA); //изменяется на 8
Автор: Bender_R
Дата сообщения: 28.01.2008 22:26
akaGM
а если как-то так

Код:
    void *BA = reinterpret_cast<void*>(0x12345);
    cout<<BA<<endl;
    __asm__ __volatile__("add %%ebx,%%eax":"=a"(BA):"a"(BA), "b"(2));
    cout<<BA<<endl;
Автор: akaGM
Дата сообщения: 28.01.2008 22:31
Bender_R
это уже китайская грамота для меня...

ну а вот это же корректно под плюсами:

Код: BA = (long*)BA + 2;
Автор: Bender_R
Дата сообщения: 28.01.2008 22:56
akaGM

Цитата:
это уже китайская грамота для меня...

аналогично


Цитата:

BA = (long*)BA + 2;

чем не нравится-то?

нормально. изменяется на 2 поинтера, т.е. на 8.
может для подстраховки есть смысл делать каст результата (long*)BA + 2; при присваивании BA.

UPD: компилятор не ругается... стало быть и мы не будем морочить себе голову ))
Автор: Abs62
Дата сообщения: 28.01.2008 23:27
Bender_R

Цитата:
то изменится на 2... мистика...))

В чём мистика-то? В том, что ассемблерная вставка реализует целочисленную арифметику, а BA = (long*)BA + 2 - адресную? Если надо, чтобы результаты совпадали, кастовать придётся не к long* , а к char*.
Автор: Bender_R
Дата сообщения: 28.01.2008 23:50
Abs62

Цитата:
мистика...))

было сказано в шутку. даже 2 смайла имеются в подтверждение.
Сейчас не об этом. (с) ирония судьбы.


Цитата:
Если надо, чтобы результаты совпадали, кастовать придётся не к long* , а к char*

по идеи, угу ))
Автор: vecialfor
Дата сообщения: 29.01.2008 08:22
akaGM


Цитата:
а, блин...
тогда смотри на кодировку при запуске проги... win1251 или 866? или ваще юникод...
текст на Сях где создавался?
- вообще прогмаю я в Visual Studio 2005. Просто проблема в том, что хотелось бы работать с любой директорнией независимо от локализации. И из-за этого процесс дальше стопорится.
Автор: Bender_R
Дата сообщения: 29.01.2008 10:28
vecialfor
можно копнуть в сторону OemToCharA/OemToCharW
Автор: JArik
Дата сообщения: 29.01.2008 15:39
Пытаюсь сделать Balloon Tooltip на С , ничего не выходит. Даже скачал уже сделанные проекты, и там не работает.
Причем на Дельфи удалось все сделать...
Может быть какая проблема в компиляторе или ещ в чем ? Пробовал VC++ 6 Pro и VC++ Express 2008.
Автор: Dayver2009
Дата сообщения: 30.01.2008 01:21
Всем доброго времени суток!

Прошу вашей помощи в таком вопросе:

Нужно динамически удалять компоненты. По сути есть код.


Код:
for(int i=5;i<150;i++){
if(FindComponent("StringGrid"+AnsiString(i))){
delete StringGrid{i};
}
}
Автор: EZH
Дата сообщения: 30.01.2008 08:05
Dayver2009
То что возвращает FindComponent присваивай с приведением типа указателю на тип StringGrid . А потом и удаляй компонент по этому указателю типизированному.
Автор: Dayver2009
Дата сообщения: 30.01.2008 12:09
ммммм а как это в коде выглядит? у меня всегда возникают трудности с синтаксисом указателей
Автор: Bender_R
Дата сообщения: 30.01.2008 15:30
Dayver2009
приведение к поинтеру на T
T *t = static_cast<T*>(x); или T *t = (T*)x;

faq
Автор: Qraizer
Дата сообщения: 30.01.2008 18:54
akaGM

Цитата:
а я в танке, я С++ не знаю...


Код:
(long)BA += 2;
(long*)BA += 2;
Автор: akaGM
Дата сообщения: 30.01.2008 19:31
Qraizer

Цитата:
о C знания имеются?

крайне поверхностные, но достаточные чтобы обслуживать свои нужды без таких тонкостей...
но всё равно супер!
-----------
гы
верхняя фраза не о своих знаниях, а о решении проблемы, из этого и последующий вопрос...
-----------
осталось только узнать у вопрошающего товарища на фига ему это понадобилось...

0x00495498
вроде немного на 40:хххх биос похоже...
Автор: Dayver2009
Дата сообщения: 30.01.2008 20:19
Написал в цикле такую строчку


Код:
if(TStringGrid *grid=(TStringGrid*)FindComponent("StringGrid"+AnsiString(5))){grid->DestroyComponents();}
Автор: EZH
Дата сообщения: 30.01.2008 21:11
Dayver2009
Зачем DestroyComponents?
delete grid
Автор: Dayver2009
Дата сообщения: 30.01.2008 23:03
Да действительно так и есть.

Уж не помню где я взял этот DestroyComponents, наверное в одном из множественых примеров которые я перелапатил.

Спасибо за помощь
Автор: foreground
Дата сообщения: 31.01.2008 10:46
Здравствуйте господа.
Помогите пожалуйста решить задачу с установкой STLport. В C++ ничего еще не делел. .а хотелось бы. На китайских и японских сайтах пишут про установку, а на российских что-то не нашел. Хотелось бы получить в результате полнофункциональную версию.. Непонятен сам процесс - зачем компилировать хедер файлы отдельно от программы .. может чего-то в этой технологии я недопонял?
Автор: TeXpert
Дата сообщения: 31.01.2008 11:44
foreground
Цитата:
Непонятен сам процесс - зачем компилировать хедер файлы отдельно от программы .. может чего-то в этой технологии я недопонял?
Это ведь делается один раз, с тем чтобы в дальнейшем не делать. Дальше линкуются просто соответствующие библиотеки.
Автор: Qraizer
Дата сообщения: 31.01.2008 20:02
foreground, если тебе просто нужна некая STL, то наверняка она уже есть в твоей среде разработки, и как-то специально её настраивать не нужно - ужо всё сделано. Если же тебе хочется юзать именно STLPort, который я тоже уважаю больше поставляемых вместе со средами, то это другой вопрос.
Вообще говоря, немного зависит от версии. Если ты качал недавно, то процедура примерно следующая.
Распаковываешь (с сохранением дерева каталогов) в какой-нибудь каталог, не важно какой, но желательно с недлинным маршрутом и обязательно свой собственный, т.е. не в коем случае не перезаписывая уже имеющиеся заголовочные файлы твоей среды разработки. Я, например, у себя распаковал в D:\STL. Не меняешь и не переименовываешь в этом дереве никакие имена - ни подкаталогов, ни файлов.
Заходишь в подкаталог BUILD\LIB\, видишь некий CONFIGURE.BAT, который и запускаешь, указав используемый тобою компилятор. Я, например, иду в D:\STL\BUILD\LIB\ и запускаю CONFIGURE.BAT -с msvc71. Эта штука работает быстро и создаёт файл конфигурации, который будет использовать при построении библиотек.
Запускаешь построение библиотек отсюда же, пользуясь твоим мэйкером и указывая ему соответствующий твоему компилятору .MAK-файл. Я использую NMAKE -f MSVC.MAK. Эта штука будет работать довольно долго и в итоге создаст шесть библиотек: по два варианта - статическая .LIB и динамическая .DLL - релизная, отладочная и специальная отладочная версия STLPort. Релизные и отладочные отличаются в основном наличием или отсутствием оптимизации. Специальная же отладочная версия - это жестокая вестчь. Она очень хорошо отлавливает программерские глюки наподобие использования невалидных итераторов, неверных диапазонов последовательностей итп. Т.е. всё то, проверка чего занимает кучу времени, и поэтому этого очень не хочется иметь в готовом коде, но что очень может помочь при отладке. А особенно, когда ещё не специалист и понимаешь, что мог наглючить жёстко. STLPort чуть ли не единственная реализация STL, имеющая подобный отладочный режим. Но тормозит при этом, конечно, конкретно.
Ещё раз запускаешь свой мэйкер с тем же .MAK-файлом, но добавляешь параметр install. Я юзал NMAKE -f MSVC.MAK install. Эта штука тоже отрабатывает недолго, и результатом её работы является копирование .LIB и .DLL по соответствующим каталогам. А именно: .LIBы помещаются в подкаталог lib, .DLLки - в каталог bin. У меня это D:\STL\LIB и D:\STL\BIN соответственно. Впрочем, DLLки я переношу в Windows\System32.
Осталось выполнить что-то вроде NMAKE -f MSVC.MAK clean, чтобы грохнуть все объектники и связанное с ними, и если уже выполнил предыдущий пункт, то больше не нужное.
Если очень хочется, можно выполнить CONFIGURE.BAT --clean.
Вообще говоря, это потенциальный минимимум того, что нужно сделать. На самом деле, прилагая немного больше усилий, можно кастомизировать процесс в весьма широких пределах. Можно сказать строить только некоторые из шести библиотек или наоброт (на самом деле, есть ещё варианты, кроме указаных шести). Можно насоздавать несколько вариантов библиотек для нескольких компиляторов, если ты используешь их более одного, или с разными опциями компиляции (я например, использую три варианта - для VC71, для Intel C++ и для него же, но с поддержкой нативного long double). Обо всём этом можно почитать в его readmeях и хелпах.
Использовать STLPort потом тоже очень несложно. Его каталог LIB добавляешь к окружению, чтобы среда знала, где искать .LIBы, BIN соответственно к путям, чтобы .DLLки нормально находились (впрочем, если копирнуть в общедоступное место, как я в Windows\System32, то BIN не нужен). Можно добавить на постоянной основе, они не мешают, даже если не использовать STLPort. Его каталог STLPORT (у меня это D:\STL\STLPORT) нужно добавить к окружению впереди каталогов среды, чтобы компилятор начинал поиск заголовков оттуда. Соответственно добавлять не нужно, если ты не хочешь использовать STLPort, а желаешь вместо него заюзать STL, поставляемую с твоей средой. Т.е. переключаться между ними не просто, а очень просто - указав на первом месте STLPortовый каталог или не указав. Всё остальное сделается само, т.к. для MSный сред разработки в заголовках STLPort-а расставлены автолинующие прагмы, которые сами укажут линкеру, какую либу нужно подлинковывать.
Только правильно указывай параметры компиляции: для статических либ говори, мол, хочу static libraries, для динамических - хочу dynamic libraries. Т.е. статис/динамик "для STLPort-а" будет совпадать с "для RTL". Для релизных библиотек нужно, чтобы дифайн _DEBUG отсутствовал, для дебуга наоборот, присутствовал; для юзанья специального дебуга, нужен просто дебуг и плюс ещё один дефайн - _STLP_DEBUG. Обо всём, кроме _STLP_DEBUG, заботится сама среда разработки, когда меняешь соответствующие параметры в настройках проекта. Так что всё учтено. Единственное, что следует помнить, по дефолту STLPort стоит свои библиотеки как multithreadные, поэтому для статических библиотек нужно выбирать RTLные либы тоже multithreadные. Можно посторить STLPort и для без multithreadности, но ИМХО это лишнее.
В заключение. Не всё в STLPort-у является просто заголовками. Кое-что не инстанцируется по месту использования, а подликовывается для сокращения времени компиляции и уменьшения размеров исполняемых файлов. Вот это и включается в библиотеки. Туда помещается форматирующий ввод/вывод, комплексные и некоторые строковые операции и работа с локалями. Можно вообще не строить библиотеки, но в этом случае либо некоторые возможности будут недоступны, либо будут заюзаны исходные возможности среды разработки. Вообще, в STLPort-у есть три замечательных заголовка host.h, stl_mycomp.h и user_config.h, которые лежат в STLPORT\STL\CONFIG\, и которые позволяют много что настроить очень детально.
Автор: foreground
Дата сообщения: 01.02.2008 08:28
Большое спасибо за такой развернутый ответ, вот про CONFIGURE.BAT я кокраз ничего не видел..
ну и остальное вобщем-то тоже ценно.. особенно для такого ламмера как я.
Автор: mozgodrocha
Дата сообщения: 01.02.2008 10:25
Народ, словил непонятный глюк. Работоспособность проги зависит от порядка объявления переменных... Т.е.
float a;
int b;
работает, а:
int b;
float a;
валится с ошибкой Access violation... Просто меняю порядок следования двух соседних строк. Что это может быть? Может просто оставить рабочий вариант? Но страшно что-то.
Автор: akaGM
Дата сообщения: 01.02.2008 12:16
mozgodrocha
после того -- не означает вследствии того...
код покажи...
а так остаётся только гадать, т.к . ошибка явно из наведённых...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


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