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

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

Автор: Daniyar91
Дата сообщения: 16.05.2013 15:04
Спасибо тебе большое, а исходники можно?
Автор: ne_viens
Дата сообщения: 16.05.2013 15:10
http://rghost.net/46037826
Автор: AZJIO
Дата сообщения: 16.05.2013 18:08
kotlomoy
Не компилируется у меня твой пример.

Цитата:
А твой код падает, потому что ты забыл про завершающий ноль в строке
поставил завершающий '\0', также падает.
А ещё удручает, что нужно написать 370 функций аналогов, что существует в AutoIt3 и 2000 дополнительных функций, что есть в AutoIt3 в UDF, которые бери да пользуйся, а тут сначала напиши их за несколько лет, потом пользуйся.
Автор: kotlomoy
Дата сообщения: 16.05.2013 22:37
AZJIO
Пример был исключительно под Visual Studio.
Если у тебя студия, значит ты наверное не пролинковал ws2_32.lib
А вообще, посмотри, на что ругается линкер и исправь
Автор: AZJIO
Дата сообщения: 17.05.2013 03:38
Daniyar91
Я на всякий случай поискал Tiger на офсайте AutoIt3, и нашёл Tiger и даже Tiger2 - ссылка, он даже был у меня в коллекции, ссылка на архив

kotlomoy
Да на VS проверял... Видимо я его очень плохо знаю, потому что посмотрел уроки, там даже в режиме дебагинга выводит значения переменных, я всё не понимал как можно программировать если скрипт начинает работать только после того как он правильно написан, а написать сразу правильно (или даже после многократного перечитывания) просто нереально.
Автор: Daniyar91
Дата сообщения: 17.05.2013 11:19
Спасибо, если все будет работать то хорошо, ведь в AutoIT я хоть что-то понимаю в отличии от C.
Автор: AZJIO
Дата сообщения: 17.05.2013 15:04
Daniyar91

Цитата:
если все будет работать то хорошо
я проверил перед отпиской. Нужны файлы Hash39.dll, Hash39DLL.au3, HashTest.au3. Последний запускаешь, смотришь результаты в консоли.
Автор: BennyBlanco
Дата сообщения: 20.05.2013 20:14
нарыл я в сети такое:

Цитата:
Это - таблицы замен символов. Они, по-умолчанию, тупо кодируют текст в Base64 и меняют символы по этим таблицам. Поэтому можно попытатся расшифровать ссылку или текст следующим скриптом (С++ script)

Вот сам скрипт:

Код: // -----------------------------------------------------------------------------
char DecodeUppodText(char sData) {
variant char1, char2; int i;
variant Client_codec_a = ["D", "4", "l", "N", "o", "1", "I", "g", "T", "a", "X", "H", "Q", "w", "d", "k", "J", "5", "c", "L", "G", "x", "9", "Y", "e", "="];
variant Client_codec_b = ["3", "m", "p", "v", "W", "R", "n", "U", "y", "M", "6", "2", "B", "s", "f", "i", "7", "0", "V", "b", "u", "z", "Z", "t", "8", "C"];

sData = ReplaceStr(sData, "\n", "");
for (i=0; i<Length(Client_codec_a); i++) {
char1 = Client_codec_b[i];
char2 = Client_codec_a[i];
sData = ReplaceStr(sData, char1, "___");
sData = ReplaceStr(sData, char2, char1);
sData = ReplaceStr(sData, "___", char2);
}
sData = HmsUtf8Decode(HmsBase64Decode(sData));
return sData;
}
Автор: V0lt
Дата сообщения: 20.05.2013 20:54
BennyBlanco
Википедия предлагает пяток онлайн кодировшиков-декодировщиков и пару утилит.
http://www.4mhz.de/b64dec.html
http://www.fourmilab.ch/webtools/base64/
Автор: BennyBlanco
Дата сообщения: 20.05.2013 21:34
V0lt
Кодировать и раскодировать Base64 мне удобно например этим онлайн сервисом http://base64-encoder-online.waraxe.us/

Проблема в том что закодированный текст что я дал, зашифрован в Base64 и потом полученные символы Base64 заменены символами согласно этой таблице:

Код:
variant Client_codec_a = ["D", "4", "l", "N", "o", "1", "I", "g", "T", "a", "X", "H", "Q", "w", "d", "k", "J", "5", "c", "L", "G", "x", "9", "Y", "e", "="];
variant Client_codec_b = ["3", "m", "p", "v", "W", "R", "n", "U", "y", "M", "6", "2", "B", "s", "f", "i", "7", "0", "V", "b", "u", "z", "Z", "t", "8", "C"];
Автор: ne_viens
Дата сообщения: 20.05.2013 22:15
На C это будет выглядеть примерно так:

#include <windows.h>
#pragma comment(lib, "Crypt32.lib")
char encoded[] = "M215V3WNbDc4VxnGtHhlL4EYtH1GO3hGLo7DtoviL4zGOuhzO2FD9S0jLH5Nf4"
"ppfTZW14ZEvgFzf2UHg6lGacEsaEZ9auf1bxExvjisO3BmvjtNvjU0ayUGL6A5";
char Client_codec_a[] = "D4lNo1IgTaXHQwdkJ5cLGx9Ye=";
char Client_codec_b[] = "3mpvWRnUyM62Bsfi70VbuzZt8C";

main()
{
    int i, j, buflen;
    char buf[512];

    for(i = 0; encoded[i]; ++i)
        for(j = 0; Client_codec_a[j]; ++j)
            if(encoded[i] == Client_codec_a[j])
            {
                encoded[i] = Client_codec_b[j];
                break;
            }
            else if(encoded[i] == Client_codec_b[j])
            {
                encoded[i] = Client_codec_a[j];
                break;
            }
    
    buflen = sizeof(buf);
    CryptStringToBinary(encoded, i, CRYPT_STRING_BASE64, buf, &buflen, NULL, NULL);
    buf[buflen] = 0;
    puts(buf);
}

И после сборки и выполнения получим:
http://ufs2.china-cdn88nmbwacdnln8hq8qwe.com/view/hFoD5Aqtx6Qzn1Q00OY0gQ/1369084866/68918.mp4
Автор: BennyBlanco
Дата сообщения: 20.05.2013 22:21
ne_viens
Благодарю
А какой программой можно выполнять такие скрипты самому?
Автор: Emily Sweet
Дата сообщения: 20.05.2013 22:49
Здравствуйте!
Хочу научиться программировать на C++ под Linux с использованием компилятора gcc. Ни с C++ ни с объектно-ориентированным программированием не знакома. Что бы вы могли порекомендовать для начала, для ускоренного изучения, какую литературу?

И такой вопрос: если в Windows программисты используют функции библиотек user32.dll, system32.dll, то какие библиотеки используются в Linux?
Автор: 1234567890qwe
Дата сообщения: 20.05.2013 22:50
Ребят такая штука есть class Geometry у него есть потомки class Cilinder (Ciobj- его экземпляр) и class Paralle(Paobj - его экземаляр), и от него создан vector <Geometry> Geo;(аКа динамический массив)
вот как его заполняю:

Ciobj.getdata(); //ввели цилиндр
Geo.push_back(Ciobj);// запихали в наш контейнер
cout<<"Цилиндр добавлен"<<endl;
//Paralle - аналогично

теперь вывод:
Geo[i].display(); //он же тут выводит свою функцию которая в нем виртуальная несмотря на то что она переопределена в дочерних(тоже вирт. функции) и по идее он должен выводить метод display() той фигуры чей тип находится на месте "i" и так пробовал и так, даже через указатели(итераторы) не могу понять как вывести..(т.е. у Cilinder и Paralle есть свои методы вывода)
и так пробовал cout подчеркивает ни как не хочет выводить:
vector<Geometry>::iterator cur;
for (cur=Geo.begin();cur<Geo.end();cur++)
cout<<*cur<<endl;

вопрос в том как сделать вывод???
Автор: dragon010
Дата сообщения: 21.05.2013 08:26
1234567890qwe

Функция display в Geometry должна быть виртуальной, насколько я понял у тебя так и есть и это правильно.

НО в векторе ты хранишь экземпляры объектов типа Geometry. Именно сами объекты. Те на момент вызова display твоя программа уверена что работает именно с типом Display. Более того, когда ты делаешь push_back у тебя отсекается ненужная часть объекта (которая есть в Parallel, но которой нету в Geometry)

Так вот, а для того, что бы заработал полиморфизм - тебе надо обращаться к объектам либо по указателям, либо по ссылкам. И хранить так же в векторе!
Т.е. Делаешь vector<Geometry *> v;
Потом типа v.push_back(&Clobj)

Теперь можно писать v[0]->display()
И тут уже можно будет сходить в таблицу виртуальных функций и дернуть именно то, что хотелось.
Автор: ne_viens
Дата сообщения: 21.05.2013 09:23
>BennyBlanco C не скриптовый язык программирования. Программа компилируется с cl.exe или gcc.exe в исполняемый exe файл, который запускается и выдаёт результат вычисления.
Автор: 1234567890qwe
Дата сообщения: 21.05.2013 12:13
dragon010

Цитата:
Теперь можно писать v[0]->display()

Мэн, ты гений!... я ваще мучался, в книге в разделе STL ваще такого не нашел ничего, все облазил...
Автор: dragon010
Дата сообщения: 21.05.2013 16:24

1234567890qwe

Клевые книжки по С++ это конечно же Страуструп (если осилить, правда почувствуешь свою крутость)
И Саттер "Решение сложных задач на С++"

Причем последняя написана в духе разбора задачек и ее реально интересно читать
Автор: sunny1983
Дата сообщения: 22.05.2013 03:25
Так, что-то не пойму, оператор int может использоваться и для офисания функции, и для описания переменной.

А функция main это тоже самое, что и програмный сегмент в ассемблере? Ну при выполнении программы в один сегмент загружается сама программа, в другой системные библиотеки и благодаря файлу заголовков адреса библиотечных функций всегда известны.
Автор: ne_viens
Дата сообщения: 22.05.2013 13:46
Да, только int не оператор а тип данных.

Функция main() это место в коде, от которого начинается исполнение кода пользователя (можно ещё и код инициализации написать, который исполняется перед main()).
Очевидно, сегменты в C и в 16бит ассемблере имеют разные значения. Main() можно засунуть в другой сегмент кроме .text с:

#pragma code_seg(".mySeg")
main()
{
}
Автор: biznesoft
Дата сообщения: 22.05.2013 18:59
Сорри что не в тему, не знал куда написать.
Нужна программа, конвертировать с XML формата в DBF а именно:
С файла http://rghost.ru/46172440

Вот что должно получится http://rghost.ru/46172230
===================
Файл для тестирования http://rghost.ru/46172293 XML
Автор: sunny1983
Дата сообщения: 26.05.2013 13:59

Цитата:
Очевидно, сегменты в C и в 16бит ассемблере имеют разные значения. Main() можно засунуть в другой сегмент кроме .text

Да, я неправильно написал. Сегменты были в 16-битном ассемблере, а в 32 и 64 битном они стали называться секциями. Программа имеет по меньшей мере две секции: .data - секция кода и .idata - секция импорта. При выполнении программы в секцию импорта загружаются системные dll, при компиляции имена функций преобразуются в их адреса и, таким образом, можно обращаться к функциям API.


Цитата:
Функция main() это место в коде, от которого начинается исполнение кода пользователя (можно ещё и код инициализации написать, который исполняется перед main()).

Ну это я пытаюсь аналогии с ассемблером провести. Поправьте меня, если я что-то путаю.


Код: #include <iostream>
#include <cmath>
Автор: ne_viens
Дата сообщения: 26.05.2013 16:08
Код в .text находится, и программа может иметь только одну секцию- .text, используя только штатные средства C компилятора. MSVC не выделяет отдельную секцию для данных импорта (IAT + IT) внешних библиотек, а линкует их в .rdata. Внешние библиотеки загружаются не в секцию импорта а в адресное пространство данной программы. Загрузчик сканирует таблицу импорта, загружает там описанные библиотеки, находит адреса там-же описанных функций и записывает эти адреса в перxодники (IAT) программы.

Секция импорта не программируется, а в таблицу импортов добавляются внешние библиотеки и их функции по мере надобности. Например, написали в коде MessageBox(); , компилятор находит в <windows.h>, что эта ф-я __stdcall с 4 аргументами, и обзывает ее как _imp__MessageBoxA@16, а дальше уже линкер находит такую ф-ю в user32.lib и добавляет эту информацию в таблицу импорта.

Для указания адреса исползуется & а не int (например, &variable). B ассемблере int называется dword, short - word, char - byte. А в описаниях ф-ий применяется для спецификации возвращаемого значения и типа аргументов. (например, int MyFunc(int i, char* c); указывает, что MyFunc() получает int i и адрес байта(ов) c, а возвращает int). Аналогия байта на C- char, и нет смысла сокращать счётчики до char-ов, так как операции с данными не кратными 32 битам на 32 битном процессоре выполняются гораздо медленнее. Линкер при оптимизации их всёравно к int приводит.

Очевидно, что, пройдя цикл, pi просто принимает такое круглое значение.
Автор: Abs62
Дата сообщения: 26.05.2013 16:24
sunny1983

Цитата:
Почему выводится 3 - только целая часть?

Потому что в выражениях вроде 4/(i*4+1) используются только целочисленные переменные и константы и, соответственно, вычисляются они по целочисленной арифметике. Приведение к типу float осуществляется уже позже, когда в вычислениях принимает участие pi.
Автор: sunny1983
Дата сообщения: 26.05.2013 17:22
"/" означает не целочисленное деление, а просто деление? Почему тогда результат целочисленный? Как должно быть записано выражение, чтобы результат деления был float?

ne_viens, спасибо за поправку
Правда я использую не MSVC, а gcc и вообще под Linux программирую, просто я сделал предположение что unix-программа ELF-формата также как и windows-программа PE-формата состоит из секций.
glibc это такой же API, как и WIN32, но для Linux, так или я в чём-то заблуждаюсь? Библиотеки имеют расширение не dll, а so.
Вот что пока не понял, чтобы использовать функцию какой-либо сторонней библиотеки кроме самой библиотеки .so программист обязательно должен иметь файл .h?
Автор: Abs62
Дата сообщения: 26.05.2013 17:50
sunny1983

Цитата:
"/" означает не целочисленное деление, а просто деление? Почему тогда результат целочисленный? Как должно быть записано выражение, чтобы результат деления был float?

Тип результата зависит от типов операндов. Вот как это расписано в Стандарте C++:

Цитата:
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result.
This pattern is called the usual arithmetic conversions, which are defined as follows:
— If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float.
— Otherwise, the integral promotions (4.5) shall be performed on both operands.
— Then, if either operand is unsigned long the other shall be converted to unsigned long.
— Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted to unsigned long int.
— Otherwise, if either operand is long, the other shall be converted to long.
— Otherwise, if either operand is unsigned, the other shall be converted to unsigned.
[Note: otherwise, the only remaining case is that both operands are int ]

В данном случае, чтобы перейти к вычислениям с плавающей точкой, проще всего написать как-нибудь вроде "4/(i*4.0+1)".
Автор: ne_viens
Дата сообщения: 26.05.2013 17:55
>sunny1983Напиши float i;

Про Linux не знаю, не разбирался.

Если ф-я __cdecl, h. файл с прототипами не нужен. Но лучше всётаки прототип написать- это предотвратит трудно устранимые ошибки.
Автор: 1234567890qwe
Дата сообщения: 26.05.2013 19:40
Долго искал куда вопрос кинуть, решил сюда.. так как дело имею именно с С/С++
Воощем хотелось бы узнать побольше о сборке, линковке, как выглядят объектные файлы, как линковщик вместо функций адреса вставляет, как параметры функций в стек кладутся, как выглядит массив и где храниться информация о нем в памяти, даже не знаю как выразиться типо как уже физически-архитектурно работа происходит... может есть документации какие нибудь или статьи, сайты хорошие, книги.. может кто сталкивался (предпочтительнее на русском)...
спасибо...
Автор: sunny1983
Дата сообщения: 27.05.2013 23:20
Дайте какие-нибудь задачки для начинающего программиста порешать, чтобы быстро освоиться.
Автор: akaGM
Дата сообщения: 27.05.2013 23:30
на
http://forum.ru-board.com/topic.cgi?forum=33&topic=4338#1

почти все с решениями :)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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