Информация об изменениях

Сообщение Re[2]: char *(*(**foo[][8])())[]; - за сколько распарсите? от 06.05.2023 8:13

Изменено 06.05.2023 8:14 rg45

Re[2]: char *(*(**foo[][8])())[]; - за сколько распарсите?
Здравствуйте, Shmj, Вы писали:

S>"Всемогущий" GPT не осилил:

S>Вообще возможно ли это как-то инициализировать и вызвать?

Да что ж вы такие беспомощные
Ну ладно Chat GPT, ей простительно — она девочка. Но ты-то — лоб здоровый, которому выше уже все разжевали, осталось только проглотить — что не осилил опять?

http://coliru.stacked-crooked.com/a/ec19b1aaad28456c

#include <iostream>

const char* arr1[] = {"foo", "bar", "baz", nullptr}; // пример массива строк
const char* arr2[] = {"one", "two", "three", "four", nullptr}; // ещё один массив строк

// определение функций, возвращающих указатели на массивы строк
const char* (*func1())[] { return &arr1; }
const char* (*func2())[] { return &arr2; }

// определение указателей на функции
const char* (*(*fptr1)())[] = &func1;
const char* (*(*fptr2)())[] = &func2;


int main()
{
    // Aнициализация foo - только не "с помощью двух элементов", а так, как это было в оригинальном варианте - массив произвольного размера
    const char*(*(**foo[][8])())[] = {
        { &fptr1 }, // первый элемент указывает на функцию, возвращающую arr1
        { &fptr2 }, // второй элемент указывает на функцию, возвращающую arr2
        { &fptr1, &fptr2 }, // третий элемент указывает на две функции
        { &fptr1, &fptr2, &fptr1, &fptr2, &fptr1, &fptr2, &fptr1, &fptr2 }, // четвертый элемент тоже на что-то указывает
        { }, // пятый элемент - пустой (содержит восемь nullptr)
    };
    
    // Aнализ и использование foo

    using String = const char*;
    using ArrayOfString = String[];
    using Function = ArrayOfString*();
    
    for (Function** (&afpp)[8]  : foo)
    {
        std::cout << "{ ";
        for (Function** fpp : afpp)
        {
            if (fpp)
            {
                if (Function* fp = *fpp)
                {
                    if (ArrayOfString* asptr = fp())
                    {
                        std::cout << "[ ";
                        for (const String* s = *asptr; *s; ++s)
                        {
                            std::cout << *s << ' ';
                        }
                        std::cout << "] ";
                    }
                }
            }
        }
        std::cout << "}" << std::endl;
    }
}

g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
{ [ foo bar baz ] }
{ [ one two three four ] }
{ [ foo bar baz ] [ one two three four ] }
{ [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] }
{ }
Re[2]: char *(*(**foo[][8])())[]; - за сколько распарсите?
Здравствуйте, Shmj, Вы писали:

S>"Всемогущий" GPT не осилил:

S>Вообще возможно ли это как-то инициализировать и вызвать?

Да что ж вы такие беспомощные
Ну ладно Chat GPT, ей простительно — она маленькая девочка. Но ты-то — лоб здоровый, которому выше уже все разжевали, осталось только проглотить — что не осилил опять?

http://coliru.stacked-crooked.com/a/ec19b1aaad28456c

#include <iostream>

const char* arr1[] = {"foo", "bar", "baz", nullptr}; // пример массива строк
const char* arr2[] = {"one", "two", "three", "four", nullptr}; // ещё один массив строк

// определение функций, возвращающих указатели на массивы строк
const char* (*func1())[] { return &arr1; }
const char* (*func2())[] { return &arr2; }

// определение указателей на функции
const char* (*(*fptr1)())[] = &func1;
const char* (*(*fptr2)())[] = &func2;


int main()
{
    // Aнициализация foo - только не "с помощью двух элементов", а так, как это было в оригинальном варианте - массив произвольного размера
    const char*(*(**foo[][8])())[] = {
        { &fptr1 }, // первый элемент указывает на функцию, возвращающую arr1
        { &fptr2 }, // второй элемент указывает на функцию, возвращающую arr2
        { &fptr1, &fptr2 }, // третий элемент указывает на две функции
        { &fptr1, &fptr2, &fptr1, &fptr2, &fptr1, &fptr2, &fptr1, &fptr2 }, // четвертый элемент тоже на что-то указывает
        { }, // пятый элемент - пустой (содержит восемь nullptr)
    };
    
    // Aнализ и использование foo

    using String = const char*;
    using ArrayOfString = String[];
    using Function = ArrayOfString*();
    
    for (Function** (&afpp)[8]  : foo)
    {
        std::cout << "{ ";
        for (Function** fpp : afpp)
        {
            if (fpp)
            {
                if (Function* fp = *fpp)
                {
                    if (ArrayOfString* asptr = fp())
                    {
                        std::cout << "[ ";
                        for (const String* s = *asptr; *s; ++s)
                        {
                            std::cout << *s << ' ';
                        }
                        std::cout << "] ";
                    }
                }
            }
        }
        std::cout << "}" << std::endl;
    }
}

g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
{ [ foo bar baz ] }
{ [ one two three four ] }
{ [ foo bar baz ] [ one two three four ] }
{ [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] [ foo bar baz ] [ one two three four ] }
{ }