Помощь - Поиск - Пользователи - Календарь
Полная версия: Программирование
Форум студии Seaward.Ru > Разное > Таверна > Хард, софт
Страницы: 1, 2
ALexusB
Вопрос к студентам
Каким языкам сча в ВУЗе учат?
На что обращают внимание, под что готовят спецов (в кодинге).

Многие ли читали книжку "Совершенный код" и многие ли ее поняли и ей реально следуют ежедневно?
Warship
У нас сча дела на первом курсе обстоят вот так:

Первый семестр кодингу не учили вообще, сейчас вот по информатике изучаем Турбо Паскаль (т.е. стандартная схема первого курсе), по дисциплине "математическое обеспечение ЭВМ" препод нам обещает дать Вижуал Байсик.
С третьего курса, как обещают, будет Дельфи (т.е. тот-же Паскаль).

Ни о каких книгах у нас сейчас, ессно, даже речи не идет - никто (редчайшие исключения в счет не берем smile.gif) даже препода не понимает, хотя объяняет она, как мне кажется, прямо проще некуда smile.gif

===

Вообще, имхо, нам сча навязывают "мертвое" направление - актуальные на сейчас языки программирования, вроде того-же C#, после энтих Дельфей придется изучать наполовину заного, т.к устройство другое совершенно.
Было-бы куда логичнее после знакомства с общим устройством языков программирования на примере того-же ТурбоПаскаля на первом курсе (что есть функция и почему она может возвращать значение smile.gif), на втором курсе переходить к изучению C++/C#, но этого, к сожалению, не будет sad.gif
Dir
Цитата(Warship @ Feb 11 2010, 11:15) *

У нас сча дела на первом курсе обстоят вот так:

Первый семестр кодингу не учили вообще, сейчас вот по информатике изучаем Турбо Паскаль (т.е. стандартная схема первого курсе), по дисциплине "математическое обеспечение ЭВМ" препод нам обещает дать Вижуал Байсик.
С третьего курса, как обещают, будет Дельфи (т.е. тот-же Паскаль).

М-да,запущено всё.
Ещё в 1998 нам давали бэйсик и паскаль.
RIZIY
Цитата
Ещё в 1998 нам давали бэйсик

Ещё в 1987-88 у нас в школе был бэйсик.... smile.gif
ALexusB
Ага и слово "она" тоже характерно.
Я пока не встречал женщин-программистов. Встречал тех, кто так о себе думал, но не был smile.gif Что только подтверждало правило, что их в природе нет. А если есть (типа Тринити из матрицы), то это скорее дикие исключения из красной книги (таблетки), который встретить в быту анрил.

В Вузе была преподша по информатике, на вопрос экзамена про вирусы, где я распинался, как прописывать в хедер хук на вызов тела из конца файла, как самораспространятся и заражать.
Мне поставили 4 за не знание основ темы. Как выяснилось - это были ключи антивир.ехе для лечения таких файлов, а не процесс написания вирусов, как ПО.
Я не мог догадаться, что на экзамен по программированию нужно готовить ответы "оператора".
Черный Корсар
На первом курсе учили C++. Сейчас конкретной привязки нет(второй курс), кто на чем хочет, тот на этом и пишет. smile.gif На другой специальности с C++ перешли на изучение Java.
На старших курсах будет вроде Lisp, C, Assembler, но не у всех.
Warship
Нужна помощь по простому вопросу.
У меня есть динамически линкуемая DLL, которая грузится в приложение и в которой есть экспортируемая функция SomeTestFunc (имя абстрактное, как и везде далее), которая возвращает указатель на первый элемент массива байт.
Так вот. При подгрузке этой Dll в приложение и попытке вывести на консоль массив, на который указывает указатель, оно ничего не выводит (указатель явно != null), при том, что из самой Длл значение по тому-же указателю выводится правильно. Пробовал менять на целочисленное (т.е. возвращался не указатель) - с ним все проходило нормально.

Речь идет о C++, компилится под MinGW.

У меня сейчас вот такой код:
Длл (опуская ненужные инклуды и хедер):
Код
EXPORT char* SomeTestFunc(char* _data)
{
    char* retDataPtr;
    char retData[] = "1234567890";
    
    retDataPtr = &retData[0];
    
    printf("retDataPtr: %s.\n", retDataPtr); // Вывод "1234567890"
    
    return retDataPtr;
}

BOOL APIENTRY DllMain(HINSTANCE _instance, DWORD _reason, LPVOID _reserved)
{
    return TRUE;
}


Где EXPORT:
Код
#define EXPORT extern "C" __declspec (dllexport)


И код приложения, юзающего Длл:
Код
typedef char* (*ImportFunc)(char *);

/// Точка входа в приложение.
int main()
{
    ImportFunc testFunc;
    
    HINSTANCE myDll = LoadLibrary("MyDLL.dll");
    
    if(myDll == NULL)
    {
         printf("ERROR: unable to load DLL!");
         return 1;
    }
    
    testFunc = (ImportFunc) GetProcAddress(myDll, "SomeTestFunc");
    
    if(testFunc == NULL)
    {
        printf("ERROR: unable to find DLL function!");
        return 1;
    }
    
    printf("Result: %s.\n", testFunc("")); // Ничего не выводит
    
    FreeLibrary(myDll);

    return 0;
}


Отсюда, собсно, вопрос: почему у меня в приложении юзая Длл ничего не выводитcя?
Буду рад любым подсказкам. smile.gif
navy
посмотри тут http://www.firststeps.ru/mfc/winapi/r.php?22
Warship
Там я смотрел. smile.gif Как и на википедии в статье о Dll (там раздел о динамической линковке - http://ru.wikipedia.org/wiki/DLL#C_.D0.B8_C.2B.2B_3).
Это все не помогло, с википедии только стянул подгрузку.

Собсно, допилил приложение и Dll, чтобы выводило адрес, куда указывает указатель.
Что получил в итоге:
Цитата
DLL ptr address: 0x22febc
DLL retDataPtr: 1234567890.
Program ptr address: 0x22ff18
Program retDataPtr: ☺;@.
Для продолжения нажмите любую клавишу . . .

ptr address - адрес, куда указывает указатель.
retDataPtr - собсно, моя строка.

Первые две строки - это трайс значений из Dll при вызове функции.
Две вторые - трассировка значений, которые вернула функция из Dll, уже в самом приложении.
Т.е. они у меня в разные места указывают совершенно.
Еще момент: сейчас приведен вывод в консоль по std::cout, до этого было printf(). При printf() из приложения строку вообще не выводило, а по cout аш три символа smile.gif

Мне наверное нужно пояснить задачу: мне нужно передать в функцию в Dll массив байт, и получить другой массив байт обратно.
Вот начал разбирать на примере строки, как его вернуть. Оказывается, можно вернуть только указатель на массив (на первый элемент).
Но у меня-то эта функция в Dll возвращает вообще непонять-что smile.gif

Вообще, я так основательно за C++ взялся 3-й день как smile.gif До этого был почти год C# и почти два года AS. Параллельно конечно был еще C++ Билдер, но там я особо не углублялся, VCL'а за глаза хватало.
А вот собственно красивости C# и AS меня развратили сильно smile.gif Особенно первый, теперь вот туплю на указателях неуправляемой памяти.
navy
Цитата
Т.е. они у меня в разные места указывают совершенно.

естественно разные smile.gif Т.к. длл смотрит относительно своего адреса в памяти, а из ехе относительно своего.
С# нормальный язык, но для своей области. Хотя она и большая в общем. С++ тоже не для всего хорош... Ща попробую накидать твою прогу... посмотрим что получится.
Warship
Цитата(navy @ Jun 21 2010, 19:57) *

С# нормальный язык, но для своей области. Хотя она и большая в общем. С++ тоже не для всего хорош...

Отличный язык, и естесственно для своей области - милое дело что-то делать на нем под WinWorms smile.gif С++ просто "по-умолчанию" более низкоуровневый и компилируемый, да и пора новое изучать smile.gif

Цитата(navy @ Jun 21 2010, 19:57) *

Ща попробую накидать твою прогу... посмотрим что получится.

Спасибо smile.gif На деле у меня все решилось с помощью объявления переменной retData в Dll с ключевым словом "static". Но с удовольствием посмотрю на другое решение. smile.gif

Сейчас уже морочусь с динамическим выделением памяти для возвращаемого массива - он же у меня динамический получается. smile.gif И естесственно, хочется все это сделать без СТЛового вектора. smile.gif
navy
DLL
Код

extern "C" __declspec(dllexport) CHAR * GetHello();

__declspec(dllexport) CHAR * GetHello()
{
    CHAR* str = "Hellow World";

    return str;
}


ЕХЕ
Код

typedef CHAR* (WINAPI *hHellowFunc)(VOID);

int _tmain(int argc, _TCHAR* argv[])
{
    CHAR* str;
    hHellowFunc hHello=NULL;
    HINSTANCE hUserDLL=NULL;

    hUserDLL=LoadLibrary(_T("WinAPIDLL.dll"));
    if (hUserDLL==NULL)
    {
        printf("Error Load WinAPIDLL");
        return FALSE;
    }
    hHello=(hHellowFunc)GetProcAddress(hUserDLL,"GetHello");
    if (hHello==NULL)
    {
        printf("Error Load hHellow");
        return FALSE;
    }
    str = (*hHello)();
    printf("Result: %s.\n", str);

    ::FreeLibrary(hUserDLL);

    return 0;
}


Ну а изучать новое, я вот например хочу MVC 2.0 ща поизучать и SilverLight smile.gif Ну может PHP заодно... в веб хочу немного уклониться.
Warship
Нави, спасибо. smile.gif

Благодаря твоему примеру разобрался и в своем коде. smile.gif

Оказывается, моя запись
Код
EXPORT char* SomeTestFunc(const char* _data)
{
    char* retDataPtr;
    char retData[] = "1234567890";
    
    retDataPtr = &retData[0];
    
    return retDataPtr;
}

В которой объявлялся массив retData (4 строка), неверная сама по себе. Он почему-то да EXE просто не доживает, хотя вроде и все правильно должен возвращать (указатель на первый элемент) smile.gif

Нужно было объявлять указателем, как у тебя:
Код
EXPORT char* SomeTestFunc(const char* _data)
{
    char* retDataPtr;
    char* retData = "1234567890";
    
    retDataPtr = &retData[0];
    
    return retDataPtr;
}


Что интересно, если не использовать второй указатель (retDataPtr), то оба варианта работают одинакого хорошо, как этот:
Код
EXPORT char* SomeTestFunc(const char* _data)
{
    char retData[] = "1234567890";
    
    return retData;
}

Так и этот:
Код
EXPORT char* SomeTestFunc(const char* _data)
{
    char* retData = "1234567890";
    
    return retData;
}

С массивом только лезет предупреждение "warning: address of local variable 'retData' returned".

Логику этого момента я так и не понял. Не мог бы ты мне пояснить, из-за чего собственно в моем первом варианте (массив + указатель на первый элемент массива) оно не работает? Вроде-бы записи же эквивалентные.
navy
Цитата
"warning: address of local variable 'retData' returned".

этот ворнинг показывает, что произошло неявное преобразование типов char[] в char*. Т,е. просто был передан указатель на массив (компилер правильно разобрался)

Чтобы понять почему твой код неверен, неплохо бы его прогнать в дебаггере, типа IDA, для наглядности smile.gif
Скорее всего проблема в том, что это разные данные с точки зрения компилера... и поэтому он их размещает в разных участках памяти..
char retData[] = "1234567890" это наверно в стек
а это
CHAR* str = "Hellow World"; в ресурс
или наоборот
ПОэтому у тебя указатель и показывает в пустоту.. т.к. относительно ДЛЛ и ЕХЕ это разные адреса smile.gif Хотя, по идее, твой вариант должен работать как надо... я дома поднима куски длл-ки для шторма, там похоже было, гляну че и как smile.gif
Warship
Цитата(navy @ Jun 22 2010, 19:58) *

Хотя, по идее, твой вариант должен работать как надо... я дома поднима куски длл-ки для шторма, там похоже было, гляну че и как smile.gif

Ок, спасиб smile.gif

По ходу дела появились еще вопросы:
Например, мне нужно запихнуть определенный байт в буфер (void*, указатель на область памяти; я его юзаю вместо C-шарпового массива байт smile.gif).
Я делал так (не факт, что это вообще правильно; тут еще и сам буфер усекается до этой позиции)
Код
void* arrayPtr = NULL;
arrayPtr = BufferSet(arrayPtr, 0x01, 0);
arrayPtr = BufferSet(arrayPtr, 0xA0, 1);

// ...

/// Функция записывает в буфер указанный байт на указанную позицию.
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos)
{
    _buff = realloc(_buff, _pos + 2);
    
    ((unsigned char*) (_buff))[_pos] = _byte;
    ((unsigned char*) (_buff))[_pos + 1] = '\0';
    
    return _buff;
}

И здесь появляется непонятный мне момент - если не записывать завершающий нуль, то в буфере в конце оказывается какой-то мусор - откуда он?
Второй вопрос: как сделать, чтобы функция не возвращала указатель, а записывала все это дело в свой первый параметр? Т.е. по типу ref/out параметров в C#.

P.S. Спец. литературы по C++ мне сейчас читать особо не хочется, ибо пока-что освоение языка идет очень неспешно и больше с оглядкой на C#. Когда возьмусь более серьезно, наверное, буду укуриваться Бьерном Страуструпом и его книгой "Язык программирования C++" - судя по отзывам в инете, она лучшая.
navy
Цитата
тут еще и сам буфер усекается до этой позиции

естественно smile.gif ты же его релокейтишь как
Цитата
realloc(_buff, _pos + 2)

т.е. до размера pos+2
Цитата
если не записывать завершающий нуль, то в буфере в конце оказывается какой-то мусор - откуда он?

ты скорее всего неправильно указываешь размер буфера, т.е. делаешь его слишком большим, а следовательно хвост у тебя остается тем, что было в памяти уже до того, как ты сказал, что это будет массивом.
Это если я правильно помню все smile.gif
Warship
Цитата(navy @ Jun 24 2010, 02:02) *

естественно smile.gif ты же его релокейтишь как

Ну да, это понятно. Это у меня скорее такое рассуждение было smile.gif

Цитата(navy @ Jun 24 2010, 02:02) *

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

Да нет, размер я вроде указывал верный. smile.gif
Было вот так, пример:
Код
arrayPtr = NULL;
arrayPtr = BufferSet(arrayPtr, 0x01, 0);
arrayPtr = BufferSet(arrayPtr, 0xA0, 1);
printf("arrayPtr: %s.\n", (char*) arrayPtr); // Вывод - два мои байта + левый хвост из 10-12

/// Функция записывает в буфер указанный байт на указанную позицию.
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos)
{
    _buff = realloc(_buff, _pos + 1);
    
    ((unsigned char*) (_buff))[_pos] = _byte;
    
    return _buff;
}

Т.е. при первом вызове буфер резайзится до 1 байта и туда кладется 0x01, при втором вызове - 2 байта и 0xA0. Вродеб, все верно, но хвост есть.
navy
В общем, ты лучше озвучивай конкретный пример, потому как абстрактно думать трудно smile.gif байт в массив запихнуть можно значительно проще smile.gif
Warship
smile.gif

У меня глобальных задач не было smile.gif Для того, чтобы опробовать свои силы, захотелось перетащить реализацию алгоритма кодирования длин серий (RLE smile.gif) с C# на C++ в ДЛЛку. Ну вот и упражняюсь smile.gif

Если интересно, что получилось:
ДЛЛка:
Заголовок:
Код
#ifndef COMPRESS_H
#define COMPRESS_H

#define EXPORT extern "C" __declspec (dllexport)

EXPORT void* RLEEncode(const void* _data, const unsigned long _length);
EXPORT void* RLEDecode(const void* _data, const unsigned long _length);
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos);

#endif


Реализация:
Код
#include <windows.h>
#include "Compress.h"

/// Точка входа в DLL.
bool APIENTRY DllMain(HINSTANCE _instance, DWORD _reason, LPVOID _reserved)
{
    return true;
}

/// Функция производит сжатие указанных данных на основе алгоритма кодирования повторов.
EXPORT void* RLEEncode(const void* _data, const unsigned long _length)
{
    unsigned long curDataPos;
    unsigned long bufPos = 0;
    unsigned char count = 1;
    unsigned char curByte;
    unsigned char nextByte;
    void* retData = NULL;
    
    for(curDataPos = 0; curDataPos < _length; curDataPos++)
    {
        curByte = ((unsigned char*) _data)[curDataPos];
        nextByte = (curDataPos == _length - 1 ? ((unsigned char*) _data)[curDataPos - 1] : ((unsigned char*) _data)[curDataPos + 1]); // Если уже на границе массива, сравниваем с предыдущим
        
        if(curByte == nextByte && count < 255 && curDataPos < _length - 1)
        {
            count++;
        }
        else
        {
            retData = BufferSet(retData, count, bufPos++); // Длина повтора
            retData = BufferSet(retData, curByte, bufPos++); // Байт повтора
            count = 1;
        }
    }
    
    return retData;
}

/// Функция производит восстановление данных, сжатых на основе алгоритма кодирования повторов.
EXPORT void* RLEDecode(const void* _data, const unsigned long _length)
{
    unsigned long curDataPos;
    unsigned long bufPos = 0;
    unsigned char count;
    unsigned char curByte;
    void* retData = NULL;
    
    for(curDataPos = 0; curDataPos < _length; curDataPos += 2)
    {
        count = ((unsigned char*) _data)[curDataPos];
        curByte = ((unsigned char*) _data)[curDataPos + 1];
        
        while(count-- > 0)
        {
            retData = BufferSet(retData, curByte, bufPos++);
        }
    }
    
    return retData;
}

/// Функция записывает в буфер указанный байт на указанную позицию.
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos)
{
    _buff = realloc(_buff, _pos + 2);
    
    //if(_buff != NULL)
    //{
        ((unsigned char*) (_buff))[_pos] = _byte;
        ((unsigned char*) (_buff))[_pos + 1] = '\0';
    //}
    
    return _buff;
}


Приложение:
Реализация:
Код
#include <stdio.h>
#include <windows.h>

typedef void* (*RLEEncode)(const void* _data, const unsigned long _length);
typedef void* (*RLEDecode)(const void* _data, const unsigned long _length);

/// Точка входа в приложение.
int main(int argc, char* argv[])
{
    char* sTextToEncode = "AAABBCC";
    void* buffer;
    RLEEncode Encode;
    RLEDecode Decode;
    HINSTANCE compressDll = LoadLibrary("Compress.dll");
    
    if(compressDll == NULL)
    {
        printf("ERROR: unable to load DLL!\n");
        system("pause");
        return 1;
    }
    
    Encode = (RLEEncode) GetProcAddress(compressDll, "RLEEncode");
    Decode = (RLEDecode) GetProcAddress(compressDll, "RLEDecode");
    
    if(Encode == NULL || Decode == NULL)
    {
        printf("ERROR: unable to find DLL functions!\n");
        system("pause");
        return 1;
    }
    
    buffer = Encode(sTextToEncode, 7);
    printf("Encoded data: %s\n", (char*) buffer);
    
    buffer = Decode(buffer, 6);
    printf("Decoded data: %s\n", (char*) buffer);
    
    free(buffer);
    delete[] sTextToEncode;
    FreeLibrary(compressDll);
    
    system("pause");
    
    return 0;
}


Вот сейчас хочется переделать фукнции в ДЛЛке, чтобы они сразу писали в указанный буфер, а не возвращали указатель на новый, ибо память утекает при вызове buffer = Encode(buffer, ...); - указатель на прежний ведь теряется smile.gif

А как тут будет проще байт запихнуть-то? Можно, конечно, юзать STL класс vector (или stack smile.gif), но хотелось сделать это максимально "ручками" smile.gif

Собственно, тут есть еще одна проблема:
Как можно определить размер этого буффера? Сейчас у меня размер, который передается в функции кодирования, захардкоден, но этож не дело smile.gif
navy
Вообще использование стандартных классов это нормально, и даже правильно smile.gif ты же используешь например cout , вместо того, чтобы писать в консоль напрямую smile.gif
длина массива определяется как _msize(), в байтах. Для того, чтобы память не утекала можно использовать новый указатель, а старый освобождать.
Warship
Цитата(navy @ Jun 25 2010, 14:53) *

Вообще использование стандартных классов это нормально, и даже правильно smile.gif ты же используешь например cout , вместо того, чтобы писать в консоль напрямую smile.gif

Оно-то правильно, но это будет чуть позже smile.gif Сейчас хочется именно прочувствовать принципы работы, пусть даже и в стандартный поток вывода писать напрямую. smile.gif

У меня же тут вообще фактически велосипед получается smile.gif Т.е. дело вовсе не в результате, а в процессе - узнаю новое. А вот что не получается, то спрашиваю smile.gif

За _msize() спасиб, то, что нужно smile.gif
navy
Вообще, лучший способ изучить язык, это написать на нем что-то конкретное. Т.е. ставишь задачу, написать такую вот программу... и пишешь ее. Я так же изучал С#. Написал простую игру для тренировки памяти smile.gif Она конечно ужасна!! Но это мне сильно помогло smile.gif
Диман
Может посоветуйте книжку хорошую по C++. Желательно с уклоном в ООП.

Собственно только щас решил изучить С++, до этого работал со скриптами php javascript.
Просмотрел большое количество книг по C++ наиболее приглянулась -

Джес Либерти освой C++ за 24 часа.
обучение хорошее, но как дошло до конструктора в классах потерялся. Да и компилятор не всё выполняет , что в книге написано.

Есть ли книга, с пошаговым объяснением принципов ООП?

И есть ли книга, где обучение строится на создании одной какой нибудь программы, а не простых примерах?

Когда изучал php, обучение строилось в написании полноценного сайта, мне такой стиль удобней, чем обучение на мелких программках типа вычисли температуру в цельсиях или рассчитай возраст. smile.gif
Warship
Можно попробовать курнуть книжку Бьерна Страуструпа "Язык программирования C++" (писал где-то выше), точнее, ее вторую часть "Механизмы абстракции". Там около 200 листов, ООП вроде неплохо расписано.
Но в общем и целом мне эта книга не очень понравилась, хотя и она хороша. Много воды в ней, что-ли, да и просто объемная.

Вообще, принципы ООП везде ведь одни и теже - что в PHP, что в C++. Реализация только синтаксически отличается.
Ну а задачу... Ее можно и самому себе поставить, а не взять из книги wink.gif И так даже лучше будет, ИМХО, а потом уже, по ходу дела, в процессе реализации этой глобальной задачи искать ответы на более мелкие smile.gif

Я себе вообще отыскал книжку "C++ Cookbook", от О'Рейли smile.gif Она вот крута smile.gif
ALexusB
Книга "Совершенный код" С. Макконнелл - как настольная книга, к которой возвращаться и перечитывать - пофиг на каком языке - это просто, чтоб уметь программировать качественно, а не быть "быдло-кодером".

Книги издательства О"рейли - отличная подборка. Бери подходящие под себя (для начала, для потом, для оттачивания мастерства).
Диман
O'Reilly ни в ozon ни на торрентах не нашел, про C++ и C.
Есть подборки книг штук по 300, но все на английском.

Совершенный код - рановата еще.
Страуструпа попробую почитать.


И еще интересно, от компилятора многое зависит?
Щас использую visual C++ 10, еще есть Dev-C++.

Пока большой разницы не заметил, кроме отсутствия поддержки переменных на русском в Dev-C++.
Не получится так, что сменив компилятор, придется переучиваться под него?
ALexusB
Книжку "Совершенный код" никогда не бывает читать РАНО. Ее бывает читать ПОЗДНО (когда уже стиль не исправить).
Ее можно (и нужно) читать не всю, а как справочник по идеям, стилям и подходам. И перечитывать (дочитывать) через несколько лет.
Первые 2-3 главы там вообще нужно читать всем НЕкодерам, а кто им ТЗ ставит или работает в командах по изготовлению ПО.

Забавная недословная цитата из ДТФ постмортема одной игры
"А потом ведущий разработчик дочитал книжку Совершенный код, написал с нуля прототип за неделю и было принято решение выкинуть все, что делали до того целый год и начать заново в правильной архитектуре, что в итоге и привело к релизу и удобному редактору контента"

Сам я эту книжку прочел поздно (недавно только), но к счастью своему делал и без книжки все почти так же, то есть подтверждаю слова автора - это хорошие практики. Просто без опыта им сложно верить и выбрать свои (мне не все нужны), а все примерять на себе на практики просто сложно.
Диман
Цитата(ALexusB @ Sep 20 2010, 16:25) *

Книжку "Совершенный код" никогда не бывает читать РАНО. Ее бывает читать ПОЗДНО (когда уже стиль не исправить).
Ее можно (и нужно) читать не всю, а как справочник по идеям, стилям и подходам. И перечитывать (дочитывать) через несколько лет.
Первые 2-3 главы там вообще нужно читать всем НЕкодерам, а кто им ТЗ ставит или работает в командах по изготовлению ПО.


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

И в самой книжке например на стр 231 идет тест на знание типов данных, посмотрел знаю только 9-12 из 29. хотя о других типах имею представление, но никогда их не использовал. И автор сам пишет, мол поучись еще, а потом снова приходи.
navy
Разницы на каком языке писать нет вообще. На языках пишут кодеры, программисты пишут на любом, потому как программирование это не написание кода, а описание модели.
По поводу с++ берешь ЛЮБУЮ книжку... и начинаешь изучать... базовое, что ты из этого вынесешь как минимум знание типов и синтаксиса. А по ООП можно найти отдельную книжку.
И вообще, задач поставлена слишком абстрактно. Ты скажи что ты хочешь от С++ конкретно. Вот мы с Варшипом как-то поговорили на эту тему smile.gif Абстрактное знание тут невозможно. Ставь конкретные задачи, получишь конкретные ответы.
Warship
На деле кстати да, книга и не нужна вообще по конкретному языку smile.gif Понимание синтаксиса и типов (это ладна, можно из книги smile.gif) + наличие описания стандартной библиотеки (STL, для Visual C++ там будет еще ересь вроде MFC, для Борланда - VLC) + понимание программирования как процесса - это вот все вместе и позволит создавать любые по сложности системы.

Я так в свое время постигал AS 3.0. Была книжка от О'Рейли "CookBook" (с примерами, как готовить smile.gif) + описание библиотеки + примеры готового (и, конечно, хороший учитель smile.gif).
Диман
Цитата(navy @ Sep 21 2010, 07:41) *

Разницы на каком языке писать нет вообще. На языках пишут кодеры, программисты пишут на любом, потому как программирование это не написание кода, а описание модели.
По поводу с++ берешь ЛЮБУЮ книжку... и начинаешь изучать... базовое, что ты из этого вынесешь как минимум знание типов и синтаксиса. А по ООП можно найти отдельную книжку.
И вообще, задач поставлена слишком абстрактно. Ты скажи что ты хочешь от С++ конкретно. Вот мы с Варшипом как-то поговорили на эту тему smile.gif Абстрактное знание тут невозможно. Ставь конкретные задачи, получишь конкретные ответы.



Ну я уже синтаксис с типами данных подучил. И хотел получить что то типа лабораторных работ.

В книжке, что читал практики вообще не было.
Например там рассказано про конструктор и приведен пример
консруктор();
~деструктор();

И дальше примеры такие же, вызываю пустой конструктор. Но понять его смысл не могу. smile.gif

А я хочу найти что то типа вот такого курса http://www.intuit.ru/department/se/prmfcv/class/free/1/
Но не в visual C++ где уже готовые классы, а прописать всё это самостоятельно.
То есть книжку типа:
"Создадим полноценную программу с нуля."
Просмотрел уже книг 50, но там либо методики, либо описание основ.

А конкретно что хочется от C++
1) Создавать программы c GUI и понимать как устроен сам GUI.

2) Изучить win api.

Получается следует изучить библиотеку STL?
navy
Ну для примера можешь взять уроки тут
http://progs.biz/cpp/cpp01.aspx
Диман
Цитата(navy @ Sep 21 2010, 12:53) *

Ну для примера можешь взять уроки тут
http://progs.biz/cpp/cpp01.aspx


Во. Спасибо. Здесь по многим моментам языка есть.
Я вчера искал через поисковики, но подобных сайтов не встречал.
Warship
Конструктуры вызываются при создании экземпляра класса smile.gif
Деструктор - соответственно, при удалении.

Это ООП чистой воды, книгу нужно искать именно по ООП в таком случае.

Курс кстати по ссылке, с Интуита который, какой-то левый. Куча кода там и ненужного наследования и вообще сложно сделан простой пример smile.gif

===

Для построения интерфейса (причем, кросс-платформенного) на C++ используется Qt, попробуй покопать в сторону этой библиотеки, к ней море документации (хотя, сам я ее, либу, не юзал, ибо для меня C++ вообще не является основным направлением раскопок - так, побаловаться).

А вот ВинАПИ отношения к C++ не имеет вообще. ВинАПИ - интерфейс для программирования приложений под Windows, он предоставляется самой ОС.
Вызывать функции ВинАПИ можно вообще из любого приложения для Вин, на каком бы оно ни было написано языке.
Причем, в ВинАПИ как-раз и нужен только справочник (он есть в официальном толи Windows SDK, толи Platform SDK, точно уже не помню) с описанием всех функций.
GUI можно писать и с использованием WinAPI (где все контролы - окошки smile.gif), но это жуткий гемор и только для Вин.

===

Мдя, пока писал, тут оказываеццо такое обсуждение развернулось smile.gif
Диман
Цитата(Warship @ Sep 21 2010, 13:16) *


Для построения интерфейса (причем, кросс-платформенного) на C++ используется Qt, попробуй покопать в сторону этой библиотеки, к ней море документации (хотя, сам я ее, либу, не юзал, ибо для меня C++ вообще не является основным направлением раскопок - так, побаловаться).



Жаль я уже заказ в озоне сделал. sad.gif Там как раз есть книга про программирование GUI на Qt.
Ладно пока остановлюсь на задачках небольших.
Warship
Да не в книгах счастье wink.gif
Есть море документации открытой и в инете smile.gif
ugeen
Цитата(Warship @ Sep 21 2010, 13:16) *

Для построения интерфейса (причем, кросс-платформенного) на C++ используется Qt, попробуй покопать в сторону этой библиотеки, к ней море документации (хотя, сам я ее, либу, не юзал, ибо для меня C++ вообще не является основным направлением раскопок - так, побаловаться).

Использую Qt - правда не под Вин а под Линуксом (разработка онлайн-софта для Байкальского нейтринного телескопа - на Qt нарисован GUI для наших дежурных). Великолепная библиотека с кучей документации, примерами и инструментарием. Она богата по своим возможностям и достаточно проста в освоении - так что советую. Кроме того ее можно свободно скачать - ее лицензия это позволяет и она портирована под все популярные десктопные ОС.
Warship
Нувот smile.gif Значит либа и вправду крута, если используется для таких серьезных проектов.
ALexusB
По изучению со сквозным примером - пиши мини-игру или модель-игру

У меня была книжка в 90х годах по С++, где ООП объяснялся на модели животных в океане, на выходе там кто-то размножался, а кто-то кого-то ел.
Визуализации не было (но это как раз задачи по GUI)
То есть имеем
1. разобрать с ООП - базовые классы
2. Наследование в разные подвиды юнитов игры
3. Алгоритмы управление всем этим
4. Интерфейс отображения и ввода команд

Арт для такого не нужен - красные квадратики жрут синие - все наглядно smile.gif
navy
Qt библиотека хороша конечно.... но реально там тоже куча разных фейлов... Если кроссплатформенность важна, то да.. выбора особо нет. Если же не надо, то mfc получше будет.
Да и рановато учить С++ по Qt happy.gif
Serginio
Назрел вопрос специалистам 1С.

В пятницу пытался продолбить дырку в мощном черепе нашей программерши - бесполезно.
Пытался выдать ей ТЗ на разработку отчёта "Заявка поставщику" для актуализации остатков на период (А) с учётом нереализованного спроса за период (Б).
Она, вроде, баба неглупая, и те ТЗ, которые я сам понимаю - и следовательно могу написать - она выполняет.
А здесь затык получился, т.к. я не знаю как это можно корректно учесть.

У нас сейчас все отчёты по актуализации остатков предполагают субъективную оценку нереализованного спроса оператором (на уровне - в прошлый раз не хватило, значит, в этот раз нужно заказать больше). А на сколько больше - никто не понимает - вдвое, в 10 раз, или всего на пару единиц.

Есть отчёт, который учитывает неотгруженные резервы в Счетах, но я его забраковал, т.к. он задваивает-затраивает потребность. И вот пытаюсь объяснить ей, что эти Счета должны иметь ограниченный срок жизни, она мне аргументирует, что к ним прикреплены расходные, поэтому так делать нельзя. На деле - всё сходится, а ребёнок не наш.

Короче - вопрос, есть ли что-то подобное в анналах 1С версии 7.7, и как этот "нереализованный спрос" корректно учесть?
ALexusB
Лучше серчить на спец форумах, где могут гулять как готовые отчеты, так и философские рассуждения по теме.

Конфигурация хоть какая? 1С 7.7 - это ж уже рудимент. И это явно не бухгалтерия, а скорее Торговля и склад, судя из ТЗ.

Сча занимаюсь 1С 8.2 на нем есть управление торговлей 10 и 11, по 7.7 не отвечу.

При любом раскладе, задача имхо решабельна если:
1. есть инфа, что продали
2. есть инфа, что не продали, но хотели купить - это если заказы делаются даже, когда чего-то нет, чтоб была история обращений на конкретный товар.
3. если п2 нет, то его нужно считать исходя из скорости ухода товара по п1 и эмулировать этот спрос на оставшееся время с неким коэфф. Но тут все сильно зависит от рода товара и клиентов - сработает только на рознице. Если это продаже пусковых установок вряд ли линейный анализ спроса будет верен.

Сам недавно задумывался, посетив магазинчик в 19.00 (магаз до 21) и на вопрос "а это есть - нет, разобрали еще днем" подумал, что вот им нужно записывать такое и таки дозаказывать это от спроса, либо в центр офисе по базе определять, тк продавщицы ответили "нам что привозят, то и продаем" - по сути совковый подход, но с рыночной улыбкой на лице и сожалением в глазах.

И вот как определять?
п1 - п3 и описал свои идеи быстрые.
Serginio
Цитата(ALexusB @ May 19 2013, 21:43) *
Лучше серчить на спец форумах, где могут гулять как готовые отчеты, так и философские рассуждения по теме.
2. есть инфа, что не продали, но хотели купить - это если заказы делаются даже, когда чего-то нет, чтоб была история обращений на конкретный товар.
По спецфорумам понял.
П 2 учитывается, он в Счёт вбивается независимо от наличия и количества остатков, но обработать эти цифры корректно моя мадама не может.

Не розница, и не пусковые установки - обои опт.
Конкуренция большая, если сегодня не удовлетворили мы, то послезавтра оно уже не нужно - у других купили. Т.е. опасность опоздать и остаться с невостребованными позициями на складе.
Но, главное - как корректно учитывать этот счёт в разрезе периода, может быть счета, выписанные на одинакового контрагента плюсовать с поглощением?!!
О-о, завтра попробую пропихнуть.

ALexusB
Та по реализации отчета могут быть проблемы - не все валится в регистр, а что-то так и висит открытое в документе.
Нужно отчетом лазать по строкам документа или дописать проведение его в свой регистр (того, что не было) - так или иначе отчетом наковырять можно, но не так просто, как вывести запасы или оборотку по складу.
Serginio
Мужики, ещё вопрос возник по знатокам Экселя.

Знаю, что такая байда есть, но найти не могу (не понимаю где искать - не изучать же весь справочник формул).
Короче, есть 2 базы данных, нужно их совместить. Примерно так

База 1:
А - 1
В - 5
С - 2

База 2:
А - 4
С - 6
Е - 7

Нужно, чтоб получилось конкретно это:
А - 1 - 4
В - 5 - 0
С - 2 - 6
Е - 0 - 7

Кто в курсе, как эта функция называется, и как она работает?
ALexusB
функция ВПР

там натравливаешь ячейку ключ первой таблицы на таблицу 2 (на соседнем листе или в отдельном файле), главное, чтоб ключ был именно в первом столбце, далее номер столбца со значением и , ЛОЖЬ
без последнего будет хрень.
Почитай хелп про функцию и в гугле примеры
Для горизонталей есть ВП... и др буква, не помню.

А не... пример еще раз глянул...
ВПР подбирает по значению из ключа таблицы 1 поля таблицы 2, но не клеит все в кучу

Чтоб получить то, что у тебя нужно две таблицы склеить в одну друг под другом
и натравить на это сводную таблицу в две колонки (без перетягивая в горизонталь и значения поля, только три поля в левую секцию отборов)
Тогда сводная все сама тебе склеит и выведет без пересечений

Хотя мож есть и какие-то спец функции....

Можно ВПР друг на друга сделать, если сводная не поможет - и потом уже клеить и свод делать.

А вообще, чтоб не взрывать мозг - вот ехеля со сводом

прям как в примере не получилось, получилось в две строчки, но понять можно
Serginio
Цитата(ALexusB @ May 29 2013, 21:59) *
прям как в примере не получилось, получилось в две строчки, но понять можно
В сам ВПР ещё не лазил, но результат, что в экселе, не годится.
Там по 2 строки, а если совмещать 3 базы, то будет и по 3 строки.
И совершенно не нашёл, как этим сводом управлять (нигде не вижу формул или условий).
unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.