2014-06-25 62 views
-1

我在项目中有Query.c,Query.h和main.c文件。我在Query.c中定义了一个SQLOpen()函数,并在主函数中调用它。执行函数所需的变量在本地声明。在函数中声明的局部变量不起作用

:在SQLOpen()函数定义

Query.c;当我调用SQLOpen(0功能在主,因为它不检测一个局部变量的程序不执行“字符logInData [256]”。

#include <stdio.h> 
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h" 
#include "Query.h" 

#define DATABASE_PATH "/Users/Sumanth/Desktop/NewDB2.fdb" 
int SQLOpen() 
{ 
    ISC_STATUS   status_vector[20]; 
    isc_db_handle  database=NULL;//database = SQLGetDatabase(); 
    char    logInData [256]; 
    short    bufferLength; 

    sprintf(logInData, "%c%c%c%c%c%c%s%c%c%s",  isc_dpb_version1, 
                isc_dpb_num_buffers, 
                1, 
                90, 
                isc_dpb_user_name, 
                strlen("SYSDBA"), 
                "SYSDBA", 
                isc_dpb_password, 
                strlen("masterkey"), 
                "masterkey"); 

    bufferLength = strlen(logInData); 
    if (isc_attach_database(status_vector, strlen(DATABASE_PATH), DATABASE_PATH, &database,bufferLength, logInData)) 
    { 

     isc_print_status(status_vector); 

    } 
    isc_print_status(status_vector); 
    // SQLTestForErrors(status_vector); 
    //  throw(ConnectionError, ""); 
    return 0; 

} 

} Query.h

#ifndef SQLQueryTest_Query_h 
#define SQLQueryTest_Query_h 

int SQLOpen(); 

#endif 

的main.c

#include <stdio.h> 
#include "Query.h" 
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h" 
int main(int argc, const char * argv[]) 
{ 

    SQLOpen(); 

} 

如果我执行这一主要功能,我得到错误(函数调用是使用Firebird数据库的功能,但它没有连接) 如果我有“字符logInData [256];”在主函数那么它正在工作(连接到数据库)。代码在下面提到。 的main.c

#include <stdio.h> 
#include "Query.h" 
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h" 
int main(int argc, const char * argv[]) 
{ 
    char logInData [256]; 
    SQLOpen(); 

} 

为什么应该包括 '字符logInData [256];'尽管它已经在SQLOpen()函数中声明为局部变量了? 为什么它不是从SQLOpen()函数读取的?

请看这个问题,并帮助我解决。

It is not displaying any error but I am unable to connect to database. 
The status of status vector is : 
ISC_STATUS [20]  
[0] long 0 
[1] long 0 
[2] long -1073741909 
[3] long -1073743396 
[4] long -1881089127 
[5] long -1881089079 
[6] long -1073741909 
[7] long -1880974640 
[8] long 515730401 
[9] long 1 
[10] long -1073743404 
[11] long 4180 
[12] long -1073743544 
[13] long -1881140636 
[14] long 4096 
[15] long 0 
[16] long 1 
[17] long -1073743488 
[18] long -1073743480 
[19] long -1073743404 
for a successful connection to the database, the status of status vector should look like: 
status_vector ISC_STATUS [20]  
[0] long 1 
[1] long 0 
[2] long 0 
[3] long 0 
[4] long 0 
[5] long 0 
[6] long 0 
[7] long 0 
[8] long 0 
[9] long 0 
[10] long 0 
[11] long 0 
[12] long 0 
[13] long 0 
[14] long 0 
[15] long 0 
[16] long 0 
[17] long 0 
[18] long 0 
[19] long 0 
+2

我只是抛弃了这一点,但在你的'sprint'中几乎没有任何内容是*字符*,那么为什么你要使用'%c'作为格式说明符?这不是一个普遍的魔法黑匣子。阅读['sprintf()'](http://en.cppreference.com/w/c/io/fprintf)*工作原理*。 – WhozCraig

+0

你有一个makefile吗?你在用一些IDE吗?如果问题在编译中,请显示您如何编译它。 –

+0

你会得到什么错误? –

回答

0

当我声明'ISC_STATUS status_vector [20];'作为一个全局变量,它工作正常,我能够连接到数据库。

相关问题