Как я могу сохранить массив в массиве MD и вернуть этот массив из функции? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть метод, который принимает список файлов и получает данные о файлах. Формат этих файлов возвращается в виде двух одномерных массивов. Я хочу объединить их в один 2D-массив.

Файлы возвращаются только с массивом типов и массивом данных.

Вот метод, о котором идет речь. Я успешно извлекаю нужные данные из файлов в массив 1D, но когда я пытаюсь добавить их в массив 2D, он запускается (но выдает предупреждение, что char * и char * [] [] aren ' т эквивалент).

char *ParseFiles(char *listOfFiles[32])
{
    char *allFileData;
    char *tmpArray[32][32];

    allFileData = tmpArray;

    for(int i = 0; i < listOfFiles[i]; i++)
    {
        int j = 0;
        // Get the File Type
        char *currentFileType = GetFileType(listOfFiles[i], strlen(listOfFiles[i]));

        if(currentFileType)
        {
            // Warning char * and char *[][] are not equivalent.
            tmpArray[i][j] = currentFileType;
            printf("File %d is %s\n", i, currentFileType);
            //printf("File %d is %s\n", i, &tmpArray[i][j]);
            //free(currentFileType);
        }

        //Get all File Data
        // Warning char * and char *[][] are not equivalent.
        char *currentFileData = GetFileData(listOfFiles[i]);

        j = j + 1;
        if(currentFileData)
        {
            tmpArray[i][j] = currentFileData;
            printf("File Data:\n%s\n", currentFileData);
            //free(currentFileType);
        }
    }
    return allFileData;
}

Когда я пытаюсь вывести значения tmpArray[][] в закомментированных утверждениях printf, я получаю неожиданные символы (неожиданные для того, кто совершает ошибку) ?]p

Проблема связана с тем, что два массива символов не имеют одинаковый тип, или потому, что я пытаюсь вставить одномерный массив в многомерный массив неправильно?

Точное предупреждение, которое я получаю: warning: incompatible pointer types assigning to 'char*' from 'char *[32][32]'


Ниже приведены два других моих метода и мой основной:

char *GetFileType(char *filePath, int size)
{
    char *ret = malloc(size);

    char currentLine[100];
    FILE *file = fopen(filePath, "r");

    while(fgets(currentLine, sizeof(currentLine), file) != NULL)
    {
        if(strstr(currentLine, "test"))
        {
            ret = "test";
        }

        else if(strstr(currentLine, "production"))
        {
            ret = "production";
        }
    }
    if(!ret)
    {
        return NULL;
    }
    return ret;

}

char *GetFileData(char *filePath)
{

    char *buffer = NULL;
    size_t size = 0;

    FILE *file = fopen(filePath, "r");

    // Get the buffer size
    fseek(file, 0, SEEK_END);
    size = ftell(file);

    // Reset the position of the stream
    rewind(file);

    buffer = malloc((size + 1) * sizeof(*buffer));

    // Read the entire file into the buffer
    fread(buffer, size, 1, file);

    buffer[size] = '\0';

    return buffer;
}

int main (void)
{
    char *listOfFiles[32] = {"file1.txt", "file2.txt", "file3.txt"};

    ParseFiles(listOfFiles);

    printf("Press ENTER key to Continue");
    getchar();
    return 0;
}

1 Ответ

0 голосов
/ 17 мая 2018

Проблема не в том, где вы говорите, а в том, что здесь:

char *allFileData;
char *tmpArray[32][32];

allFileData = tmpArray;

Тип tmpArray равен char *[32][32]. Тип allFileData является char *. Назначение просто недействительно.

И происходит еще одна худшая вещь: вы возвращаете allFileData, который указывает на локальную переменную tmpArray. Переменная tmpArray выйдет из области видимости, как только функция вернется, и возвращаемый вами указатель немедленно станет недействительным. Либо передайте массив в качестве аргумента, либо выделите его динамически внутри функции.

...