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

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


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

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

Выпуск № 655
от 01.02.2007, 23:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 473, Экспертов: 65
В номере:Вопросов: 5, Ответов: 11


Вопрос № 72802: Здраствуйте поставил Borland C++ под винду...Но при компиляции текста программы,содержащей подключение графики выходит "#if defined( _Windows ) && !defined (__DPMI16__) && !defined(__DPMI32__) #error BGI graphics not supported under Win...
Вопрос № 72917: Уважаемые эксперты, подскажите, как получить доступ к переменной(массиву MyItem вм.приложение) в C++ Builder, из формы2, если массив был создан до создания формы1...
Вопрос № 72920: Здравствуйте! Помогите пожалуйста, написать программу на С++ к следующей работе! Заранее СПАСИБО! Работа со строками. Текстовые файлы. Задание. Составить программу, выполняющую преобразования над текстовыми файлами согласно заданному варианту. Ис...
Вопрос № 72923: Растолкуйте мне пожалуйста суть масива указателей. Это типа каждый елемент выступает указателем, и с ним можно делать все то-же самое что и с обычним указателем. Но тогда следующий вопрос. Если написать char *array[]={"a",&qu...
Вопрос № 72936: Здравствуйте, уважаемые эксперты. В приложении находится код, который почему то не компилируется. (M$ Visual C++ 6.0). Ошибка линковки: main.obj : error LNK2001: unresolved external symbol "public: __thiscall Matrix<int>::MatrixRo...

Вопрос № 72.802
Здраствуйте поставил Borland C++ под винду...Но при компиляции текста программы,содержащей подключение графики выходит
"#if defined( _Windows ) && !defined (__DPMI16__) && !defined(__DPMI32__)
#error BGI graphics not supported under Windows"
Подключение имеет вид:

Приложение:

Отправлен: 26.01.2007, 23:50
Вопрос задал: гацев Игорь Валерьевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, гацев Игорь Валерьевич!

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

project target -> DOS application (.exe)

и запускайте эту программу только в полноэкранном режиме, не в оконном.

PS
вместо "c:gi" следует писать "c:\bgi"
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 27.01.2007, 00:56
Оценка за ответ: 5

Отвечает: Neil
Здравствуйте, гацев Игорь Валерьевич!

В Windows режим консольного приложения (типа досовского) называется Console application, но графика а-ля Borland C++ 3.1 там не катит.. Читайте литературу по графике в Windows или в Builder-е (Яндекс, надеюсь, поможет - а если не поможет, пишите на radical05@mail.ru).
Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 27.01.2007, 01:06


Вопрос № 72.917
Уважаемые эксперты, подскажите, как получить доступ к переменной(массиву MyItem вм.приложение) в C++ Builder, из формы2, если массив был создан до создания формы1

Приложение:

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

Отвечает: Neil
Здравствуйте, Azrr!

Ваш массив является глобальной статической переменной, и виден из любой функции, выше которой встречается его объявление.

Замечания по Вашему коду:

1) Описывайте в .h-файлах только те функции, которые Вы хотите сделать общедоступными, и только в виде заголовка, т.е.

int calc_sum();

2) Код этих функций следует писать в .cpp-файлах, и только 1 раз в проекте. Если Вы хотите использовать в .cpp-файле (файл номер 1) функцию, описанную в другом .cpp-файле (файл 2), подключите в файле 1 .h-файл, соответствующий файлу 2, так:

#include "файл_2.h", где файл_2 - имя файла файл_2.cpp

3) Описывайте глобальные переменные в .cpp, а не в .h файлах.
4) В тех .cpp-файлах, в которых вы хотите использовать переменную, описанную в другом файле, в начале пишите:
если переменная объявлена как "items MyItem[256];",
то там, где она нужна, пишите "extern items* MyItem;"

В п. 4 есть альтернатива: если переменная объявлена в Unit1.cpp (где она у Вас по логике и должна быть), тогда строчку с extern можно поместить в Unit1.h, а в Unit2.cpp написать:
#include "Unit1.h"

Пояснения: все переменные, описанные глобально (вне функций) в некотором .cpp - файле, являются статическими и глобальными для данного .cpp-файла.
Ключевое слово extern указывает, что данная переменная для файла является внешней, т.е. описана где-то ещё, а данный файл использует её как внешнюю.

Описания переменных и тела функций не следует лепить в .h-файлы, поскольку при подключении .h-файлов с помощью #include возникнет ошибка, поскольку переменные и функции с одинаковыми именами будут описаны несколько раз в проекте.
Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 27.01.2007, 21:33


Вопрос № 72.920
Здравствуйте! Помогите пожалуйста, написать программу на С++ к следующей работе! Заранее СПАСИБО! Работа со строками. Текстовые файлы.
Задание. Составить программу, выполняющую преобразования над текстовыми файлами согласно заданному варианту. Исходный текстовый файл создается при помощи редактора текста и может содержать произвольную последовательность различных символов произвольной длины.
Вариант3: Скопировать исходный файл в другой, удалив палиндромы в промежутке между введенными начальной и конечной цепочками. На экран вывести количество скопированных и удаленных слов.
С уважением, Галя.
Отправлен: 27.01.2007, 21:19
Вопрос задала: Галя (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Галя!
Вот вариант на C++. Из исходного текста удаляются слова-палиндромы.

Приложение:

Ответ отправил: Терсков Сергей (статус: 5-ый класс)
Ответ отправлен: 29.01.2007, 05:44

Отвечает: Rewer8
Здравствуйте, Галя!
Вот ещё вариант
Если будут вопросы пишите

Приложение:

Ответ отправил: Rewer8 (статус: 1-ый класс)
Ответ отправлен: 30.01.2007, 22:54


Вопрос № 72.923
Растолкуйте мне пожалуйста суть масива указателей.
Это типа каждый елемент выступает указателем, и с ним можно делать все то-же самое что и с обычним указателем. Но тогда следующий вопрос. Если написать

char *array[]={"a","b","b"};

то тогда что на что будет указывать???????
Отправлен: 27.01.2007, 21:33
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Neil
Здравствуйте, Platon!

Вот схема памяти:

array-> array[0] array[1] array[2]
array[0] -> "a"
array[1] -> "b"
array[2] -> "b"

Массив суть указатель на первый элемент последовательности элементов одинакового размера.

Двойные кавычки (") означают указатель на последовательность байтов, оканчивающуюся байтом со значением 0.

Объявление вида
тип_переменной имя_переменной[]
объявляет массив из элементов, тип которых есть тип_переменной
В Вашем случае тип_переменной есть char*, т.е. указатель на char

Для упражнения: осознайте суть объявлений:
а) char** array[]
б) char*** array[]
и т.д.

а) - каждый элемент массива есть указатель на char*, т.е. указатель на указатель на char.
а) - каждый элемент массива есть указатель на char**, т.е. указатель на указатель на указатель на char.

Во всех случаях *array есть первый элемент массива, его тип совпадает с тем, что указано перед array в объявлении.
Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 27.01.2007, 21:46

Отвечает: Базанов Иван Александрович
Здравствуйте, Platon!
Тогда array - масив указателей на char из 3х элементов, проинициализированных указанными значениями -"a", "b", "c"
array[0]=="a" типа char*
array[1]=="b" типа char*
array[2]=="b" типа char*
Далее, в зависимости от настроек компилятора, array[1] и array[2] могут указывать на одну область памяти, выделенную под строку "b"
В общем array[i] можно использовать везде где требуется указатель на char
---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 2-ой класс)
Ответ отправлен: 27.01.2007, 22:56

Отвечает: Thread
Здравствуйте, Platon!
Вы, как и многие из начинающих С++ программистов столкнулись со сложность реализации строк. Видете ли строка в С++ это указатель по сути дела на первый символ этой сторки. Вообще говоря это массив символов по сути дела. Рассмотрим пример.
int *p = new int[3];
Обращаться к элементу можно так: p[index] или так *(p + index)
Как мы видим здесь оператор new выделяет три свободных подряд идущих ячеек и возвращает указатель на первую из них. На самом деле в С++ char - это не символ, это целочисленный тип, отличающийся только своим границами - 0..255, и если мы сделаем
char *p = new char[3];
То тоже будет массив целых чисел. Строка в С++ это массив целых чисел, последним элементом которго является символ 'Вот пример:
char *s = new char[3];
s[0] = 'a';
s[1] = 'b';
s[2] = 'Так мы получили строку "ab".
Тогоже самого можно добиться написав char *s = "ab"; НО здесь разница в том, что элементы этой строки изменять нельзя. Надо помнить что s - это указатель на первый символ. Используя операцию разименовывания вы сами можете в этом убедиться. Т.е.:
char *s = "ab";
char f = *s;
Значение f в этом случае будет равно 'a'.

Вернемся к Вашему примеру. У Вас действительно массив указателей и каждый из указателей указывает на первый символ строки.
array[0] - это указатель на первый символ строки "a" т.е. указатель на первую ячейку массива 'a' '
Ответ отправил: Thread (статус: 3-ий класс)
Ответ отправлен: 28.01.2007, 10:21

Отвечает: kool
Здравствуйте, Platon!
В записи char *array[]={"a","b","b"};
массив указателей array будет содержать
ТРИ указателя соответственно на строки "a","b","b".
Причем указатели на 2-ю и третью строки будут
разные, хотя эти строки будут содержать одинаковые элементы.
Удачи!

Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 28.01.2007, 11:04


Вопрос № 72.936
Здравствуйте, уважаемые эксперты.
В приложении находится код, который почему то не компилируется. (M$ Visual C++ 6.0). Ошибка линковки:
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Matrix<int>::MatrixRow<int>::MatrixRow<int>(unsigned int)" (??0?$MatrixRow@H@?$Matrix@H@@QAE@I@Z)
Такое впечатление, что я как-то неправильно определил конструктор вложенного класса. Если этот конструктор определить сразу в описании класса, не вынося его отдельно - все работает. Вопрос - почему?
Заранее спасибо.

Приложение:

Отправлен: 27.01.2007, 23:09
Вопрос задал: Алексеев В.В. (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Базанов Иван Александрович
Здравствуйте, Алексеев В.В.!
К сожалению , как описано в MSDN, для MSVC, их реализация ДОЛЖНА быть описана в h-файле (заголовочном файле). Иначе проект не слинкуется.
Ответ - таков MSVC. Если угодно - глюк (или фича) :)
---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 2-ой класс)
Ответ отправлен: 27.01.2007, 23:24
Оценка за ответ: 2
Комментарий оценки:
Если вы посмотрите исходник, то увидите, что все что написано выше комменатрия "//main.cxx" и ниже первой строки - "//matrix.hxx" описано именно в .hxx файле (непосредственно расширение, на мой взгляд, дела не меняет), кроме того линкер ничего не говорит на вызов конструктора внешнего класса, хотя он определен аналогично конструктору вложенного.

Отвечает: Neil
Здравствуйте, Алексеев В.В.!

Зачем Вам вообще вложенный класс? Нет возможности проверить, но есть подозрение, что в описании класса нужно выкинуть внутренний template.. (см. приложение)

Приложение:

Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 28.01.2007, 00:25
Оценка за ответ: 4
Комментарий оценки:
Вложенный класс необходим, чтобы реализовать доступ к элементам матрицы через двойной operator[] (как к двумерным массивам). Я знаю, что это реализуется именно через вложенный класс, поэтому данное решение не подходит.


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.43 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное