локальная переменная, объявленная в функции, не работает

#c #xcode #function #firebird

#c #xcode #функция #firebird

Вопрос:

У меня есть файлы Query.c, Query.h и main.c в проекте. Я определил функцию SQLOpen() в Query.c и вызвал ее в основном. Переменные, необходимые для выполнения функции, объявляются локально. Программа не выполняется, когда я вызываю функцию SQLOpen (0 в main, потому что она не обнаруживает одну локальную переменную ‘char logInData [256];’, определенную в функции SQLOpen ().

Запрос.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, amp;database,bufferLength, logInData))
    {

        isc_print_status(status_vector);

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

}
  

}
Запрос.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, но она не подключается)
Если я включу ‘char 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();

}
  

почему я должен включать ‘char logInData [256];’ в main, хотя он уже объявлен в функции 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
  

Комментарии:

1.Я просто отбрасываю это, но почти ничего в вашем sprint на самом деле не является символом, так почему вы используете %c для спецификатора формата? Это не какой-то универсальный черный ящик магии. Прочитайте, как это sprintf() работает.

2. У вас есть makefile ? вы используете какую — нибудь IDE? если проблема заключается в компиляции, пожалуйста, покажите, как вы ее компилируете.

3. Какую ошибку вы получаете?

4. Он не отображает никаких ошибок, но не может подключиться к базе данных. Статус вектора состояния размещен выше. Пожалуйста, посмотрите на это

Ответ №1:

Когда я объявляю ‘ISC_STATUS status_vector [20];’ в качестве глобальной переменной, она работает нормально, и я могу подключиться к базе данных.