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

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

Автор: stupid_user
Дата сообщения: 29.05.2011 06:31
подскажите, как пошагово скомпилировать исходник на c++ под архитектуру MIPS в Linux? Используя GCC, какие команды компиляции?
Автор: asi81
Дата сообщения: 04.06.2011 15:33
Добрый день!

Подскажите, корректен ли следующий код.

class A{
    char* m_data;
public:
    A() {
        m_data = new char[100];
        memset(m_data,0x31,100);
            m_data[99] = 0;
        printf("+A");
    }
    ~A() {
        delete[] m_data;
        printf("-A");
    }
    char* data() {
        return m_data;
    }

};


void ParseData(char* data) {
    printf("data = %s",data);
}


int _tmain(int argc, _TCHAR* argv[])
{
    ParseData(A().data()); //У меня здесь сомнения имею ли я право использовать параметр-указатель в теле функции
    return 0;
}


При проверке на VS2005 все работает на ура, так как объект создаваемый при вычислении параметров функции удаляется после выполнения функции. Но все же у меня здесь сомнения. Я поискал описания в инете, но нигде не нашел точной информации о времени жизни объектов используемых при расчете параметров функции.
Автор: asi81
Дата сообщения: 05.06.2011 23:46
Всем спасибо. Разобрался сам
Автор: Qraizer
Дата сообщения: 06.06.2011 02:25
Правильно. Время жизни временных объектов - обычно до конца выражения, в пределах которого он создан. Тут это ; после вызова функции. Есть случаи, когда время жизни продлевается. Например, при использовании временного объекта для инициализации ссылки.
Стандарт C++ описывает времена жизни объектов в разделе 3.8. Очень подробно.
Автор: Romeo_sh
Дата сообщения: 06.06.2011 08:11
Ребят, подскажите пожалуйста, как парсить такие выражения и решать их?

Код: 15*(48+29*(-55))-(23+67)/(88-58)
Автор: KChernov
Дата сообщения: 06.06.2011 13:09
Romeo_sh

Цитата:
Без скобок - без проблем решаю задачу

Ну так значит надо свести задачу к задаче без скобок.
Проще всего это наверное сделать рекурсией (правда вопрос, как лучше передавать строку - возможно проще её сделать глобальной, а передавать текущую позицию курсора разборщика).
То есть ваш алгоритм работает как обычно, за исключением того, что когда:
1. натыкаемся на открывающуюся скобку - вызываем рекурсивно разборщик с позиции в строке сразу за скобкой;
2. натыкаемся на закрывающуюся скобку - производим возврат из функции разборщика с посчитанным на тот момент результатом разбора;
3. когда закончилась строка, а мы не в самой первой функции разбора, или очередная закрывающая скобка, а мы в самой первой - значит нет баланса по скобкам.

А вообще задача классическая и готовых решений куча.
Автор: asi81
Дата сообщения: 12.06.2011 19:39
Никто не сталкивался с проблемами шаблонов в Buildere?

простейшая запись

template <class T>
class _list : public list<T,allocator<T>>
{

};

которая нормально компилируется в VS2005, в билдере дает ошибку компиляции

[BCC32 Error] stdlib.h(17): E2299 Cannot generate template specialization from 'allocator<_Ty>'

Что я не так написал, или это косяки билдера? (Builder XE)


Добавлено:
Всем спасибо. Нашел сам.
Это выглядит забавно, но билдер распознавал последние два символа в
class _list : public list<T,allocator<T>>
как оператор >>

Если поставить пробел, все компилируется нормально -
template <class T>
class _list : public list<T,allocator<T> >
{

};
Автор: Qraizer
Дата сообщения: 13.06.2011 00:18
asi81, всё верно. По Стандарту компилятор должен разбивать текст программы на отдельные токены, захватывая как можно длинную последовательность лексем, пока это возможно. Именно это позволяет не получать синтаксических ошибок в операциях сдвига (не путая их с парой операций сравнения), составного присваивания (не путая их с суперпозицией арифметической операции и обычного присваивания), при разборе идентификаторов типа itIs_new_value (не обращая внимание на ключевое слово new внутри него) или record123 (не пытаясь распознавать 123 как число отдельно от слова record) итп.
В новом Стандарте C++1x есть послабление этого принципа, и >> сможет использоваться без пробелов, когда контекст однозначно указывает на список аргументов шаблона. Но в C++03 такого послабления нет. Хотя многие компиляторы тем не менее это позволяют, они всё равно пишут warning при компиляции, потому что это не по текущему Стандарту.
Автор: asbo
Дата сообщения: 16.06.2011 14:13
Здравствуйте.

Есть DLL, созданная в MS Visual C++ 6.0. Есть исходники (собственно, весь проект есть). Используется она в VBA (вызывается из Екселя и Акса).

Я ее потихоньку дорабатывал, добавляя новые фичи. Делал это корректно и отладка не требовалась. Но вот она стала ронять и Ексель и Акс. Оба падают аварийно и закрываются.

В ней несколько функций. Одна из них (простенькая, работающая автономно от других) работает. Сама DLL компилируется нормально.

В аварийных окнах и Екселя, и Акса есть кнопка отладка. Она работает. А как мне ее (отладку) вызвать не роняя их (мне это как серпом)? Ну, типа стационарной точки останова (как Stop в VBA), чтобы без краша, законно в отладку попасть?
Автор: akaGM
Дата сообщения: 16.06.2011 14:58
asbo
да, ни фига не понятно.
хоть ты и адвансед мембер, но умение задавать вопросы -- не твой конёк?
Автор: KF121
Дата сообщения: 16.06.2011 17:15
akaGM
да все понятно, хочет отладить dll при этом не уронив excel.

asbo
Во время работы не креша, запустить VS Debugger и приаттачится к экселю, ну а там дальше лазить по стекам и по отладочной инфе, возмножно студия позволит подгрузить исходники от dll. Полазить по ссылкам
http://yandex.ru/yandsearch?text=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+dll&lr=971
http://www.google.ru/#hl=ru&source=hp&q=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+dll+visual+studio&aq=1&aqi=g4&aql=&oq=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+dll&fp=ffceaa18804c5a87&biw=1673&bih=857
Автор: akaGM
Дата сообщения: 16.06.2011 17:36
KF121

Цитата:
да все понятно

ладно, +1!
Автор: asbo
Дата сообщения: 16.06.2011 20:01
KF121, снкс. Буду пробовать. Доложусь. А точка останова не ставится, как в VBA?

akaGM

Цитата:
ни фига не понятно.
хоть ты и адвансед мембер, но умение задавать вопросы -- не твой конёк?

Я все думал - поподробней расписать или по-дурацки спросить. Решил поподробней :) Тем более, что я с этим C++ исключительно на "Вы" в капсе и красным болдом...

А про умение задавать-отвечать... Это ведь по-разному мозги у всех скроены. Как-то по VBA чел задает вопрос - я въезжал-въезжал... и плюнул. На утро снова не въехал. Другой мембер с ходу ответил. Я ему в личку написал - как, мол, ты понял-то, что он хочет? Он отшутился :) И вот, имея ответ на руках, я как со словарем (уже для интересу) въезжал в вопрос.

А чо сразу адвансед? Вон - зэвэры иногда такое постанут, так хоть стой, хоть падай... Ты вот, хоть и сильвер, а ответить не смог. Не твой конек?

Добавлено:
KF121
Увы, ничего не получилось :( Подключиться к Екселю не могу - список процевв пуст. Галка показвать системные не помогает. Совсем пусто... Выставил по рекомендациям, но тоже не повлияло:

Цитата:
... чтобы при запуске приложения отладчик загружал отладочные символы нашей DLL... явно потребовать загрузку отладочных символов. Для этого следует добавить её в список Additional DLLs в настройках отладки.
Выставляемые точки останова (F9) не подхватываются.


Цитата:
Во время работы не креша, запустить VS Debugger и приаттачится к экселю

Работы, как таковой, у этой DLL нет - из нее вызывается функция, обсчитывает данные и хранит их в себе. Результат вычислений другая ее ф-ция отдает. И так в цикле. Одна строчка, и другая. Первая еще есть - инициализация. Как ее остановить - она раз, и выполнилась...

В случае крэша я попадаю в дебаггер, но цикл ужЕ прерван - Екселю схлопнулся. Без цикла нефиг там смотреть...
Автор: KChernov
Дата сообщения: 17.06.2011 02:59
asbo
Может добавить в эту длл логирование и писать всё подозрительное?
Автор: asbo
Дата сообщения: 17.06.2011 07:31
KChernov
Ошибку я нашел - пытался присвоить значения массиву до переопределения его размерности :)

Но вопрос попадания в отладку не снимается. Логированием можно было бы обойтись, но у меня практических навыков в C++ ноль. Если не сложно - покажите образец кода.
Автор: KF121
Дата сообщения: 17.06.2011 07:31

Цитата:
Увы, ничего не получилось Подключиться к Екселю не могу - список процевв пуст. Галка показвать системные не помогает. Совсем пусто... Выставил по рекомендациям, но тоже не повлияло:

Это фича/баг VS6, накатите один из последних сервис паков. а лучше перейдите на что нить более новое.


Цитата:
Работы, как таковой, у этой DLL нет - из нее вызывается функция, обсчитывает данные и хранит их в себе. Результат вычислений другая ее ф-ция отдает. И так в цикле. Одна строчка, и другая. Первая еще есть - инициализация. Как ее остановить - она раз, и выполнилась...

В случае крэша я попадаю в дебаггер, но цикл ужЕ прерван - Екселю схлопнулся. Без цикла нефиг там смотреть...


советую как и KChernov добавить логирование для начала можно не в dll а в VBA, к примеру сохранять в файл все параметры вызова dll функций. и потом анализить последние записи. идти в длл в уме подставлять значнния и попробовать выяснить где падает. нет, так напсиать маленькое приложение кторое будет вызывать функции из dll с теми параметрами кторые были сохранены на предыдущем шаге. Еще как вариант, добавить пару обработчиков эксепшенов. мотри если падать dll не будет и excel живой лостанется.
Автор: asbo
Дата сообщения: 17.06.2011 07:49
KF121
*накатите один из последних сервис паков.
ОК. СП поищу. Конкретный номер не порекомендуешь?

* а лучше перейдите на что нить более новое
У меня VS8 параллельно стоит. Бзв - а она не может мешать?
Но код, скомпилированный в ней, хоть и рабочий, но в существенно медленнее. А тут скорострельность критична - много данных + тяжелая математика.

* добавить логирование для начала можно не в dll а в VBA
В VBA это ужЕ все сделано :) Да и прежде, чем внести изменения в dll, я их логику прокатываю под VBA и только после этого портирую.

* добавить пару обработчиков эксепшенов
Это мне с нуля надо изучать язык :(
Автор: KChernov
Дата сообщения: 17.06.2011 18:44
asbo

Цитата:
Логированием можно было бы обойтись, но у меня практических навыков в C++ ноль. Если не сложно - покажите образец кода.

В простейшем виде надо просто открыть файл на запись и писать туда сообщения (и как-то сделать, чтобы в аварийной ситуации он закрывался).
Но лучше наверное что-нибудь готовое использовать - пусть знающие люди подскажут.
Автор: bomzzz
Дата сообщения: 21.06.2011 17:09
люди никто не может код написать, как в лист боксе две строки местами поменять. чета голова кругом идет этих индексов.
Автор: kkuuhhaa
Дата сообщения: 25.07.2011 08:42
Можно ли (и как) найти нендлер открытого файла по его имени. Файл открыт программой верхнего уровня средствами Фортрана, где такового понятия нет, ессно.
Автор: bomzzz
Дата сообщения: 25.07.2011 09:25
kkuuhhaa

http://wasm.ru/print.php?article=lockfileswork
Автор: akaGM
Дата сообщения: 25.07.2011 09:29
kkuuhhaa
тебе лучше в конкретный топ:
http://forum.ru-board.com/topic.cgi?forum=33&topic=0555#1

Цитата:
Файл открыт программой верхнего уровня средствами Фортрана, где такового понятия нет, ессно.

ну как же?
у виндовского фортрана есть полный доступ к Win API:
OpenFile(), lopen(), lcreat()
например,
FUNCTION OpenFile(lpFileName, lpReOpenBuff, uStyle)
integer(HFILE) :: OpenFile

Автор: kkuuhhaa
Дата сообщения: 26.07.2011 00:06
akaGM

Там что ли повторить тему?

Про доступ знаю, не знаю как это сделать. Доступ нужен к файлу, открытому той же программой.


bomzzz

Уточню. Хендлер надо искать среди всех открытых файлов в системе?
Для файлов той же программы нет другого способа?
Автор: akaGM
Дата сообщения: 26.07.2011 00:29
kkuuhhaa

Цитата:
Там что ли повторить тему?
да необязательно (если это не вопрос по чистому API на С++), может оказаться, что тебе вообще фортранный топик нужен по основам фортрана, и с этим лучше сюда:
http://forum.ru-board.com/topic.cgi?forum=33&topic=7860#1

так что давай вот это
Цитата:
Доступ нужен к файлу, открытому той же программой.
уточняй...

1) программа на Фортране? если да, то тогда каким боком тут оказывается С++?

2) что ты понимаешь под "доступ к файлу, открытому той же программой"?
разве она не имеет доступа к тому что сама же и открыла?

3) и главное чтО ты хочешь сделать?

например, открывая файл штатными средствами фортрана, hfile в
Код: integer hfile/100/
open (hfile, file='filename.ext')
write(hfile, *) 10, 'akssdhshft', 3.14
close(hfile)
end
Автор: bomzzz
Дата сообщения: 26.07.2011 01:11
я тоже нифига не понял. под досом работа с файлами тоже хендл использовался. как может не быть хендла не пойму. че ха фортран такой

Добавлено:
я не понял что ты из того же процесса хочешь хендл получить. и если у тебя из фортрана есть возможность обращаться к апи функциям тем более непонятно куда хендл подевался
Автор: kkuuhhaa
Дата сообщения: 26.07.2011 07:56
Да, файл открыт Open(unit=nnn... - стандартно
Надо средствами Си его писать-читать. Программа двуязычная (ну там есть и asm).
nnn- это не тот хендл, что в fopen. (или как?)
Ну какие ещё слова надо?
Сейчас закрываю файл в Фортране, что бы открыть его в Си. Хотелось бы от этого избавиться
Автор: bomzzz
Дата сообщения: 26.07.2011 08:43
скорее всего тот. все равно ни фига не понятно. трех-язычная что ли программа?
Автор: kkuuhhaa
Дата сообщения: 26.07.2011 10:05
Да, три языка. А хендл не подходит. Проверял. Ну не знаю как ещё обьяснить. В фортране написана программа разбора заголовка файла. Переписывать нет сил и времени, досттаточно логически навороченная. Работает и ладушки. А в си-асм файл массово считывается. Так быстрее намного, ну и там биг-литл ендиан преобразования.
Автор: karakurt2
Дата сообщения: 26.07.2011 10:32
номер логического устройства в Фортране -- это совсем не то же самое, что и дескриптор файла в С. Существуют функции преобразования, ищите.
Автор: bomzzz
Дата сообщения: 26.07.2011 11:22
напрямую диск что ли читаешь. хендл файла присваевает процессу система виндовс или дос, какой язык никакой разницы

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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