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

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

Автор: GeMir
Дата сообщения: 31.01.2012 21:38
akaGM

Цитата:
http://ru.wikipedia.org/wiki/CORDIC

Ну уж до туда мы уже добрались
Автор: akaGM
Дата сообщения: 31.01.2012 21:42
GeMir
верю, только что тогда о мамонте спрашиваешь?
говорю ж: в литературе на "мамонта наступи"...
ссылка на
"Байков В. Д., Селютин С. А., Вычисление элементарных функций в ЭКВМ, Москва, Радио и связь, 1982, 64 стр."
Автор: zeliboba1
Дата сообщения: 10.02.2012 09:46
[more] [more] Здравствуйте.

Есть библиотека, которую подключаю к программе на с++
(http://forum.ru-board.com/topic.cgi?forum=33&topic=4836&start=606&limit=1&m=1#1).
Из этой библиотеки делаю импорт структуры и процедуры.
Программу создавал как "пустой проект", выглядит она так:

//****************************
#include <iostream>
#pragma comment(lib,"fdll.lib")
using namespace std;

Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}

int main()
{
F();
std::cout<<abc.a;
return 0;
}

//***************************

Это её рабочий вариант, т.е. в качестве _консольного_ приложения она корректно работает, не выдает предупреждений при сборке.

Теперь встала проблема использовать структуру и функция в приложении типа Windows Forms.
Создаю стандартное приложение Windows Forms, не изменяя пробую запустить - всё Ок, работает.
Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
Пишу строчки (которые, как замечу, в консольном приложении работаю):

#pragma comment(lib,"fdll.lib")
Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}

Добавляю их в главный файл .cpp, до функции main().
При сборке получаю предупреждение вида:

warning C4394: abc: символ для каждого домена приложений не следует помечать с помощью __declspec(dllimport)

соответственно при попытке использования импортированной структуры и процедуры - ошибки.

прошу подсказки, в чем дело? почему в консольном приложении работает как положено, а в Windows Forms нет, при том что
располагаю объявление структуры, как мне кажется, в одном и том же месте... MS VS 2008
[/more] [/more]
Автор: terminat0r
Дата сообщения: 18.02.2012 03:31
Есть одна проблемка
Суть- один xml файл и надо бы отсортировать его items алфавитно (именно сам xml файл а не данные с него) по string что в <match>...</match> находится.
Дело в том что есть одна программа, которая читает этот файл но в ней нет сортировки- как читает этот файл так и показывает данные. Недоделали ее. Надо бы ей помочь
Пример XML здесь
[more]

Код:
...
<snippets namespace="" license="x" filetypes="Fortran" authors="none" name="fortran">
<script></script>
<item>
<displayprefix></displayprefix>
<match>allocatable</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocatable ${cursor}</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>allocate()</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocate(${cursor})</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>character(len=*)::</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>character(len=*):: ${cursor}</fillin>
</item>
...
Автор: cp58
Дата сообщения: 18.02.2012 11:39
terminat0r
libxml2
Автор: Shandera
Дата сообщения: 19.02.2012 07:08
Здравствуйте уважаемые специалисты.
Помогите пожалуйста решить проблемку. Ситуация такая. Раньше, создавал программы только с одним окном, но продолжая расти, столкнулся с необходимостью создать много оконное приложение. А точнее два окна. Значит теперь подробно:

ОС: Windows 7.
Среда: Visual Studio 2010.
Приложение: Windows Form.

Значит имеем форму, на ней кнопка. При нажатии на кнопку, должна появится вторая форма. Все. Значит что сделано. Создана вторая форма (имя: TestWindow), сохранена. В первой форме сделано подключение второй формы (#include "TestWindow.h"). И в обработчике события при нажатии на кнопку, сделан её вызов:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
TestWindow -> Show();
}

Но вот при попытке создать программу, появляются две ошибки:

error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"

с указанием на эту строку: TestWindow -> Show();

Вопрос, что сделано мной не так? (((.
Автор: Red Planet
Дата сообщения: 19.02.2012 12:15
Создаю объект класса, потом реинициализирую его другим конструктором.

Очень удивился, когда увидел, что деструктор вызывается после вызова второго конструктора, а не до. Ведь логичнее было бы разрушить старый объект перед созданием нового, а здесь получается, что сначала имеем один объект, потом реинициализиреум его поля, потом вызываем деструктор, потом работаем с новымыми значениеями полей. Почему в таком странном порядке идет работа? Ладно еще, если не используем динамическую память (хотя зачем нам деструктор без нее?), - тогда внешне все в порядке. А вот если попробовать вызвать a1.show() после второй инициализации, то сначала вместо значения, хранящегося в p, получим какое-то произвольное число, а потом вылетит исключение.

Ниже вывод программы и код.

Вывод.


Цитата:
Created
10 10
Other values
Created
Deleted
100 100
Для продолжения нажмите любую клавишу . . .

Код без указателя.


Код: #include "stdafx.h"
#include <iostream>

using namespace std;

class A {
    int x, y;
public: A() { x = y = -1; cout << "Created default" << endl; }
            A(int xx, int yy) { x = xx; y = yy; cout << "Created" << endl; }
            ~A() { cout << "Deleted" << endl; }
            void show() { std::cout << x << " " << y << endl; }

};


int _tmain(int argc, _TCHAR* argv[]) {
    A a1 = A(10, 10);
    a1.show();
    cout << "Other values" << endl;
    a1 = A(100, 100);
    a1.show();
    system("pause");
    return 0;
}
Автор: cp58
Дата сообщения: 19.02.2012 13:59
Red Planet
Это происходит из-за того, что деструктор вызывается 3 раза.
Дело в том, что второй вызов конструктора создает новый объект, затем происходит почленное копирование элементов и инициализируется третий объект(идет вызов оператора присвоения) и для каждого вызывается деструктор.
Исправить это можно с помощью перегрузки оператора присвоения:

Код: A& operator= (const A &a) {
if (this!=&a) {
delete p;
p=new int;
*p=*a.p;
}
return *this;
}
Автор: Abs62
Дата сообщения: 19.02.2012 14:44
Red Planet

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

Да потому, что нет здесь никакой реинициализации. Есть копирование одного объекта в другой.

Код: a1 = A(100, 100);
Автор: akaGM
Дата сообщения: 20.02.2012 16:44
что-то я приплыл...


Код: //////////////////////////
file.h

__inline int foo();

//////////////////////////
file.c

#include "file.h"

__inline int foo() {
...
}
//////////////////////////
work.c

#include "file.h"

void main() {
int res;
res = foo();
printf("%d\n", res);
}
Автор: karakurt2
Дата сообщения: 20.02.2012 16:51
akaGM
перемести определение функции в заголовочный файл
Автор: akaGM
Дата сообщения: 20.02.2012 16:55
karakurt2
охренеть...
это вообще не моя библиотека, но в оригинале именно так (на .h и .c) разнесено
и базовый компилятор -- гнусь

спасибо...
Автор: karakurt2
Дата сообщения: 20.02.2012 17:08
Реализация встраиваемой функции должна быть известна на этапе компиляции, единица компиляции файл. В объявлении модификатор inline ообще не имеет смысла. Не представляю, как можно в объектный код поместить определение функции из другого объектного файла. Тогда уж это должен быть вызов внешней процедуры.
Автор: akaGM
Дата сообщения: 20.02.2012 17:13
понятия не имею...
наткнулся, напоролся, спросил, помогли :)

сейчас вообще всё от#define'ю на фиг...
Автор: maximhik70
Дата сообщения: 25.02.2012 19:08
[more] Здравствуйте. Не понимаю разницы

Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".

...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................

НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................
    
Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.


Поясните, пожалуйста. [/more]
Автор: Red Planet
Дата сообщения: 25.02.2012 19:59
cp58, Abs62, спасибо.

Следующее. Что скажете насчет такого кода? Все ли правильно?

Смысл такой. При сложении двух объектов сумма должна "знать" правого операнда. Поэтому заведен указатель *p, который проявляется только при сложении, в остальных случаях он никуда не указывает. Приведенный код работает, однако меня смущает то, что два указателя ссылаются на одно и тоже значение. См. оператор сложения, в нем строка


Код: p = right.p;
Автор: knkd
Дата сообщения: 25.02.2012 21:07
karakurt2

Цитата:
Не представляю, как можно в объектный код поместить определение функции из другого объектного файла. Тогда уж это должен быть вызов внешней процедуры.

Именно для этого заведено -flto и что-то аналогичное в интеле.
Так что с гнусной версии 4.6 это имеет смысл.

Добавлено:
akaGM

Цитата:
сейчас вообще всё от#define'ю на фиг...

Сатана соблазняет вас, сопротивляйтесь козням его!
Автор: maximhik70
Дата сообщения: 25.02.2012 21:12
[more] Здравствуйте. Не понимаю разницы

Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".

...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................

НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................

Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.


Поясните, пожалуйста. [/more]
Автор: knkd
Дата сообщения: 25.02.2012 21:29
maximhik70
Потому, что блокнот проверяет первые N символов файла.
Если среди них нет ни одного непечатного, то он принимает файл за текстовый.
Если есть - бинарный.

Правда ещё шерстит по разным кодировкам, но получается у него хреново.

А ASCII текст (0х20..0х7Е) инвариантен.
Если посмотрите двоичным редактором/просмотрщиком - увидите, что у записаных переменных непонятные коды по sizeof(TYPE) байт на каждую, а текст так и остался текстом.
Автор: Red Planet
Дата сообщения: 26.02.2012 19:22
Программа виснет после return одной функции. Я останавливался там дебаггером, return проходит, после этого жму F8, в этот момент дебаггер теряет связь с программой: хочешь жми F8, хочешь не жми - толку никакого. Я подумал, что здесь может помочь какое-нибудь подробное логгирование. Ведь не просто так он закономерно в одном и том же месте виснет. Поискал немного, наткнулся на log4cpp, однако смутило то, что с 2007 он больше не разрабатывается


Цитата:
I've used Log4cpp in the past and it does the job, though bear in mind the project has been inactive since 2007


Также рекомендовали


Цитата:
There are also the following alternatives:
Apache's log4cxx which is still active.
Matthew Wilson's Pantheios library.
Log4cplus.


Log4cxx и Log4cplus. Там предлагается скачать tar.gz и собрать при помощи ./configure, make, make install. Уже сомневаюсь, что это имеет какое-то отношение к Windows и C++Builder.

Matthew Wilson's Pantheios library. Не успею сегодня опробовать. А стоит ли?

Как можно посмотреть причину зависания? Предлагайте варианты, в том числе предполагающие отказ от Builder.

Версия Builder: C++Builder 2010.
Автор: lol2xD
Дата сообщения: 27.02.2012 15:07
Нужно отсортировать массив методом пузырька. Но у меня не получается.

http://s017.radikal.ru/i413/1202/44/99c302410098.jpg

[more=код]
[no]#include "stdafx.h"
#include<stdio.h>
#define N 3
int main()
{
int n=3;
int a[N], i, j;

for(i = 0 ; i < n; i++)
    {
scanf("%d", &a[i]);
}

// сравниваем два соседних элемента.
for(i = 0 ; i < n ; i++)
{
// сравниваем два соседних элемента.
for(j = 0 ; j < n - i - 1 ; j++)
{
if(a[j] > a[j+1])
{
// если они идут в неправильном порядке, то
// меняем их местами.
int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp;
}
printf ("\n%d", a[j]);
}
}
}[/no]
[/more]
Автор: cp58
Дата сообщения: 27.02.2012 17:48
lol2xD
Вот тут на одной из последних 10 страниц был метод пузырька.
Red Planet

Цитата:
Программа виснет после return одной функции.

После какой функции и в каком коде?
Автор: nick7inc
Дата сообщения: 01.03.2012 09:37
День добрый. Пишу на C++ (MinGW), пользуюсь stdio для чтения/записи в файлы. Скажите, корректно из одной программы дважды открыть файл на чтение? Влияет ли операционная система на эту возможность (DOS/Win95/WinNT/...)?
Автор: bomzzz
Дата сообщения: 01.03.2012 09:43
нужно при открытии установить флаги возможного совместного доступа к файлу для чтения и для записи (отдельно). DOS - отдельная песня. а с виндой надо использовать апи функции поддерживаемые всеми системами, только с мсдн совсем недавно убрали информацию о поддержке ниже 2000-ка pro

Добавлено:
хотя если писать дос программу она то как раз будет работать с файлами во всех системах, сходу не вспомню о совместном доступе, ограничение будет файлы до 4 гиг
Автор: akaGM
Дата сообщения: 01.03.2012 10:05
nick7inc
интересно узнать необходимость такого открытия...
забыл, что туда раньше написал? :)
может тебя устроил бы режим а+ и fseek(), rewind() и fsetpos()
Автор: bomzzz
Дата сообщения: 01.03.2012 10:09
очень необходимая вечь - например позволяет качать двумя торрент клиентами один файл с разных трекеров, или качать один файл из интернета менеджером закачки и торрент клиентом, смотреть недокачанный фильм в плеере, чиать в блокноте пишушийся лог ...
Автор: akaGM
Дата сообщения: 01.03.2012 10:35

Цитата:
Скажите, корректно из одной программы дважды открыть файл на чтение?

Автор: bomzzz
Дата сообщения: 01.03.2012 11:05
и чего тут может быть некорректного, не нужно будет каждый раз туда сюда дергать указатель. только не надо забывать что на количество открытых файлов есть ограничение
Автор: akaGM
Дата сообщения: 01.03.2012 16:14
по мне, так у товарища хромает логика работы с данным файлом, а не техника его многократного открытия для однотипных операций...
Автор: nick7inc
Дата сообщения: 01.03.2012 18:19
bomzzz

Цитата:
ограничение будет файлы до 4 гиг

У меня сейчас запросы поменьше. Пишу под MinGW, там это ограничение легко обходится в STDIO.
akaGM

Цитата:
интересно узнать необходимость такого открытия...

Пожалуйста. Я пишу полиморфный тип UFILE *f, который при помощи знакомых функций stdio (fopen(), fwrite, fread(), fseek(), fprintf(), fscanf() и т.д.) оперирует с данными практически из любого места: файл на диске, буффер в памяти, ... Сейчас мне надо сделать чтение из ZIP архива. А читать иногда приходится параллельно 2 разных файла из архива. Чтобы не морочиться с fseek() (туда-сюда), как раз нужно чтение из одного файла параллельными потоками.

[more=Код]
Код:
virtual void close (void) = 0;
virtual void open (const char *name, const char *par1) = 0;
virtual void flush (void) {};
virtual long tell (void) = 0;
virtual bool eof (void) = 0;
virtual unsigned long int lof (void) = 0; // Длинна файла
virtual void seek (long offset, int mode) = 0;
virtual size_t read (void *buffer, size_t size, size_t number) = 0;
virtual size_t write (const void *buffer, size_t size, size_t number) = 0;

size_t read (class DataBuffer &dbuffer, size_t size);
size_t write (const class DataBuffer &dbuffer);
size_t put_byte (unsigned char byte);
char get_byte (void);
size_t printf (const char *format, ...)
__attribute__ ( (format (printf, 2, 3)));
virtual size_t xscanf (const char *format, ...)
__attribute__ ( (format (scanf, 2, 3))) = 0;
size_t puts (const char *message);
virtual size_t line_input (void *buffer, const size_t size);

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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