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

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

Автор: Abs62
Дата сообщения: 08.02.2008 16:54
akaGM
Дык, не только имхошное - Таненбаум, которого я только что процитировал, прямым текстом говорит то же самое.
Автор: veronica b
Дата сообщения: 08.02.2008 17:04
Abs62

Цитата:
Дык, не только имхошное - Таненбаум, которого я только что процитировал, прямым текстом говорит то же самое.

Что именно, что "слово" это и есть длина информации, которую обрабатывает команда процессора?
akaGM, точно! Как это я не увидел и я ничего не отмечал.

Автор: mozgodrocha
Дата сообщения: 08.02.2008 17:16
veronica b: "Если это так, то моя гипотеза верна! "

Это было написано просто так:
float a;
int b;
Там на самом деле были массивы. И ошибка вылезала еще до того как я их пытался задействовать.

akaGM: "он нашёл ошибку и дело было естественно не в порядке следования объявлений..."

В чем была ошибка я так и не нашел... Но она явно была "детской" Где-то наботвил. Скорее всего действительно что-то где-то затер.
Ну не программист я Я вообще ЦОС занимаюсь.

Спасибо за ответы.
Автор: veronica b
Дата сообщения: 08.02.2008 18:57
mozgodrocha

Цитата:
Ну не программист я Я вообще ЦОС занимаюсь.

Так если ЦОС, то причем тут Windows?
Автор: mozgodrocha
Дата сообщения: 08.02.2008 21:52
veronica b

А что такое ЦОС в понимании программиста? И как ЦОС связана с Windows? Я писал про цифровую обработку сигналов (DSP). Просто мне нужно на реальном примере (а не на словах) показать как работают методы фильтрации, которые я хочу использовать. Ну вот и пришлось программку слепить.
Автор: veronica b
Дата сообщения: 09.02.2008 18:07
mozgodrocha, так откройте секрет, на какой платформе у вас это работало?
Автор: mozgodrocha
Дата сообщения: 09.02.2008 20:42
veronica b

WinXP. Только не работало, а падало.
Автор: veronica b
Дата сообщения: 12.02.2008 13:34
mozgodrocha

Цитата:
WinXP. Только не работало, а падало.

Как я помню из школьногокурса физики, то падение также является работай.
Автор: Antananarivu
Дата сообщения: 14.02.2008 10:25
Здравствуйте, вопрос у меня такой.

Есть два числа типа long double (притом (если, конечно, это важно) число "а" читается из файла, а вот "b" вычисляется)
a =0.000260209585659619990000000
b =0.000260208278223141190000000
и число long double с = a-b
с =0.000000001307436478796986800
Повторяю те же действия еще раз, получаю
a =0.000260209585659619990000000
b =0.000260208278223141090000000
c =0.000000001307436478905407000

В итоге число "с" уже на 11 знаке теряет точность.

Теперь собственно вопросы:
а) это нормальное поведение компилятора? Ну то есть это в порядке вещей, что у числа "b" 16 знак "гуляет" как хочет, а у числа "с" вообще с 11 по 16 знак творится какой-то рендом. Или это говорит о какой-то ошибке (потери точности и т.д.)?
б) можно ли как-то повысить точность стандартными методами? (специальные библиотеки просьба не предлагать).
с) если нет, то как сделать так, чтобы у числа "с" хотя бы так не "гуляли" 11-16 знаки? Тупо округлять?

P.S. Сразу скажу что данный мне компилятор дает типу long double точность 15-16 знаков, а не 19-20 как некоторые другие, так что это тут непринципиально.

Заранее спасибо.
Автор: Qraizer
Дата сообщения: 14.02.2008 10:38
А откуда у тебя long double? Ты не на VC случаем пишешь? У него long double и double представляются одинаково. Вообще же, это может зависеть от точности, которую NPU выставили в его регистре управления, поэтому "вычисляемое" b может ограничиваться этим фактором. Что касается c, то сам посмотри - у тебя вычитаются два почти равных числа, отличающиеся аж только 6-м знаком мантиссы. Отсюда и неминуемая потеря точности с 16 до 11 знаков при вычитании.
Автор: Antananarivu
Дата сообщения: 14.02.2008 10:56
Qraizer
Считайте что у меня не long double, а double, в данном случае - это не важно.
Я немножко у другом: точность мантиссы 15 знаков, это я понимаю. В случае числа "с" неминуема потеря точности с 11 знака - это я тоже понимаю.
Я не понимаю другого: нормально ли это, что повторяя вычисления несколько раз я получаю в случае числа "b" рендомный 16 знак, а в случае числа "с" совершенно рендомные числа после 11 знака. Разве не должны они быть пусть неверными, но хотя бы одинаковыми каждый раз? От чего они вообще зависят, это совершенно случайные числа получаются?
То есть, 3 итерации-цикл. Все константы и переменные у меня остаются неизменными. Я три раза получаю "B", до 15 знака они совпадают, а вот после каждый раз новое значение:
1. b = 0.00026020827822314119
2. b = 0.00026020827822314109
3. b = 0.00026020827822314113
И соответственно "С":
1. с =0.000000001307436478796986800
2. c =0.000000001307436478905407000
3. с =0.000000001307436478853726500
Это в порядке вещей?
Автор: Alochka
Дата сообщения: 15.02.2008 14:16
Поставили Dev-C++ 4.9.9.2 в компьютерном классе, на всех машинах заработал нормально. Потом на одной машине переустановили Windows и все программы, поставили Dev-C++ и при компиляции совершенно пустого проекта консольного приложения выдается ошибка - C:\Documents and Settings\User\Мои документы\Makefile.win [Build Error] [main.o] Error 1

В логах такой текст:
Compiler: Default compiler
Building Makefile: "C:\Documents and Settings\User\Мои документы\Makefile.win"
Executing make...
make.exe -f "C:\Documents and Settings\User\Мои документы\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32" -I"include/c++/3.4.2" -I"include"

"0" -Ґ пў«пҐвбп ў-гваҐ--Ґ© Ё«Ё ў-Ґи-Ґ©
Є®¬ -¤®©, ЁбЇ®«-塞®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐв-л¬ д ©«®¬.

make.exe: *** [main.o] Error 1

Execution terminated

Подскажите что сделать чтобы оно заработало. Инсталяция нормальная, на другой машине точно так же ставлю, все работает.

Добавлено:
Еще добавлю, проект сохраняла в разных местах и сам с ставила на разные диски, результат такой же.

Добавлено:
Еще wxDev-C++ ставила тоже, результат тот же.
Автор: Qraizer
Дата сообщения: 15.02.2008 17:56
Antananarivu, если причина именно в
Цитата:
Вообще же, это может зависеть от точности, которую NPU выставили в его регистре управления, поэтому "вычисляемое" b может ограничиваться этим фактором.
то NPU просто преждевременно заканчивает рассчитывать битики мантиссы, поэтому сказать, что такой эффект, как у тебя, не является нормальным - это скорее не к програмерам, а к схемотехникам. Впрочем, они тоже вряд ли ответят, если не полезут разбираться в "схемах принципиальных электрических" . Но если допустить, что это нормально - я склоняюсь к этому выводу, но это ИМХО, - то ещё бОльшая рандомность для c удивлять уже не должна.
Автор: foreground
Дата сообщения: 18.02.2008 10:55
Уважаемые программёры,
недавно залез в VS8.0 SP1 C++ и благодаря Qraizer-у благополучно поставил STLport. Теперь возникла задача сериализовать коллекции в бинрный формат. Покапав по форумам, люди пишут можно не изобретать велосипедов и юзать boost. Но на форумах также пишут, что boost с STLport собирается как-то криво.. Есть ли у вас опыт подобных мытарств? Версии библиотек последние..
Автор: foreground
Дата сообщения: 19.02.2008 08:32
Вопщем не знаю что я не так сделал, но действовал так:

Код: 1. Visual Studio 2005 Command Promt
2. set include=E:\STLport\stlport;%include%
3. cd /d E:\STLport\build\lib
4. configure.bat --clean
5. user_config.h раскоментил #define _STLP_USE_BOOST_SUPPORT 1
6. configure.bat -c msvc8 -x --use-boost E:\boost_1_34_1 --extra-cxxflag /wd4819 --extra-cxxflag /Zc:wchar_t
7. nmake /fmsvc.mak почему-то ничего не выдал
8. nmake /fmsvc.mak clean install сложил библиотеки с новой датой в папки \bin\vc8 и \lib\vc8
9. "на всякий" скопировал полученые библиотечки и в lib с bin-ом, забэкапив предыдущие
10. зашел в папку с бустом (E:\boost_1_34_1\tools\build\v2\tools) и заменил stlport.jam на новый с транка https://svn.boost.org/svn/boost/trunk
11. в boost_1_34_1\tools\build\v2\user-config.jam добавил строки:

using stlport : 5.1.5~msvc~8.0
: E:/STLport/stlport
E:/STLport/lib

12. cd /d E:\boost_1_34_1
13. bjam --v2 msvc-8.0 stdlib=stlport-5.1.5~msvc~8.0
Автор: i603034
Дата сообщения: 19.02.2008 17:24
Народ, не могу понять странное поведение программы:


Код:
void init (char* str_p)
{
str_p = new char[10];
strcpy (str_p, "Faraday");
}

//-----

void main()
{
char *line_p = NULL;

init (line_p);
printf (">> %s\n", line_p);
delete[] line_p;
}
Автор: akaGM
Дата сообщения: 19.02.2008 17:37
i603034
я б вот так по-быстрому написал...

Код: void init (char** str_p)
{
*str_p = new char[10];
strcpy (*str_p, "Faraday");
}

//-----

void main()
{
char * line_p = NULL;

init (&line_p);
printf(">> %s\n", line_p);
delete[] line_p;
}
Автор: i603034
Дата сообщения: 19.02.2008 17:57
akaGM
спасибо

Но почему не работает мой вариант?
Автор: akaGM
Дата сообщения: 19.02.2008 19:14
i603034
да не очень-то я, ну попробую...
может быть этим примером

Код: void proc (int i)
{
i = 10;
}

void main()
{
int j = 20;
proc(j);
printf("хотелось бы червонец, а получим %d\n", j);
}
Автор: foreground
Дата сообщения: 19.02.2008 19:24
После нескольких часов траханья с boost так и не удалось получить файлы в папку stage\lib . .. ну вопще я, честно говоря, теперь после кучи мельканий в comand promt-е с надписями error что-то решил забить на этот "классный" буст. Незнаю как люди работают с такой противной либой ..
STLport понравился гораздо больше. И установка более понятная и ошибок никаких незнакомых вроде не лезет при компиле.
Остаётся писать сериализацию с нуля или искать, что по понятней чем boost.

P.S.: может все нормальные люди юзают это изделие из под шестой студии?
Автор: i603034
Дата сообщения: 20.02.2008 22:00
akaGM
Вот такое разжёванное объяснение до меня дошло быстрее, хотя суть та же:

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



Цитата:
почему именно Faraday, а не Пупкин или там Хелло Ворлд какой-нибудь?

Просто первое, что в голове крутилось ))
Автор: foreground
Дата сообщения: 21.02.2008 09:32
i603034

а есть вопще такая классная ссылка
http://ru.wikibooks.org/wiki/%D0%A1%D0%B8%2B%2B

и учебник Павловской тоже ничего так. .
Автор: diaz85
Дата сообщения: 23.02.2008 10:06
Решил написать утилитку для отправки почты через смтп
Вот кусок кода:

Код:
if(connect(sock,(sockaddr*) pt_servaddr, sizeof(servaddr)))
printf("Connection failed...");
else
{
recv(sock, pbuf, sizeof(buf),0);
printf("%s\n", buf);

memset(buf, 0, sizeof(buf));
strcat(buf, "EHLO xxxxx\r\n");
send(sock, pbuf, sizeof(buf),0);
memset(buf, 0, sizeof(buf));
recv(sock, pbuf, sizeof(buf),0);
printf("%s\n", buf);

memset(buf, 0, sizeof(buf));
strcat(buf, "auth login\r\n");
printf("%s\n", buf);
send(sock, pbuf, sizeof(buf),0);
recv(sock, pbuf, sizeof(buf),0);
printf("%s\n", buf);
closesocket(sock);
}
Автор: Ghost0334
Дата сообщения: 26.02.2008 12:34
Привет всем участникам форума!!!
Помогите пожалуйста сделать задачку,вернее перевести с Паскаль на С++. Только компилятор Borland C++!
Program 9;
Var i,j:integer;
st,st1:string;
begin
Write i<leghts(st)+1 do
begin
st1:=st1+st[lenghts(st)-i+1];
i:=i+1;
st1:=st1+st[lenghts(st)-i+1];
i:=i+1;
st1:=st1+st[lenghts(st)-i+1]+' ' ;
i:=i+1;
end;
writeln('----------------------');
for i:=lenght(st1) downto 1 do write(st1[i]);
readln;
end.
Автор: Dizenteria
Дата сообщения: 26.02.2008 12:37
Здравствуйте, помогите решить две задачи на C++.
1.
Задана квадратная матрица.Поменять местами строку с максимальным элементом на главной диагонали со строкой с заданным номером m.
2.
В строке имеются точки с запятой(;).Подсчитать количество символов между точками с запятой и после них.Создать массив с этими числами и вывести на экран каждую подстроку завершенную соответствующим числом и с переводом на новую строку.
Автор: FerzCH
Дата сообщения: 26.02.2008 19:38
Что это может значить?...
conflicting declaration "typedef struct Tline TPoint"
"TPoint has a previous declaration "typedef struct TPoint TPoint"

В проге был объявлено
typedef struct {
double x, y, z;
} TPoint;

и затем использовалось только для объявления переменных такого типа...

Добавлено:
Да, не сказала:
юзаю коспилятор Dev-Cpp
Автор: diaz85
Дата сообщения: 26.02.2008 20:24
Dizenteria
По матрицам тут миллион примеров
2

Код:
#include <stdio.h>
void main()
{
char str[1024];
char substr[1024];
int a[1024]={0};
int i=0, j=0, k=0;

printf ("Vvedite stroku\n");
gets(str);
substr[0]='\0';
while(str[i]!='\0') //пока не конец строки перебираем символы в ней
{
if(str[i]==';') //если ; то печатаем подстроку и количество символов в ней
{
printf("%s %d\n", substr, a[j]);
i++;
j++;
k=0;
substr[k]='\0';
continue;
}
substr[k]=str[i];
k++;
substr[k]='\0';
i++;
a[j]++;
}
printf("%s\n", substr);
}
Автор: distance
Дата сообщения: 26.02.2008 21:00
FerzCH
тип TPoint уже был определён к моменту typedef struct Tline TPoint
Автор: FerzCH
Дата сообщения: 26.02.2008 21:30
distance
Да это и я понимаю... Но TPoint не был объявлен ранее! Он объявлен один раз через typedef.
Где искать ошибку?
Автор: distance
Дата сообщения: 26.02.2008 22:11
FerzCH

typedef struct {
double x, y, z;
} TPoint;

при такой записи в Си создаётся анонимная структура и одновременно определяется новый тип данных.
для c++ это ненужная операция, достаточно просто:
struct TPoint { ... };


Цитата:
Где искать ошибку?

вот здесь:
typedef struct Tline TPoint;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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