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

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

Автор: Abs62
Дата сообщения: 17.04.2013 18:12
ne_viens

Цитата:
Надо или делать
float* ret = malloc(sizeof(ret) * 3);
в Calc() и потом free() в вызывающем коде,

Вообще-то, вот так делать не надо. Чревато неприятностями, потому как у экзешника и dll разные RTL. В VC, к примеру, malloc реализован через HeapAlloc(_crtheap,...) где _crtheap - хэндл хипа, создаваемого при инициализации RTL. У dll свой хип, у экзешника свой, и вряд ли стоит пытаться освобождать в одном из них блок, который был выделен в другом.
Автор: AZJIO
Дата сообщения: 17.04.2013 19:03
Есть же какая то стандартизация. Как в WinAPI. Может массив вообще таким способом передаваться не должен? Просто были мысли вслух. Обычно структура возвращается. То есть программист должен знать какая структура должна возвратиться, а то что он ей неправильно воспользуется это уже его проблемы.
В AutoIt3 обычно передаётся указатель на структуру, в которую возвращать данные. Видимо функция в DLL должна проверить размер структуры и если совпадает то возвратить в неё результат.
Автор: Abs62
Дата сообщения: 17.04.2013 19:23
AZJIO

Цитата:
Есть же какая то стандартизация. Как в WinAPI.

В WinAPI структуру передаёт вызывающая программа, а функция её заполняет. Если есть необходимость выделять массив данных неизвестного заранее размера, обычно делается два вызова функции - первый возвращает размер данных, а второй уже заполняет выделенную вызывающей программой под этот размер память.
Если позарез надо выделять память в dll, а освобождать в программе (ну, или наоборот), есть системные фунции с префиксом Global - GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree. Они это позволяют. Но вообще говоря, программу надо строить так, чтобы любой выделенный ресурс освобождался там же, где выделяется.

Цитата:
В AutoIt3 обычно передаётся указатель на структуру, в которую возвращать данные. Видимо функция в DLL должна проверить размер структуры и если совпадает то возвратить в неё результат.

В WinAPI первым полем практически любой структуры идёт её размер. И это поле обязательно заполняется перед вызовом функции.
Автор: kotlomoy
Дата сообщения: 17.04.2013 22:11
AZJIO

Цитата:
Мне вот ещё вопрос волновал, будет ли такого типа массив принят внешней программой, ведь есть массив указателей. Должна ли программа принимающая массив его адекватно воспринять или нужно структурой передавать несколько значений.

Нужно передать в функцию указатель или массив, куда и записать результат.
extern "C" __declspec(dllexport) float __stdcall Calc(float kx, float ky, float am, float step, float min, float max, float out[3])
теперь то, что пишется в out будет доступно в вызывающей функции.

Если делать совсем безопасный вариант, то нужно еще длину массива передавать и проверять.
Автор: AZJIO
Дата сообщения: 22.04.2013 04:23
Как в eclipse компилировать проект? Русификатор нашёл, тему Dark нашёл, цвета редакторан астроил, компилировать не получается. gcc и g++ в комплекте нет, указал на каталог в CodeBlocks, содержащий эти файлы, но пока eclipse не компилирует. Нашёл описание.
Автор: HNKTO
Дата сообщения: 23.04.2013 14:39
Можно вопрос от тупого чайника?

Не могу понять как использовать стандартный элемент управления Windows "Combo Box".
Кто-нибудь объяснит, что я делаю не так.
Код моей программы:

Код:
main.cpp
===================================
#include <windows.h>
#include "resource.h"

HINSTANCE hinst;

INT_PTR WINAPI MdlgFunc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndCombo, hwndList;
    LRESULT lResult = 0;
    char StrBuffer[300] = {0};

    switch (uMsg)
    {
        case WM_INITDIALOG:
            hwndList = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,    20, 80,    200, 300, hDlg,(HMENU) 1, hinst, NULL);
            hwndCombo = CreateWindow("COMBOBOX", NULL, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE, 20, 20, 200, 30, hDlg, 0, hinst, NULL);
            break;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
            case IDCANCEL :
                    EndDialog(hDlg, LOWORD(wParam));
                    return (INT_PTR)TRUE;
                    break;
            case IDC_BUTTON1 :
                GetDlgItemText(hDlg, IDC_EDIT1, StrBuffer, sizeof(StrBuffer));
                if(StrBuffer != 0)
                    lResult = SendMessage(hwndCombo, LB_ADDSTRING, 0,(LPARAM) &StrBuffer);
                break;
            case IDC_BUTTON2 :
                GetDlgItemText(hDlg, IDC_EDIT1, StrBuffer, sizeof(StrBuffer));
                if(StrBuffer != 0)
                    lResult = SendMessage(hwndList, LB_ADDSTRING, 0,(LPARAM) &StrBuffer);
                break;
            case IDC_BUTTON3 :
                break;
            }
            //сообщения самого комбобокса
            if((HWND) lParam == hwndCombo)
            {
                switch (HIWORD(wParam))
                {
                case CBN_EDITCHANGE :
                    SendMessage(hwndCombo, WM_GETTEXT, sizeof(StrBuffer), (LPARAM) &StrBuffer);
                    SetDlgItemText(hDlg, IDC_EDIT1, StrBuffer);
                    break;
                case CBN_DROPDOWN :
                    StrBuffer[0] = StrBuffer[0];
                    //none
                    break;
                }
            }
            break;

        case WM_NOTIFY:
            break;
        default:
            break;
    }
    return(FALSE);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    hinst = hInstance;
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MdlgFunc);
}
============================================
resource.h //Собственно это и далее - сгенерено самой студией и я не вмешивался.
============================================
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by resource.rc
//
#define IDD_MAIN 101
#define IDC_EDIT1 1001
#define IDC_BUTTON1 1002
#define IDC_BUTTON2 1003
#define IDC_BUTTON3 1004

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
=============================================
resource.rc
=============================================
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Русский (Россия) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_MAIN DIALOGEX 0, 0, 317, 181
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_OVERLAPPEDWINDOW
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "ОК",IDOK,206,160,50,14
PUSHBUTTON "Отмена",IDCANCEL,260,160,50,14
EDITTEXT IDC_EDIT1,210,12,84,12,ES_AUTOHSCROLL
PUSHBUTTON "Button1",IDC_BUTTON1,210,30,72,12
PUSHBUTTON "Button2",IDC_BUTTON2,210,48,72,12
PUSHBUTTON "Button3",IDC_BUTTON3,210,66,72,12
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_MAIN, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 310
TOPMARGIN, 7
BOTTOMMARGIN, 174
END
END
#endif // APSTUDIO_INVOKED

#endif // Русский (Россия) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
Автор: Abs62
Дата сообщения: 23.04.2013 20:31
HNKTO
А в чём, собственно, проблема? Как заказано, так и работает. Если надо что-то вводить в строку комбобокса, нужен стиль CBS_DROPDOWN. CBS_DROPDOWNLIST заполняет это поле только выбором из списка.
Ну и, конечно, размер по вертикали побольше задать надо. А то выпадающему списку выпадать некуда.
Автор: HNKTO
Дата сообщения: 23.04.2013 21:18
Изменил соответствующую строку создания КомбоБокса на:

Код: hwndCombo = CreateWindow("COMBOBOX", NULL, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE, 20, 20, 200, 250, hDlg, 0, hinst, NULL);
Автор: Abs62
Дата сообщения: 23.04.2013 21:37
HNKTO

Цитата:
Заказано было появление выпадающего списка с вариантами выбора у КомбоБокса. Последний не появляется.

Проверил - окошко списка выпадает, как положено. Вариантов выбора в нём, естественно, нет - их сначала туда загрузить надо. Если в обработчике для Button1 заменить листбоксовское LB_ADDSTRING на комбобоксовское CB_ADDSTRING, будут загружаться потихоньку.

Цитата:
Программирование для Вин95 Петзольда не предлагать - уже читал.

Этого вполне достаточно для понимания принципов работы окон, как там всё устроено. А дальше изучать детали - эксперименты, MSDN, Яндех или Гугль.
Автор: HNKTO
Дата сообщения: 23.04.2013 22:04
Работает!
Спасибо.
Премного Благодарен.


Цитата:
А дальше изучать детали - эксперименты, MSDN, Яндех или Гугль.

ИМХО практика показала, что лучше всего - найти какую-нибудь не слишком сложную программу с исходниками, которая при этом из этих исходников компилируется, и потихоньку разбирать её работу.
Ну и буржуйские мантры MSDN-а тоже ощутимо помогают.
Автор: AZJIO
Дата сообщения: 24.04.2013 16:02
Посмотрите,что я делаю не так http://pastebin.com/Pa6Q5W58
Автор: adasiko
Дата сообщения: 24.04.2013 18:04
AZJIO
Советую почитать любую книжку по основам С
Рекомендую Подбельский - "Программирование на языке Си"
Автор: AZJIO
Дата сообщения: 24.04.2013 22:37
adasiko
http://azjio.ucoz.ru/publ/programmirovanie/s_92_s/vsjo_o_s_92_s/13-1-0-37

Цитата:
Рекомендую Подбельский - "Программирование на языке Си"
в google находится только в djvu формате, а у меня на него алергия. Есть куда более читабельные, более интерактивные варианты.
Автор: ItsJustMe
Дата сообщения: 24.04.2013 23:15
AZJIO

Цитата:
а у меня на него алергия

На djvu или на Подбельского?
Что же касается чтива, то ничего лучше Джеффри Рихтера (Jeffrey Richter) я еще не видел.
Автор: AZJIO
Дата сообщения: 24.04.2013 23:30
ItsJustMe
Мужики, не надо мне советовать прочитавши поверхностно одну книгу. Вот вам каталог раздач на несколько гигабайт, я лично скачал штук 20 разных книг, в том числе и djvu и pdf форматах. Читать кривой текст только глаза себе портить, максимум что я бы почитал - Прата, но опять же djvu, просто качество терпимое.
Я просил помочь, а не отсылать в гугль или указывать на очередную партию книг.
Автор: kotlomoy
Дата сообщения: 25.04.2013 07:45
AZJIO
Я открыл, увидел, что нет точек с запятыми, и закрыл. Изучай базовый синтаксис языка
Автор: HNKTO
Дата сообщения: 25.04.2013 12:54
AZJIO,
";" - это да. Что-то маловато их, особенно в конце.
float aRes[]; и float aRes[j + tmp + 1][3]; - это что такое?
Можно float aRes или float aRes[константа] или float aRes[] = {константа1, константа2}
Но не то, что ты написал.
Если main() у тебя возвращает значение, то укажи это в определении функции.
float* Calc(int kx, int ky, float Sum, int iMin, int iMax); - по нормальной логике возвращает указатель
При этом в теле функции Calc() я не нашёл, чтоб она вообще что либо возвращала.
... Может ещё чего есть, чего не заметил.
...
Не хочешь читать Подбельского или Джеффри Рихтера - есть Керриган Ричи "Язык Си" - тоже внятно и понятно всё написано. И если так уж воротит от djvu - то эта есть на html с нормальной вёрсткой, который можно легко распечатать.
Автор: AZJIO
Дата сообщения: 25.04.2013 15:23
kotlomoy

Цитата:
Я открыл, увидел, что нет точек с запятыми, и закрыл
ок, я же в курсе, что тут помощь по желанию и никто ни кого не заставляет (понятно по умолчанию).

HNKTO
Массив с float я пока не понимаю в каком формате лучше возвращать. Указатель не содержит размер.


Цитата:
Если main() у тебя возвращает значение, то укажи это в определении функции.
По умолчанию если я не указал возвращаемый тип то int.


Цитата:
Не хочешь читать Подбельского или Джеффри Рихтера - есть Керриган Ричи "Язык Си" - тоже внятно и понятно всё написано. И если так уж воротит от djvu - то эта есть на html с нормальной вёрсткой, который можно легко распечатать.
да, именно Brian W. Kernighan, Dennis M. Ritchie я и использую как лучший вариант для меня, конвертировал её в CHM, печатать конечно не буду, я же не прыгаю от книги к компу и обратно, а читаю CHM и тут же пробую прямо в компьютере, разве по другому удобней?

Если что, условие задачи которую я решаю таково:
Дано:
Минимальные значения iMin и iMax, которым принадлежит искомые X и Y. В примере они заданы как 1 и 10
Коэффициенты kx и ky участвующие в формуле X * kx + Y * ky = Sum и сама сумма Sum.
Необходимо найти все варианты решения (значения X и Y) удовлетворяющих равенству X * kx + Y * ky = Sum
Но при этом только те X и Y, которые имеют сотую часть, например 234.34. Числа типа 234.344564 не должны попадать в результат. Подробнее здесь.

Переделал без массива, float заменил на double, осталось разобраться с таймером.
Автор: HNKTO
Дата сообщения: 26.04.2013 22:01

Цитата:
Я пытаюсь объявить массив с данными типа float но при этом не объявляя его размер, чтобы потом функция вернула в данную позицию/переменную/указатель массив нужного размера.

Так нельзя. Регистровые переменные могут создаваться ИСКЛЮЧИТЕЛЬНО фиксированного размера на момент компиляции программы.
Чтобы отойти от фиксированного размера:
Создаёшь указатель (float *aRes)
Потом создаёшь массив в памяти aRes = malloc(размер Байт)
И пользуешься.
А вообще внимательней читай учебник. Там всё это написано.
----------
Условие задачи выглядит как контрольная задача по итерационным алгоритмам. Я не ошибаюсь?
=======================================================================



=======================================================================
Может кто подскажет какую - нить стандартную функцию для конвертации текста из Юникода(ну или если точнее той двухбайтной кодировки текста, которая используется для unicode программ в Windows) в UTF-8, если таковая вообще есть ???
А если нет - то как это сделать ручками на С++.
Программа пишется в MSVS2010 (для винды естественно)
Автор: V0lt
Дата сообщения: 26.04.2013 22:14
HNKTO

Цитата:
Может кто подскажет какую - нить стандартную функцию для конвертации текста из Юникода(ну или если точнее той двухбайтной кодировки текста, которая используется для unicode программ в Windows) в UTF-8, если таковая вообще есть ???

https://github.com/mpc-hc/mpc-hc/blob/master/src/DSUtil/DSUtil.cpp#L1500

Код: CStringA UTF16To8(LPCWSTR utf16)
{
CStringA str;
int n = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL) - 1;
if (n < 0) {
return str;
}
str.ReleaseBuffer(WideCharToMultiByte(CP_UTF8, 0, utf16, -1, str.GetBuffer(n), n + 1, NULL, NULL) - 1);
return str;
}
Автор: AZJIO
Дата сообщения: 27.04.2013 01:57
HNKTO

Цитата:
Потом создаёшь массив в памяти aRes = malloc(размер Байт)
Этот ответ хотелось бы конечно получить не после того как разобрался. Но сделал уже без массива. Единственное таймер не пойму почему 0.0000 выдаёт, либо так быстро код работает (маловероятно) либо просто сам таймер не работает.
malloc конечно массив не создаёт он просто память выделяет под указанный размер массива, который я должен был вычислить и возвратить указатель. Хотя тут ещё проблема - таскать ещё одну переменную - количество элементов массива (указатель то не содержит размера массива). Её бы можно было вставить в первый элемент массива, но это разве нормально иметь количество в формате float? Теоритически можно (с приведением к int), но является ли это правильный стиль программирования.

Цитата:
Условие задачи выглядит как контрольная задача по итерационным алгоритмам. Я не ошибаюсь?
Выглядит как человек попросил сделать рассчёт каких-то продаж, но идея с математической точки зрения показалась интересной. Кстати, прочитал что деньги не рекомендуется считать в формате с плавающей точкой. Я использовал double, по крайней мере результаты стали ожидаемыми.

Цитата:
А вообще внимательней читай учебник. Там всё это написано.
Не уверен. К примеру я не нашёл варианта возвращения массива с float из функции. В гугле всё написано... также как и про WideCharToMultiByte, которую я когда-то переводил в рамках AutoIt3, и обратную ей MultiByteToWideChar.
Автор: ne_viens
Дата сообщения: 27.04.2013 10:30
Переменные в структуре можно таскать.
И за одну секунду time() миллионы таких програмок можно прощитать.
Пример структуры и более точного измерения времени (в тактах процессора) выполнения подпрограммы:

#define SIZEOF_ARR 3

typedef struct {
    int kx, ky, iMin, iMax, arrLen;
    double Sum, *result;
} PACK;

int Calc(PACK* p)
{
    int i, k1, k2, c1, c2, iMin, iMax, tmpMin;
    int k100 = 100;

    __int64 ticks = __rdtsc();
    
    iMin = p->iMin * k100;
    iMax = p->iMax * k100;

    //...
    
    for(i = 0; i < p->arrLen; ++i)
        p->result[i] = 3.14159265358979323846;

    printf("%lli processor cycles passed\n", __rdtsc() - ticks);
    return 0;
}

main()
{
    int i, z;
    PACK p;
    double arr[SIZEOF_ARR];
    
    p.kx = 4507;
    p.ky = 109;
    //...
    p.arrLen = SIZEOF_ARR;
    p.result = arr;

    z = Calc(&p);
    
    printf("1st element of array = %lf, 2nd = %lf, 3rd = %lf\n", arr[0], arr[1], arr[2]);
    return z;
}
Автор: HNKTO
Дата сообщения: 27.04.2013 19:08
V0lt, AZJIO
Спасибо.
Автор: AZJIO
Дата сообщения: 28.04.2013 01:45
ne_viens
Спасибо. Только на MVS удалось скомпилировать. За одно разобрался с цветовыми настройками Black_IDE.7z, сделал Black цветовую схему (как в CHM-справке).
Автор: ne_viens
Дата сообщения: 28.04.2013 12:35
В начале надо добавить:
#ifdef __GNUC__
long long __rdtsc(void) {
    asm
    (
     ".byte 0x0f\n"
     ".byte 0x31\n"
    );
}
#endif
Автор: juvaforza
Дата сообщения: 28.04.2013 13:09
Все, вопрос снят.
Автор: adasiko
Дата сообщения: 28.04.2013 19:44
AZJIO

Цитата:
Мужики, не надо мне советовать прочитавши поверхностно одну книгу. Вот вам каталог раздач на несколько гигабайт, я лично скачал штук 20 разных книг, в том числе и djvu и pdf форматах. Читать кривой текст только глаза себе портить, максимум что я бы почитал - Прата, но опять же djvu, просто качество терпимое. Я просил помочь, а не отсылать в гугль или указывать на очередную партию книг.

А я реально советую купить/взять в библиотеке/у знакомых бумажную (если уж так глаза важны) и не толстую книгу и вдумчиво прочитать главы, разбирая приводимые примеры, иначе толку мало будет
PS: решать конечно самому
PS2: Подбельского привёл в качестве патриотизма, да и сам когда-то начинал с неё, но естественно можно выбрать другую книгу
Автор: AZJIO
Дата сообщения: 29.04.2013 00:51
adasiko

Цитата:
А я реально советую купить/взять в библиотеке/у знакомых бумажную
Бумажная хорошо когда на работу едешь или выпадают свободные минуты, а если компьютер рядом, по себе знаю, что после каждого примера хочется включить и попробовать код или поискать вопрос в google. Но ещё проблема, именно той книги которая нравится нет в бумажном варианте. И ещё люди которые здесь пишут могут жить не в миллионнике, в небольшом городе, где книги по Си могут вообще не быть, потому что спрос на них почти нулевой.

Цитата:
вдумчиво прочитать главы, разбирая приводимые примеры, иначе толку мало будет
Почему вы думаете что я делаю не так? Вообще по форумным баталиям я понял одно правило, если не хочешь/не можешь/нет времени помогать, то лучше совсем не помогать и даже не отписывать причины, всё равно рано или поздо уровень одного программиста растёт до пределов, когда уже скушно подсказывать сотне новичков прописные истины, при этом узнаёшь себя, а ведь несколько лет назад я задавал такие же вопросы. Хотелось бы мне тогда, чтобы меня тыкали носом, учили всему, кроме заданного вопроса? Нет. Поэтому, если вопрос кажется глупым, то оставить его для тех, чтобы ответили программисты среднего уровня, которым приятно и помочь и самому чему то научится. Но это в лучшем случае, в худшем это помощники, которые не могут помочь, кроме выдать себя за умного и направить в google. Такое же наставление (внимательно читать справку) я могу дать и сам любому программисту в этой теме.
Автор: bomzzz
Дата сообщения: 29.04.2013 04:04
так на всех форумах, чтоб локальную задачу решить из одной строки оказывается книгу надо читать. если бы он собирался книги читать то не спрашивал бы.
вот тут счастья попытай cyberforum.ru тут народу мало сразу пишут готовые коды. по крайней мере в ассемблерной теме, в сишной вроде так же, пару раз туда заглядывал

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

Цитата:
вот тут счастья попытай cyberforum.ru
Думаешь я не знаю про этот форум? У меня там посты годичной давности. Теоретически я понимаю, что решить могу вообще никого-ничего не спрашивая, всё уже написано в гугле в разных инкарнациях. Но иногда для одного решение проблемы требует 3 дня корпения, для специалиста 3 слова сказать/намекнуть.

Цитата:
возможно ты взялся сразу за крупную задачу
задача эта примитивная, нулевой уровень.

Цитата:
сначала надо было руку набить на простых примерах
Мне кажется ты повторяешь ошибку предыдущих авторов. Бери пример с ne_viens пишет либо код, либо ничего, без флуда.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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