Форум программистов, компьютерный форум, киберфорум
Наши страницы

Как генерировать исключения? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как пользоваться драйверами устройств http://www.cyberforum.ru/cpp-beginners/thread1736.html
Помогите , как пользоваться драйверами устройств. Ну например управлять сканером через его драйвер.
C++ Оптимизация Что значит "скомпилировать программу с оптимизацией по скорости"? Как это можно осуществить? http://www.cyberforum.ru/cpp-beginners/thread1724.html
Как сделать приложение службой? C++
Я только начинаю програмировать. Поэтому может мой вопрос глупый, но... Я сделал в консоли программу, она работает до бесконечности, т.е. пока не закрою... Как мне её сделать службой, закрывать её...
C++ Нахождение максимального элемента матрицы, минимального, суммы, произведения
пожалуйста помогите написать программу обработки двухмерных массивов (нахождение максимального элемента ,минимального ,суммы,произведения)
C++ Производительность микропроцессоров персональных компютеров http://www.cyberforum.ru/cpp-beginners/thread1715.html
Буду очень признателен за любую информацию о производительности (числе операций в секунду - флопсах) для микропроцессоров персональных (бытовых) компютеров.
C++ Как указать в коде пути к файлам, чтобы не вводить из при запуске? Данная программа сравнивает файлы, вопрос такой: данная программа запускается с помощью консоли, чтоб запустить надо ввести в консоли <имя проги> <имя файла1> <имя файла 2>(enter)....как указать в... подробнее

Показать сообщение отдельно
Александр Ключников
0 / 0 / 0
Регистрация: 18.04.2007
Сообщений: 64
08.05.2007, 12:18
Цитата Сообщение от MadDog_ Посмотреть сообщение
Как сгенерировать исключение.
Как выход индекса за пределы допустимого диапозона.
Изучаю API
1. Ну, вот тебе простенький пример кода, использующего исключения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#include "TestExtStPr.h"
 
#define XP_NOERROR      0
#define XP_ERROR        1
 
#define MAX_SERVER_ERROR 20000
#define XP_HELLO_ERROR MAX_SERVER_ERROR+1
 
 
 
 
 
/*--------------------------------------------------------------------------xp_TestProc
Exported function - extended stored procedure for SQL server.
 
Parameters:
#1 (int)
#2 (varchar) - token for to bind to existing connection
*/
 
SRVRETCODE xp_TestProc(SRV_PROC *pSrvProc)
{
/* Hangs!
    MessageBox(NULL,"Extended Stored Procedure \n \"xp_TestProc\" \n is called.",
        "Test Extended Stored Procedure",MB_OK);
*/
 
SRVRETCODE RetCode = XP_NOERROR;
char sMsg[1024];
int iCol;           
int iParamNumber;
 
try {
 
    MessageBeep(MB_ICONASTERISK);
    SendMsg(pSrvProc, "xp_TestProc: Started.");
 
  //Use srv_rpcparams to check number of parameters.
    //NB! Parameters must be passed by position, not by names!
    if(srv_rpcparams(pSrvProc) != 2) throw XP_ERRORPARAMQUANTITY;
        
    // Check data types. Throw error if wrong type.
  CheckParamType(pSrvProc,iParamNumber=1,SRVINTN);  
    CheckParamType(pSrvProc,iParamNumber=2,SRVBIGVARCHAR);
 
    LPVOID pArg1 = srv_paramdata(pSrvProc, 1);
    int iArg1 = 0;
    if(pArg1) iArg1 = *((LPINT)(pArg1));
  SendMsg(pSrvProc, "xp_TestProc: 1st argument is %d", iArg1);
 
    char * sToken = PCHAR(srv_paramdata(pSrvProc, 2));
    int iLen = srv_paramlen(pSrvProc, 2);
  SendMsg(pSrvProc, "xp_TestProc: 2nd argument (Token) is %.*s", iLen, sToken);
 
    
  DBPROCESS*  dbproc;         // DBPROCESS handle for the new connection
  LOGINREC*   loginrec;
  char        szBindToken[MAX_BINDTOKEN];
  short       nCols;            // Data columns returned     
  DBINT       nRowsFetched;     // Number of rows sent       
  int         bImpersonated;
  RETCODE     rc;             // Value returned from DB-Library calls      
 
 
 
 
  // Get a loginrec and register our error and message handlers.
  loginrec = dblogin();
  dbprocerrhandle(loginrec, (DBERRHANDLE_PROC) err_handler);
  dbprocmsghandle(loginrec, (DBMSGHANDLE_PROC) msg_handler);
 
  // Check for integrated security.
  if (strcmp(srv_pfield(pSrvProc, SRV_LSECURE, NULL), "TRUE") == 0) {
    // Client has accessed using some form of integrated security
    // Impersonate client and set DBSETLSECURE flag
    bImpersonated = srv_impersonate_client( pSrvProc );
    DBSETLSECURE(loginrec);
  }
  else {
    // Set the user name, password, and application name for the remote
    DBSETLUSER( loginrec, srv_pfield(pSrvProc, SRV_USER, NULL) );
    DBSETLPWD( loginrec, srv_pfield(pSrvProc, SRV_PWD, NULL) );
  }
 
  DBSETLAPP (loginrec, "xp_gettable_dblib");
 
  // Since the servername parameter is set to NULL, the connection will be
  // opened to the local DBMS.
  dbproc = dbopen (loginrec, NULL);
 
  dbsetuserdata (dbproc, (VOID*) pSrvProc);
 
  // Bind to the clients connection for shared transaction space.
  srv_getbindtoken (pSrvProc, szBindToken); // The same as came in 2nd parameter
  dbfcmd (dbproc, "exec sp_bindsession \'%s\'", szBindToken); 
  dbsqlexec (dbproc);
 
 
    //int i1,i2=0;
    //i1 = i1/i2;
 
 
  // Prepare command (see also dbfcmd).
    //NB! Can't use temporary tables
  if(dbcmd(dbproc, "select Id, Name from RigFinOct..Security order by Name") == FAIL) throw XP_ERRORDBCOMMAND;
  if(dbsqlexec(dbproc) == FAIL) throw XP_ERRORDBCOMMAND;
    
  // Process the results.
  while ((rc = dbresults(dbproc)) != NO_MORE_RESULTS) {     //Several recordsets may be received???
        // How many data columns are in the row?
    nCols = dbnumcols(dbproc);
        SendMsg(pSrvProc, "xp_TestProc: %d columns in the current recordset.", nCols);
        if(nCols != 2) throw XP_ERRORCOLQUANTITY;
        
        //Check types of columns. Throw error, if wrong type. (iCol is used in error message.)
        CheckColumnType(dbproc,iCol=1,SQLINT4);
        CheckColumnType(dbproc,iCol=2,SQLCHAR); 
    nRowsFetched = 0;  // Initialize a counter for the row number.
 
        DBINT iId;
        int iRes = srv_describe(pSrvProc,1,"Id",SRV_NULLTERM,SRVINT4,4,SRVINT4,4,&iId);
        if(0==iRes) throw XP_ERRORDESCRIBE;
        iRes = srv_describe(pSrvProc,2,"Result",SRV_NULLTERM,SRVBIGVARCHAR,512,SRVBIGVARCHAR,512,sMsg);
        if(0==iRes) throw XP_ERRORDESCRIBE;
 
//      Only if they are a-changing:
//      iRes = srv_setcoldata(pSrvProc,1,&iId);
//      iRes = srv_setcoldata(pSrvProc,2,sMsg);
        
        STATUS st;
    while ((st = dbnextrow(dbproc)) == REG_ROW) {
          ++nRowsFetched;
            iId = *((DBINT *)dbdata(dbproc, 1));
            char * sName = (char *)dbdata(dbproc,2); //NB!!! Russian chars are fucked up in debug mode!!! (Because of console.)
            DBINT iLen = dbdatlen(dbproc, 2);
            sName[iLen] = 0;
            _snprintf(sMsg, sizeof(sMsg), "xp_TestProc: %d \"%s\"", iId+iArg1, sName);
//          SendMsg(pSrvProc, "xp_TestProc: %d \"%s\"", iId+iArg1, sName);  //NB!!! If used, spoils srv_sendrow() below.
 
            if(srv_sendrow(pSrvProc) == FAIL) throw XP_ERRORSENDROW;
    }
        switch(st) {
        case NO_MORE_ROWS: 
            srv_senddone(pSrvProc,SRV_DONE_MORE,0,0);       
            break;
        case FAIL:
        default: throw XP_ERRORNEXTROW;
        }
 
 
        
        SendMsg(pSrvProc, "xp_TestProc: %d rows received.", nRowsFetched);
    }
 
    
 
}//end try block
catch(SRVRETCODE RC) {
    RetCode = RC;
}
 
catch(...) {
    RetCode = XP_ERRORUNKNOWN;
}
 
 
switch(RetCode) {
case XP_NOERROR:
    SendMsg (pSrvProc, "xp_TestProc: Success.");
    break;
case XP_ERRORPARAMQUANTITY:
    SendError (pSrvProc, "xp_TestProc: Wrong quantity of parameters for xp_TestProc (must be 2).");
    break;
case XP_ERRORPARAMINFO:
    SendError (pSrvProc, "srv_paraminfo failed.");
    break;
case XP_ERRORPARAMTYPE:
        SendError (pSrvProc, "xp_TestProc: Wrong type of parameter #%i.", iParamNumber);
        break;
case XP_ERRORDBCOMMAND:
    SendError (pSrvProc, "DB command failed."); 
    break;
case XP_ERRORCOLQUANTITY: 
    SendError(pSrvProc, "xp_TestProc: Wrong number of columns (must be 2).");
    break;
case XP_ERRORCOLTYPE: 
    SendError(pSrvProc, "xp_TestProc: Wrong type of column %d.", iCol);
    break;
case XP_ERRORDESCRIBE:
    SendError(pSrvProc, "xp_TestProc: srv_describe failed.");
    break;
case XP_ERRORNEXTROW:
    SendError(pSrvProc, "xp_TestProc: srv_nextrow failed.");
    break;
case XP_ERRORSENDROW:
    SendError(pSrvProc, "xp_TestProc: srv_sendrow failed.");
    break;
 
 
 
case XP_ERRORUNKNOWN:
    SendError (pSrvProc, "xp_TestProc: Unknown error.");
    break;
}//end switch
 
 
 
return RetCode;
 
}
 
 
 
/*--------------------------------------------------------------------------CheckParamType
 
*/
void CheckParamType(SRV_PROC *pSrvProc, int iParamNumber, BYTE bNeededType)
{
  BYTE  bType; ULONG    cbMaxLen; ULONG cbActualLen; BOOL   fNull;
  if (srv_paraminfo(pSrvProc, iParamNumber, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull) == FAIL) 
        throw XP_ERRORPARAMINFO;    
  
    if(bType != bNeededType) throw XP_ERRORPARAMTYPE;
}
 
 
/*--------------------------------------------------------------------------CheckColumnType
 
*/
void CheckColumnType(DBPROCESS* dbproc, int iColNumber, int iType)
{
    if(dbcoltype(dbproc,iColNumber) != iType) throw XP_ERRORCOLTYPE;
}
 
 
 
 
/*--------------------------------------------------------------------------SendError
send szErrorMsg to client
*/
void SendError (SRV_PROC *pSrvProc, CHAR* szErrorMsg,...)
{
    char sMsg[1024];
  va_list vl;
    va_start( vl,szErrorMsg);
    _vsnprintf(sMsg,sizeof(sMsg),szErrorMsg,vl); 
  srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_HELLO_ERROR, SRV_FATAL_PROCESS, 1,
          NULL, 0, (DBUSMALLINT) __LINE__, sMsg, SRV_NULLTERM);
 
  srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
  // A SRV_DONE_MORE instead of a SRV_DONE_FINAL must complete the
  // result set of an Extended Stored Procedure.
  //else srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
}
 
 
/*--------------------------------------------------------------------------SendMsg
send szInfoMsg to client
*/
void SendMsg (SRV_PROC *pSrvProc, CHAR* szInfoMsg,...)
{
    char sMsg[1024];
  va_list vl;
    va_start( vl,szInfoMsg);
    _vsnprintf(sMsg,sizeof(sMsg),szInfoMsg,vl); 
  srv_sendmsg(pSrvProc, SRV_MSG_INFO, 0, SRV_INFO, 1,
          NULL, 0, (DBUSMALLINT) __LINE__, sMsg, SRV_NULLTERM);
 
  srv_senddone(pSrvProc, SRV_DONE_MORE, 0, 0);
}
2. Никак. В С/C++ нет запрета на выход индекса за пределы. Либо нужен свой класс массива. В любом учебнике есть примеры.
3. Молодец. Прдолжай изучать.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru