【问题标题】:local variable declared in the function is not working函数中声明的局部变量不起作用
【发布时间】:2014-06-25 21:43:14
【问题描述】:

我在项目中有 Query.c、Query.h 和 main.c 文件。我在 Query.c 中定义了一个 SQLOpen() 函数并在主程序中调用它。执行函数所需的变量在本地声明。当我在 main 中调用 SQLOpen(0 函数时,程序没有执行,因为它没有检测到 SQLOpen() 函数中定义的一个局部变量 'char logInData [256];'。

Query.c

#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

ma​​in.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 的数据库函数,但它没有连接) 如果我包含 'char logInData [256];'在 main 函数中,它正在工作(连接到数据库)。代码如下所述。 ma​​in.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();

}

为什么我应该包含 'char 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

【问题讨论】:

  • 我只是把它扔掉了,但你的sprint 中几乎没有一个实际上是一个字符,那么你为什么使用%c 作为格式说明符呢?它不是某种通用的魔法黑匣子。了解sprintf() 如何工作
  • 你有makefile吗?你在使用一些 IDE 吗?如果问题出在编译中,请说明你是如何编译的。
  • 你得到什么错误?
  • 它没有显示任何错误但无法连接到数据库。状态向量的状态贴在上面。请看一下

标签: c xcode function firebird


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2012-05-23
    • 1970-01-01
    • 2015-05-11
    • 2019-05-09
    相关资源
    最近更新 更多