Встройте данные в программу C++

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

17
задан Brian Tompsett - 汤莱恩 19 October 2015 в 18:57
поделиться

6 ответов

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

24
ответ дан 30 November 2019 в 12:14
поделиться

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

3
ответ дан 30 November 2019 в 12:14
поделиться

Используйте макросы. Технически тот файл был бы файл исходного кода , но он не будет похож на это. Пример:

//queries.incl - SQL queries
Q(SELECT * FROM Users)
Q(INSERT [a] INTO Accounts)


//source.cpp
#define Q(query) #query,
char * queries[] = {
#include "queries.incl"
};
#undef Q

Позже Вы могли сделать все виды другой обработки на том файле тем же файлом, сказать, что захотите иметь массив и карту хеша их, Вы могли переопределить Q, чтобы сделать другое задание и быть сделанными с ним.

3
ответ дан 30 November 2019 в 12:14
поделиться

Вот образец, который мы использовали для межплатформенного embeddeding файлов. Это довольно упрощенно, но будет, вероятно, работать на Вас.

Вы, возможно, также должны измениться, как это обрабатывает переводы строки в функции escapeLine.

#include <string>
#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

std::string escapeLine( std::string orig )
{
    string retme;
    for (unsigned int i=0; i<orig.size(); i++)
    {
        switch (orig[i])
        {
        case '\\':
            retme += "\\\\";
            break;
        case '"':
            retme += "\\\"";
            break;
        case '\n': // Strip out the final linefeed.
            break;
        default:
            retme += orig[i];
        }
    }
    retme += "\\n"; // Add an escaped linefeed to the escaped string.
    return retme;
}

int main( int argc, char ** argv )
{
    string filenamein, filenameout;

    if ( argc > 1 )
        filenamein = argv[ 1 ];
    else
    {
        // Not enough arguments
        fprintf( stderr, "Usage: %s <file to convert.mel> [ <output file name.mel> ]\n", argv[0] );
        exit( -1 );
    }

    if ( argc > 2 )
        filenameout = argv[ 2 ];
    else
    {
        string new_ending = "_mel.h";
        filenameout = filenamein;
        std::string::size_type pos;
        pos = filenameout.find( ".mel" );
        if (pos == std::string::npos)
            filenameout += new_ending;
        else
            filenameout.replace( pos, new_ending.size(), new_ending );
    }

    printf( "Converting \"%s\" to \"%s\"\n", filenamein.c_str(), filenameout.c_str() );

    ifstream filein( filenamein.c_str(), ios::in );
    ofstream fileout( filenameout.c_str(), ios::out );

    if (!filein.good())
    {
        fprintf( stderr, "Unable to open input file %s\n", filenamein.c_str() );
        exit( -2 );
    }
    if (!fileout.good())
    {
        fprintf( stderr, "Unable to open output file %s\n", filenameout.c_str() );
        exit( -3 );
    }

    // Write the file.
    fileout << "tempstr = ";

    while( filein.good() )
    {
        string buff;
        if ( getline( filein, buff ) )
        {
            fileout << "\"" << escapeLine( buff ) << "\"" << endl;
        }
    }

    fileout << ";" << endl;

    filein.close();
    fileout.close();

    return 0;
}
2
ответ дан 30 November 2019 в 12:14
поделиться

Это немного ужасно, но можно всегда использовать что-то как:

const char *query_foo =
#include "query_foo.txt"

const char *query_bar =
#include "query_bar.txt"

, Где query_foo.txt содержал бы заключенный в кавычки текст запроса.

1
ответ дан 30 November 2019 в 12:14
поделиться

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

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

0
ответ дан 30 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: