как положить массив в массив?

117
22 сентября 2019, 16:00

в общем создал функцию которая создаёт массив

GLfloat  Rainbow_color(bool a, int b) // радужный покрас
{
    if (b == 0)
        return 0;
    GLfloat color[b]; // массивы нач с одного а пересчёт с нуля
    if(a == false)
    {
        //  вводим одноцветно
        int i_t =0;
        for (int i =0; i < b; i++)
        {
            if(i_t == 0)
            {
                color[i] = 0.8f;
                i_t = 1;
            }
            else if(i_t == 1)
            {
                color[i] = 0.21f;
                i_t = 2;
            }
            else if(i_t == 2)
            {
                color[i] = 0.14f;
                i_t = 0;
            }
        }
        return color[b];
    }
    else
    {
        return color_prohod(b);
    }
}
GLfloat color_prohod(int b)
{
    GLfloat ranbow_color[b];    // разноцветный текст
    int t1 = b/60;    int t2 = b%60;    int t3 = t2/10;    int t4 = t2%10; // перемен размера перемен остатка перремен остатка разм и размер от размера
    int prohod = (t1*6)+t3;
    ....
    return ranbow_color[b];
}

попробовал его использовать в вызове отрисовки и для это решил положить в массив

GLfloat cwet_chikl[360];
// попытка номер один 
cwet_chikl[360] = Rainbow_color(true, 360); // не сработало 
// попытка номер два
cwet_chikl[360] = *Rainbow_color(true, 360); // ошибка
// попытка номер три
cwet_chikl[360] = &Rainbow_color(true, 360); // ошибка 
// попытка номер четыре
std::memcpy(cwet_chikl[360], Rainbow_color(true,360), sizeof(GLfloat)*360); // пишет ошибка: cannot initialize a parameter of type 'void *' with an lvalue of type 'GLfloat' (aka 'float')
// ещё вариант
std::memcpy(cwet_chikl, &Rainbow_color(true,360), sizeof(GLfloat)*360); // ошибка: cannot take the address of an rvalue of type 'GLfloat' (aka 'float') 

В общем не сработало :( Помогите !!!!

Answer 1

В общем починил, через ссылку, работает :P

Место объявления функции

 void color_prohod1(GLfloat *cwet_chikl, int b);

Место вызова функции

GLfloat cwet_chikl[360];
color_prohod1(cwet_chikl, 360);

Сама функция. Назначение функции окраска "отрисовывательной" линии в радужный диапазон цветов.

void color_prohod1(GLfloat *cwet_chikl, int b)
{
     int t1 = b/30;    int t2 = b%30;
     int prohod = t1/7;
    qDebug() << "t1 = b/30: " << t1;
    qDebug() << "t2 = b%30: " << t2;
    qDebug() << "prohod = t1/7: " << prohod;
    int s =0; // элемент "позиция " массива прим: ranbow_color[124]; s ==124;
    int i = 0;
    int i_t1 = 0;
    for (int a_g =0; a_g < prohod+1; a_g++) {
        qDebug() << "2444!!!!!!!!!!!!!!!a_g:" << a_g;
        if (i == 0) {
            i = 1;
            GLfloat per = 0.0;
            for (int a = 0; a < 10 ; a++) {
                for (int a_i = 0; a_i < 3; a_i++) {
                    if(a_i == 0) {
                        per += 0.1f;
                        cwet_chikl[s] = per;
                        s++;
                    }
                    if(a_i == 1) {
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                    if(a_i == 2) {
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                }
            }
            qDebug() << "tyt i:" << i << " cwet_chikl[" << s << "]" << cwet_chikl[s];
            i_t1 = i_t1 +1;
            if(t1 <= i_t1) continue;
        }
        if(i == 1){
            i = 2;
            GLfloat per = 0.0;
            for (int a = 0; a < 10 ; a++) {
                for (int a_i = 0; a_i < 3; a_i++) {
                    if(a_i == 0) {
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                    if(a_i == 1) {
                        per += 0.1f;
                        cwet_chikl[s] = per;
                        s++;
                    }
                    if(a_i == 2) {
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                }
            }
            qDebug() << "tyt i:" << i << " cwet_chikl[" << s << "]" << cwet_chikl[s];
            i_t1 = i_t1 +1;
            if(t1 <= i_t1) continue;
        }
        ...
        if (i == 6) {
            i = 0;
            GLfloat per = 0.0;
            for (int a = 0; a < 10 ; a++){
                for (int a_i = 0; a_i < 3; a_i++){
                    if(a_i == 0){
                        per += 0.1f;
                        cwet_chikl[s] = per;
                        s++;
                    }
                    if(a_i == 1){
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                    if(a_i == 2){
                        cwet_chikl[s] = 0.0f;
                        s++;
                    }
                }
            }
            qDebug() << "tyt i:" << i << " cwet_chikl[" << s << "]" << cwet_chikl[s];
            i_t1 = i_t1 +1;
            if(t1 <= i_t1) continue;
        }
    }
    //  выводим одноцветно
    int i_t =0;
    for(int i1 = 0;i1 < t2;i1++)
    {
        if(i_t == 0)
        {
            cwet_chikl[s] = 0.8f;
            s++;
            i_t = 1;
        }
        else if(i_t == 1)
        {
            cwet_chikl[s] = 0.21f;
            s++;
            i_t = 2;
        }
        else if(i_t == 2)
        {
            cwet_chikl[s] = 0.14f;
            s++;
            i_t = 0;
        }
    }
}

Простейший пример работы с указателями

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void addOne(float *buf, int N);
int main()
{
     float A[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
    float *B[5];
    // заполним массивы
    printf("vvod A \n");
    addOne(&A, 5); // по адресу
    printf(" vvod B \n");
    addOne(B, 5); // по указателю
    printf("game ower");
    system("pause>null");
    return 0;
}
void addOne(float *Buf, int N)
{
//    memset(Buf, 0, sizeof(Buf));
    for (int n = 0; n< N; n++)
    {
        Buf[n] = Buf[n] + 1.0f;
        printf("%f, \n", Buf[n]);
    }
    printf("\n");
}

Заметил что вопрос пересекается с стандартным простецким вопросом как положить массив в массив . в общем я пользуюсь двумя методами. Первый : тупо перебором

float S[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float C[5] = {0.0f, 0.0f, 0.0f,0.0f, 0.0f};
for (int i = 0; i < 5; i++){
    C[i] = S[i];       
    printf("%f, \n", S[i]);        
}

второй (чаще) : функцией memcpy

float S[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float C[5] = {0.0f, 0.0f, 0.0f,0.0f, 0.0f};
memcpy (C, S, sizeof(float)*5);
READ ALSO
Проверка значения аргумента constexpr функции

Проверка значения аргумента constexpr функции

Есть класс и перегрузка оператора []

101
Как создать бесконечный цикл

Как создать бесконечный цикл

Как звучит задача:

479
Преобразование Mat в byte[] и обратно

Преобразование Mat в byte[] и обратно

Необходимо получить класс Mat, провести с ним манипуляции и сохранить в byte[], с последующим восстановлением byte[] в MatНаписал простейший пример:

139
UnixException on Mac

UnixException on Mac

Начал получить ошибку на Mac при попытке записать pdf файл в папку tempВернее, приложение должно записывать туда файл, но не записывает (исключения...

135