Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1121
от 03.10.2008, 02:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 421, Экспертов: 40
В номере:Вопросов: 4, Ответов: 7

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 145162: В редакторе кода Delphi есть полезная фича - при нажатии Ctrl+Shift+1 ставится метка на строку. Потом нажав Ctrl+1 можно быстро вернуться на эту строчку. Не могу найти, как так делать в VC++2008....
Вопрос № 145177: Как в C++ сделать глобальные переменные для нескольких *.cpp? Я выношу, например, int nValue в .h, всё компилируется, но при попытке собрать линковщик ругается типа "variable already defined in main.obj" ...
Вопрос № 145194: У меня вопросик маленький или прозьба нужен алгоритм "Умножение матрицы на матрицу " если есть пришлите на covalijenia@mail.ru Я предумал свой алгоритм но он дает ошибки после каждой строки в приложение Описание класса MATRIX и функция ...
Вопрос № 145203: Сделал прогу на чистом Win32 API, в VC++2008, в ХР. Попробовал запустить в Висте (там не ст авил VC++2008). Получил вежливый отказ: "не могу запустить из-за неправильной параллельной конфигурации, см. подробности в журнале". В журнале написа...

Вопрос № 145.162
В редакторе кода Delphi есть полезная фича - при нажатии Ctrl+Shift+1 ставится метка на строку. Потом нажав Ctrl+1 можно быстро вернуться на эту строчку. Не могу найти, как так делать в VC++2008.
Отправлен: 27.09.2008, 04:04
Вопрос задал: effort (статус: Студент)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Sk0rp
Здравствуйте, effort!
поставить/снять закладку Alt+F2
перейти вперед F2, назад Shift+F2
Ответ отправил: Sk0rp (статус: 5-ый класс)
Ответ отправлен: 27.09.2008, 04:29
Оценка за ответ: 5
Комментарий оценки:
В минифоруме решение полное


Вопрос № 145.177
Как в C++ сделать глобальные переменные для нескольких *.cpp? Я выношу, например, int nValue в .h, всё компилируется, но при попытке собрать линковщик ругается типа "variable already defined in main.obj"

Приложение:

Отправлен: 27.09.2008, 11:17
Вопрос задал: effort (статус: Студент)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sk0rp
Здравствуйте, effort!

Все правильно ругается, т.к. объект пытается инстанцироваться в каждом месте, куда вы включаете h файл. Объект может быть только один, соответственно он должен быть определен в каком нибудь cpp файле.
1. Перенесите int nValue в любой cpp файл.
2. В других файлах (можно и в h файде), там где эта переменная будет нужна напишите:
extern int nValue;
что и будет означать внешнюю линковку с глобальным объектом.
Ответ отправил: Sk0rp (статус: 5-ый класс)
Ответ отправлен: 27.09.2008, 11:29
Оценка за ответ: 5
Комментарий оценки:
Всё заработало.
ЗЫ: вы мне так в прошлом вопросе и не ответили, как ставить букмарки в редакторе кода

Отвечает: realbustard
Здравствуйте, effort!
Попробуйте в файлах *.срр объявить переменную nValue как extern. Ключевое слово extern означает, что переменная объявлена в *.cpp, но не определена.Т.е. получится следующее: extern int nValue. А переменную nValue определите в файле *.h


---------
Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: 3-ий класс)
Ответ отправлен: 27.09.2008, 11:42

Отвечает: mega
Здравствуйте, effort!
когда при при сборке линковщик определяет несколько экзкмпляров одной переменной в объектных файлах (*.obj), это говорит о том, что в несколько компилируемых файлов проекта *.cpp был включен заголовочный файл, в котором определена и инициализирована nValue. Поскольку все объектные файлы собираются в один исполняемый (*.exe, *.dll), все статические переменные проекта должны быть обязательно в одном экземпляре.

по хорошему, это должно решаться инициализацией переменной в каком-то одном *.cpp, как подметил Sk0rp,
но если вы используете инлайн методику программирования, этот вариант не всегда может быть преемлем, поскольку в таком случае, все взаимозависимости программы находятся в звголовочных файлах. Решить проблему можно на уровне препроцессора линковщика, с использованием дополнительной декларации к переменной __declspec(selectany).
В общем-то, название selectany говорит само за себя: при линковке, встретив несколько экземпляров переменно й, выбрать любой из них.

PS: модификатор __declspec поддерживается не всеми комиляторами, но точно присутствует в MSVC 6, MSVC 7.1 и выше

Приложение:

Ответ отправил: mega (статус: 5-ый класс)
Ответ отправлен: 27.09.2008, 11:55
Оценка за ответ: 5
Комментарий оценки:
не проверял, но ответ заслуживает внимания

Отвечает: Михеев Евгений
Здравствуйте, effort!
Попробуйте сделать класс, содержащий только эти переменные
Ответ отправил: Михеев Евгений (статус: 1-ый класс)
Ответ отправлен: 27.09.2008, 21:11


Вопрос № 145.194
У меня вопросик маленький или прозьба нужен алгоритм "Умножение матрицы на матрицу " если есть пришлите на covalijenia@mail.ru
Я предумал свой алгоритм но он дает ошибки после каждой строки в приложение Описание класса MATRIX и функция сложения
" MATRIX * Multiplication_matrixes_on_a_matrix ( MATRIX * , int , int ); "

Приложение:

Отправлен: 27.09.2008, 14:40
Вопрос задал: Covalijenia (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: realbustard
Здравствуйте, Covalijenia!
В приложении код, использующий ф-у умножения матриц, которую ,в принципе, можно оптимизировать, например сделав меньшее количество аргументов. Но остановимся на алгоритме ее работы. Она получает 3 указателя на матрицы: А,В-множители; С-результат; m1..n2-размеры матриц А,В. Перед присваиванием матрице определенного значения, число, находящееся по адресу этого элемента С[i][j] обнуляется, чтоб мы были уверены, что там ноль, а не что иное. Ну что сначала цикл по i, затем по j, это объяснять не надо.

А вот на цикле по k остановлюсь.
Каждый элемент результирующей матрицы складывается из суммы произведений элементов 2х матриц, например, если A[2][2] и B[2][2], то

С[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0]; С[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1];
С[1][0]=A[1][0]*B[0][0]+A[1][1]*B[1][0]; С[1][1]=A[1][0]*B[0][1]+A[1][1]*B[1][1];

Можно заметить, что некоторые значения i и j в многочлене совпадают со значениями i,j в теле цикла, а некоторые отличаются на 1 от них, т.е. можно записать так:

C[i][j]=A[i][?]*B[?][j]+A[i][?]*B[?][j]; где: i,j - переменные значения которых, совпадают со значениями i,j в C[i][j];

Знак вопроса - это число, которое увеличивается от 0 до (n1-1) и оно равно числу членов в многочлене, в данном случае 2.

Если подставить вместо ? к, то получим:

C[i][j]=A[i][k]*B[k][j]+A[i][k+1]*B[k+1][j];

Чтобы проще посчитать С[i][j] и был введен 3й цикл по к
Общий вид многочлена принял вид:

C[i][j]=Сумма_по_k (A[i][k]*B[k][j]) ); где к==0...(n1-1)

//k - это итератор, равный n1 и m2.
for(int k=0;k<n1;k++){
C[i][j]+=A[i][k]*B[k][j];
}

Приложение:

---------
Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)

Ответ отправил: realbustard (статус: 3-ий класс)
Ответ отправлен: 28.09.2008, 01:56


Вопрос № 145.203
Сделал прогу на чистом Win32 API, в VC++2008, в ХР. Попробовал запустить в Висте (там не ставил VC++2008). Получил вежливый отказ: "не могу запустить из-за неправильной параллельной конфигурации, см. подробности в журнале". В журнале написали: "Не найдена зависимая сборка Microsoft.VC90.CRT, processorArchitecture="x86", publicKeyToken="1fc8b3b9a1e18e3b", type="win32",version="9.0.21022.8"". Используйте sxstrace.exe для подробной диагностики."
Как я понял, Студия собрала ексэшник, зависимый от каких-то длл. Как овязаться от этих длл??? Цель при разработке была в малом размере дистрибутива!
Отправлен: 27.09.2008, 16:52
Вопрос задал: effort (статус: Студент)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zloi_goh
Здравствуйте, effort!
Попорбуйте в настройках :
prroject -> Project Properties -> Configurations Properties -> C/C++ -> Code Generation ->
Runtime Library: Multi-threaded Debug(/MTd)

prroject -> Project Properties -> Configurations Properties -> Linker -> Manifest File ->
Generate Manifest: No
---------
Лучше идти чем бежать, лучше стоять чем идти, лучше сидеть чем стоять, лучше лежать чем сидеть, лучше умереть чем лежать.
Ответ отправил: Zloi_goh (статус: 1-ый класс)
Ответ отправлен: 28.09.2008, 19:01
Оценка за ответ: 5
Комментарий оценки:
спасибо, я уже в Интернецци нашёл


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.3 RC 2 от 09.09.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное