Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Часть 2. Я начинающий, подскажите как...(Все вопросы начинающих!!!)

51K
05 июля 2009 года
Олориин
1 / / 05.07.2009
День добрый вопрос такой: в ListBox создал 3 столбца
ListBox1->Columns=3;
каким образом записать строку в второй и третий столбцы?

1636 ответов / показаны 121 - 159

Страницы:
52K
15 августа 2009 года
Morgant
5 / / 15.08.2009
Вем привет у меня вопрос. Я написал код:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <stdlib.h>

using namespace std;

void error (const char * message)
{
cerr<<'\n'<<message<<'\n';
exit(1);
}

int main (int argc, char *argv[]){
char fileName[32];
char buf[64];
ifstream in;
ofstream out;

in.open("C:\\1.txt");
if(!in.good()) error("can't open file for reading.");
in.getline(buf, sizeof(buf));
for(int i=2; i <= 5; i++){
sprintf(fileName,"c:\\%d.txt",i);
out.open(fileName);
if(!out.good()) error("can't open file for writing.");
out << "hi " << buf << endl;
out.close();
system (fileName,"notepad c:\\%d.txt",i);
}
in.close();
return 0;
}

эта прога должна копирывать файл 1.txt 4 раза и каждый новый файл на зывать по разному и после создания открывать его. Подскажите в чём проблема.

Как правильно написать system (); в моём коде.
297
15 августа 2009 года
koodeer
1.2K / / 02.05.2009
2 Luzerka:
Образно говоря, ключевое слово typedef позволяет вводить синонимы имещихся типов данных. Например, строка
 
Код:
typedef short myType
вводит синоним для типа short. Теперь в коде можно использовать тип myType.
 
Код:
myType x;
x = 10;
Если позже понадобится работать с большими значениями, которые не умещаются в short, достаточно будет изменить одну строку:
 
Код:
typedef int myType; // было typedef short myType;
а остальной код переделывать не понадобится.

Аналогично со структурами. Структура объвляется так:
 
Код:
struct st { };
после чего можно создавать экземпляры такой структуры. А с помощью typedef можно создать синоним для нового типа st, в чём нет особого смысла.

ЗЫ: особо отмечу, что для создания "управляемых" структур следует объявлять их с ключевым словом ref
 
Код:
ref struct rst { };
12K
15 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: Morgant
Как правильно написать system (); в моём коде.


Читайте здесь описание функции system (и вообще - используйте сначала справочник функций перед тем как задавать по ним вопросы).
На той странице смотрим прототип функции:

 
Код:
int system(char *string);

Подумайте - сколько аргументов и какого типа аргументы должна иметь функция при корректном вызове, и сравните с тем как она вызывается у вас (должно стать понятно что не так):
 
Код:
system (fileName,"notepad c:\\%d.txt",i);
9
15 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Luzerka
Кажется понял. разница в том, что в первом случаи объект как бы статический. если не прав поправте)


Не прав.
Без лишних слов: формат [FONT="Courier New"]typedef struct[/FONT] используется в языке С. Наиболее часто применяется в конструкциях вида:

Код:
#include <stdio.h>

typedef struct node_t
{
    int data;

    struct node_t* prev;
    struct node_t* next;
} node_t;

int main()
{
    node_t node1, node2, node3;

    node1.data = 1;
    node1.prev = NULL;
    node1.next = &node2;

    node2.data = 2;
    node2.prev = &node1;
    node2.next = &node3;

    node3.data = 3;
    node3.prev = &node2;
    node3.next = NULL;

    printf( "node1.data = %d, node1.data = %d, node1.data = %d\n",
    node1.data, node2.data, node3.data );

    printf( "node1.next->data = %d, node3.prev->data = %d\n",
    node1.next->data, node3.prev->data );

    return 0;
}

В языке С++ это теряет смысл. Т.е. думаю, понятно. А вообще, K&R - в руки. Так же, описано в стандартах 89, 95 и 99 года.
43K
15 августа 2009 года
breeve
54 / / 05.06.2009
это опять я. :D такой вопрос. как мне считать клавишу с клавиатуры? Надо сделать так чтобы если я нажал определенную клавишу он мне выдавал ее значение. можно ли так сделать чтобы заранее не вбивать туда коды клавиш? если да, то и как?
52K
16 августа 2009 года
Morgant
5 / / 15.08.2009
Ну так как правильно писать в моём случае подскажите пожалуйста
52K
16 августа 2009 года
Morgant
5 / / 15.08.2009
system()
12K
16 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: Ghox
На той странице смотрим прототип функции:
 
Код:
int system(char *string);



Цитата: Morgant
Ну так как правильно писать в моём случае подскажите пожалуйста



Вы пытаетесь вызывать данную функцию аналогично sprintf, ожидая что в ней будут произведены необходимые подстановки, что неправильно, т.к. этого в функции system не предусмотрено. Аргументом функции system должен быть char-овский массив, содержащий уже сформированный текст команды, которую нужно выполнить. В вашем случае, я так полагаю, должно быть что-то вроде такого:

 
Код:
char cmdText[32];
  sprintf(cmdText, /* здесь поместите нужные вам спецификацию и данные ввода*/);
  system(cmdText);
51K
16 августа 2009 года
Luzerka
7 / / 12.08.2009
Lerkin, ничего кроме информации о STALKER по запросу K&R не нашел. Уточните пожалуйста, что это значит)
З.Ы: int *x;
x и &x имеют разные значения, неужели потому, что x - адрес указателя, а &x -адрес на указатель ?:)
9
16 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Luzerka
Lerkin, ничего кроме информации о STALKER по запросу K&R не нашел. Уточните пожалуйста, что это значит)


Если на игровом форуме искать, то да, конечно. А если у гугля спросить, то будет информация несколько иного плана. Прямо с первой ссылки.

Цитата: Luzerka

З.Ы: int *x;
x и &x имеют разные значения, неужели потому, что x - адрес указателя, а &x -адрес на указатель ?:)


А на этот вопрос, вам прекрасно ответит практически любой учебник C\C++. Добавлю, что С++ не оперирует понятием адрес.

P.S. Это, конечно, топик для начинающих. Но именно к начинающим, в первую очередь направлено послание RTFM.

2.1K
16 августа 2009 года
Norgat
452 / / 12.08.2009
Цитата: Luzerka
добрый день. а скажите в чем разница, сам хоть и прочитал эту разницу, но не врубился в смысл оной)
объявление структур typedef struct { } st; и struct st{};
последний вариант позволяет создавать ссылки на себя самих(для рекурсии) а вот какое принципиальное отличие в спецификаторе typedef кроме как расположения его после фигурак - не врубаюсь хоть убейте)



Купи себе книжку Шилдта Справочник программиста С\С++, тогда такие вопросы отпадут оч. быстро).

про typedef:

typedef позволяет определить новое имя для уже существующего типа данных:

Цитата:
typedef спецификатор_типа новое_имя;




в C++ его обычно применяют, когда определение типа становиться слишком длинным(например в работе с STL).

как пример...

есть у меня тип vector<Book>::interator, но в коде мне лень лишний раз так писать)) или хочется большей читабельности кода.

поэтому я могу сделать так:

typedef vector<Book>::interator page;

И дальше в коде вместо vector<Book>::iterator писать просто page. Надеюсь понятно написал.

12K
16 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: breeve
это опять я. :D такой вопрос. как мне считать клавишу с клавиатуры? Надо сделать так чтобы если я нажал определенную клавишу он мне выдавал ее значение. можно ли так сделать чтобы заранее не вбивать туда коды клавиш? если да, то и как?


Если я вас правильно понял и вам нужна выдача скан-кода нажатой клавиши на экран, то можно, например, так:

 
Код:
cout << int(getch()) << endl;
43K
16 августа 2009 года
breeve
54 / / 05.06.2009
Цитата: Ghox
Если я вас правильно понял и вам нужна выдача скан-кода нажатой клавиши на экран, то можно, например, так:
 
Код:
cout << int(getch()) << endl;



если быть точным то вот так

 
Код:
cout << (int(getch())) <<endl;

по другому не работало.
а можно как нибудь с cin.get'ом?
заранее благодарен
2.1K
16 августа 2009 года
Norgat
452 / / 12.08.2009
2breve

если числовой код, то:

Цитата:
#include <iostream>
#include <conio.h>

using namespace std;


void main()
{
int a = int(_getch());
cout << "a= " << a << endl;
_getch();
}



вполне работает=)

или:

Цитата:
char a = char(_getch());



это если char надо получить

п.с.

Цитата:
1>.\getch_test.cpp(9) : warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.



поэтому юзаю _getch() =)

43K
16 августа 2009 года
breeve
54 / / 05.06.2009
мне интересно можно ли сделать так чтобы он считывал клавишу не прямо а как бы косвенно чтоли. т.е допустим есть строка А. мы ее считываем с клавиатуры. и если во время того как вводите слово вы нажмете esc, то прекратится ввод и выскочит сообщения "вы нажали esc". getch'ем я думаю так не получиться.
2.1K
16 августа 2009 года
Norgat
452 / / 12.08.2009
значиться так... нашёл как обрабатывать нажатия системных клавишь с помощью _getch()

Цитата:
char a = _getch();
if(a == 0 || a == 0xE0) a = _getch();



если _getch() вернула 0 или 0xE0, то была нажата системная клавиша и для получения её кода надо вызвать _getch() ещё раз))

опытным путём получено, что код Esc равен 27=)

п.с. тесты показали...

для того, чтобы обработать нажатие Esc достаточно вставить проверку if(a == 27), т.е. нету возврата 0 или 0xE0
*имхо удобно считывать код в int, проводить проверку, а потом, если надо, переводить в char

для обработки нажатий F1-F10 нужно использовать проверку if(a == 0), т.к. сначала они возвращают 0, через _getch() и чтобы получить какая из них нажата, нужно ещё раз вызвать _getch(), а потом уже свой код.

0xE0 т.е. 224 в десятичной системе возвращается при нажатии на F11,F12,Insert, Delete и т.п., при повторном вызове _getch() выдаст соотв. код конкретной клавиши.

вот код, поиграйся вообщем)

Код:
#include <iostream>
#include <conio.h>

using namespace std;


void main()
{
    int a = _getch();
    while(1)
    {
        if(a == 27)
        {
            cout << "Down " << char(a) << ", code: " << a << endl;
            cout << "The End\n";
            _getch();
            return;
        }
        cout << "Down " << char(a) << ", code: " << a << endl;
        a = _getch();
    }
}
43K
17 августа 2009 года
breeve
54 / / 05.06.2009
Цитата: Norgat
значиться так... нашёл как обрабатывать нажатия системных клавишь с помощью _getch()



если _getch() вернула 0 или 0xE0, то была нажата системная клавиша и для получения её кода надо вызвать _getch() ещё раз))

опытным путём получено, что код Esc равен 27=)

п.с. тесты показали...

для того, чтобы обработать нажатие Esc достаточно вставить проверку if(a == 27), т.е. нету возврата 0 или 0xE0
*имхо удобно считывать код в int, проводить проверку, а потом, если надо, переводить в char

для обработки нажатий F1-F10 нужно использовать проверку if(a == 0), т.к. сначала они возвращают 0, через _getch() и чтобы получить какая из них нажата, нужно ещё раз вызвать _getch(), а потом уже свой код.

0xE0 т.е. 224 в десятичной системе возвращается при нажатии на F11,F12,Insert, Delete и т.п., при повторном вызове _getch() выдаст соотв. код конкретной клавиши.

вот код, поиграйся вообщем)



я конечно поигрался с этим делом. но мне надо не много другое.
допустим простейшая прога:

{
int a;
cout << "Загадай число.\n";
cin >> a;
. . .
. . .
}

вас просят что-то ввести. и как сделать так чтобы он считывал клавишу в момент ввода числа или строки. т.е если во время ввода числа вы ничего не напишите а нажмете esc - он вам выдает что-то вроде отмена ввода. как так сделать?

2.1K
17 августа 2009 года
Norgat
452 / / 12.08.2009
Цитата: breeve
я конечно поигрался с этим делом. но мне надо не много другое.
допустим простейшая прога:

{
int a;
cout << "Загадай число.\n";
cin >> a;
. . .
. . .
}

вас просят что-то ввести. и как сделать так чтобы он считывал клавишу в момент ввода числа или строки. т.е если во время ввода числа вы ничего не напишите а нажмете esc - он вам выдает что-то вроде отмена ввода. как так сделать?



примерно так(заюзал string, т.к. лень было думать над длиной числа и выделяемой для него строки соотв.):


Код:
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;


void main()
{
    char a = _getch();
    string s;
    while(1)
    {
        if(a == 27)
        {
            cout << "Down " << char(a) << ", code: " << a << endl;
            cout << "end...\n";
            _getch();
            break;
        }
        cout << "Down " << char(a) << ", code: " << a << endl;
        s += a;
        a = _getch();
    }
    cout << atoi(s.c_str()) << endl;
    _getch();
}



тут нажатие Esc служит завершением ввода=)
45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Добрый вечер.
При работе с указателями возникли проблемки в понимании языка:

1. Почему отличаются
 
Код:
*(pointer+=1)
и
 
Код:
*(pointer++)
?
2. Почему участки кода
 
Код:
while(*pointer)  
   cout << *pointer++;

в котором теоретически выполняется pointer++, а затем возвращается значение, находящееся по адресу и
 
Код:
while(*pointer) {
   cout<<*pointer;
   pointer++;
}

в котором сначала вывод, а зачем уже увеличение адреса, идентичны?
2.1K
17 августа 2009 года
Norgat
452 / / 12.08.2009
Цитата: Johnnybg
Добрый вечер.
При работе с указателями возникли проблемки в понимании языка:

1. Почему отличаются
 
Код:
*(pointer+=1)
и
 
Код:
*(pointer++)
?



всё дело в том, что когда ты используешь постфиксное инкрементирование, т.е. p++, что инкрементирование происходит после того, как указатель будет разыменован и содержимое памяти, по хранящемуся там адресу, будет выведено на экран(в общем случае после того, как будут произведены какие либо внешние действия над инкрементируемым объектом).

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

* оператор += работает в твоём случае как префиксное инкрементирование.

думаю из этого тебе будет легко понять, почему циклы эквивалентны.


эх... где то в локалке нашего универа видел статейку про инкрементированию и декрементированию, но прочитав себе не сохранил=(

9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Johnnybg
Добрый вечер.
При работе с указателями возникли проблемки в понимании языка...


Добавить можно, разве что наглядные примеры:

 
Код:
*(ptr++);  // постфиксная форма: получаем значение, потом инкремент
*(++ptr);  // префиксная форма: инкремент, потом получаем значение

Для разминки: попробуй сказать, что происходит в следующей конструкции:
 
Код:
char *pa, *pb;

    ...

    while (*pb++ = *pa++);
45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Norgat, то есть скобки не помогут в этом случае?
а насчет второго вопроса, то там в коде:
 
Код:
while(*pointer)  
   cout << *pointer++;

как раз ++ должен выполняться раньше, чем *, т.к. приоритет операций одинаков, но ++ находится справа (ассоциативность).
297
17 августа 2009 года
koodeer
1.2K / / 02.05.2009
2 Johnnybg
Небольшой кусочек кода для понимания работы с указателями:
Код:
#include <iostream>
using namespace std;

void main()
{
    int x[] = { 1,2,3,4,5,0 };

    int *p1 = x;
    while (*p1)
        cout << *p1++ << " ";
    cout << endl;

    int *p2 = x;
    while (*p2) {
        cout << *p2 << " ";
        p2++;
    }
    cout << endl;

    int *p3 = x;
    while (*p3)
        cout << *++p3 << " ";
    cout << endl;

    int *p4 = x;
    while (*p4) {
        *p4++;
        cout << *p4 << " ";
    }
    cout << endl;

    int *p5 = x;
    while (*p5)
        cout << *(p5+=1) << " ";
    cout << endl;
}
2.1K
17 августа 2009 года
Norgat
452 / / 12.08.2009
2Johnnybg операции инкремента\декремента работают немного по другому...

грубо говоря в префиксной форме сначала выполниться инкрементирование, а потом другие операции,а в постфиксной сначала операции, а потом инкрементирование.

вот примерчик с обычными числами:

Код:
#include <iostream>
#include <conio.h>

using namespace std;

void main()
{
    int i = 5;

    int a = (++i) + (++i);
    i = 5;
    int b = (i++) + (i++);

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
        cout << "i = " << i << endl;
    _getch();
}


Цитата:
a = 14
b = 10
i = 7



п.с. а вообще имхо использование конструкций типа *(p++) или *(++p) некрасиво и снижат понимаемость кода. я придпочитаю разыменовывание отдельно, инкрементирование отдельно делать.

или использовать смещение в выводе: *(p + i)//где i - целое число

45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Lerkin

 
Код:
char *pa, *pb;

    ...

    while (*pb++ = *pa++);

Здесь производится разыменование pa и pb, потом компилятор пытается присвоить друг другу числа, это приводит к необработанному исключению.

Norgat

Спасибо, теперь первый мой вопрос отпадает, это понял.
Насчет второго еще не все ясно. А именно касательно этого кода:
 
Код:
cout << *pointer++;

Я читаю книгу "ООП в c++" Лафоре и он как раз рассматривает этот случай:
Цитата:

Как компилятор интерпретирует *p++: как *(p++), что нам и нужно или как (*p)++? Здесь * и ++ имеют одинаковый приоритет. Операции одинакового приоритета различаются ассоциативностью. Унарные операции * и ++ имеют правую ассоциативность, таким образом, сначала увеличивается указатель, а затем к результату применяется операция разыменования.


т.е. он имеет ввиду, что сначал постфиксная операция ++, а потом префиксная *. это и не понятно..

9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Johnnybg
Lerkin

 
Код:
char *pa, *pb;

    ...

    while (*pb++ = *pa++);

Здесь производится разыменование pa и pb, потом компилятор пытается присвоить друг другу числа, это приводит к необработанному исключению.


Ух ты. :D Нихрена себе. Я (да и не только я) всегда был уверен, что это простое копирование C-style строки. Чем и пользовался лет 15...

45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Lerkin, да, я понял) но у меня почему-то все равно вылезает необработанное исключение.
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Johnnybg
Lerkin, да, я понял) но у меня почему-то все равно вылезает необработанное исключение.


Дык, переменные не инициализированные.

45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Да я инициализировал. И строки одинаковой длины. Все равно.
9
17 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Johnnybg
Да я инициализировал. И строки одинаковой длины. Все равно.


Ну, сверкани.

45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
вот:
Код:
#include <iostream.h>

using namespace std;

int main()
{
    char* pa = "f\0";
    char* pb = "d\0";
    while (*pb++ = *pa++);
    return 0;
}
2.1K
17 августа 2009 года
Norgat
452 / / 12.08.2009
2Johnnybg Лафоре не читал...

незнаю уж какого там года Лафоре твой... но сейчас специально поскал описание опереций ++ и -- в Павловской издания 2009 года.

там на стр. 33 чёрным по белому написано тоже самое, что и я тебе написал)
да и работа кода говорит сама за себя;)

п.с. а смысл браться за ООП, если у тебя траблы с указателями? может стоит сначала прочитать какой-нибудь классический учебник по С/С++? типа Подбельского или Павловской?
45K
17 августа 2009 года
Johnnybg
9 / / 02.03.2009
Да здесь я просто думал, что 1) скобки заставят постфиксную ++ выполниться первой, оказалось, что это не так; 2) меня смутила ассоциативность. А в остальном просто практики мало, отсюда такие вопросы. ООП уже изучал, в том числе C# по Ватсону. Подбельского читал. Просто забывается что-то + сказывается то, что читал отрывками. Поэтому и решил от и до прочитать Лафоре, а потом уже дальше.
297
17 августа 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: Johnnybg
вот:
Код:
#include <iostream.h>

using namespace std;

int main()
{
    char* pa = "f\0";
    char* pb = "d\0";
    while (*pb++ = *pa++);
    return 0;
}


Оба указателся в этом примере указывают на константные строки, поэтому при попытке присваивания *pb=... происходит исключение.
Нужно сделать что-то вроде:

 
Код:
char* pb = new char[10]; // выделяем нужное кол-во памяти

и всё работает.
9
18 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Norgat

незнаю уж какого там года Лафоре твой... но сейчас специально поскал описание опереций ++ и -- в Павловской издания 2009 года.


Вы полагаете, что поведение данных операторов меняется ежегодно?

Цитата: Norgat

может стоит сначала прочитать какой-нибудь классический учебник по С/С++? типа Подбельского или Павловской?


Да уж, Подбельский и Павловская - воистину классика жанра. Не чета всяким Лафоре, Майерсам, и прочим Страуструпам.

38K
18 августа 2009 года
kd0x13
38 / / 26.04.2009
здравствуйе, напишу сюда, так как чувствую что ошибка в какой-нибудь глупости, которую я упустил. Проблемма с подключением библиотеки(lib)
код:
mdll.h
Код:
#ifndef _MDLL_H_
#define _MDLL_H_

#include <iostream>
#include <stdio.h>
#include <windows.h>

using std::cout;
using std::endl;

extern "C" __declspec(dllexport) void NumberList();
extern "C" __declspec(dllexport) void LetterList();

#endif


mdll.cpp
Код:
#include "mdll.h"

#define MAXMODULE 50

char module[MAXMODULE];

extern "C" __declspec(dllexport) void NumberList() {
    GetModuleFileName(NULL, (LPWCH)module, MAXMODULE);
    cout << "This function eas called from " << module << endl;
    cout << "NumberList: ";
    for(int i = 0; i < 10; i++)
        cout << i+1 << " ";
    cout << endl << endl;
}

extern "C" __declspec(dllexport) void LetterList() {
    GetModuleFileName(NULL, (LPWCH)module, MAXMODULE);
    cout << "This function eas called from " << module << endl;
    cout << "NumberList: ";
    for(int i = 0; i < 26; i++)
        cout << char(i+97) << " ";
    cout << endl;
}


код в проекте, где используется эта библиотека
dllprj.h
 
Код:
#ifndef _DLLPRJ_H_
#define _DLLPRJ_H_

#pragma comment(lib, "mdll.lib")
#include "mdll.h"

#endif

dllprj.cpp
 
Код:
#include "dllprj.h"

void main() {
    NumberList();
    LetterList();
}

ошибки:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>E:\...\Visual Studio 2008\Projects\dllprj\Debug\dllprj.exe : fatal error LNK1120: 1 unresolved externals

там что то с функцией main? помогите понять.
38K
18 августа 2009 года
kd0x13
38 / / 26.04.2009
*в консольном приложении все работает отлично, а как это включить в win32 приложение?
9
18 августа 2009 года
Lerkin
3.0K / / 25.03.2003
А если так попробовать?
Цитата: kd0x13

dllprj.cpp
 
Код:
#include <windows.h>
#include "dllprj.h"

void main() {
    NumberList();
    LetterList();
}

38K
18 августа 2009 года
kd0x13
38 / / 26.04.2009
неа, да и windows.h и так в mdll.h инклюдится. там вроде как несовместимость 16 расрядной функции main с 32 разрядной?
38K
18 августа 2009 года
kd0x13
38 / / 26.04.2009
и еще одна проблемма, как в win32 так и в консоли

Код:
#include "dllprj.h"

typedef void (WINAPI *cfunc)();

cfunc NumberList();
cfunc LetterList();

#define MAXMODULE 50

void main() {
    HINSTANCE hLib = LoadLibrary((LPCWSTR)"mdll.dll");
    if(hLib == NULL) {
        cout << "Unabte to load DLL" << endl;
        getch();
        return;
    }

    char mod[MAXMODULE];

    GetModuleFileName((HMODULE)hLib, (LPWCH)mod, MAXMODULE);
    cout << "Module loaded: " << mod << endl;
    NumberList = (cfunc)GetProcAddress(hLib, "NumberList");
    LetterList = (cfunc)GetProcAddress(hLib, "LetterList");

    if(NumberList == NULL || LetterList == NULL) {
        cout << "Unable to load function(s)" << endl;
        getch();
        return;
    }
    NumberList();
    LetterList();
    FreeLibrary(hLib);
    getch();
}

ошибки:
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(5) : error C2556: 'cfunc NumberList(void)' : overloaded function differs only by return type from 'void NumberList(void)'
1> e:\...\visual studio 2008\projects\dlprj\mdll.h(11) : see declaration of 'NumberList'
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(5) : error C2373: 'NumberList' : redefinition; different type modifiers
1> e:\...\visual studio 2008\projects\dlprj\mdll.h(11) : see declaration of 'NumberList'
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(6) : error C2556: 'cfunc LetterList(void)' : overloaded function differs only by return type from 'void LetterList(void)'
1> e:\...\visual studio 2008\projects\dlprj\mdll.h(12) : see declaration of 'LetterList'
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(6) : error C2373: 'LetterList' : redefinition; different type modifiers
1> e:\...\visual studio 2008\projects\dlprj\mdll.h(12) : see declaration of 'LetterList'
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(14) : error C3861: 'getch': identifier not found
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(27) : error C3861: 'getch': identifier not found
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(30) : error C3861: 'NumberList': identifier not found
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(31) : error C3861: 'LetterList': identifier not found
1>e:\...\visual studio 2008\projects\dlprj\dlprj.cpp(33) : error C3861: 'getch': identifier not found

чувствую что глупость какая-то, но найти немогу..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог