Возвращение массива

Модератор: Модераторы разделов

Аватара пользователя
Skaarj
Сообщения: 311
ОС: Slackware

Возвращение массива

Сообщение Skaarj »

Есть код на Си

Код: Выделить всё

#include <stdio.h>

float ar1[3] = {0.0, 0.1, 0.2};
float ar2[3] = {0.3, 0.4, 0.5};
float ar3[6];

int i;

float merge(float vec1[], float vec2[]){
    float vec3[6];
    for(i = 0; i <= 5; i++){
        if(i <= 2){
            vec3[i] = vec1[i];
        }
        if(i >= 3){
            vec3[i] = vec2[i - 3];
        }
    }
    /*for(i = 0; i <= 5; i++){
        printf("%d %f\n", i, vec3[i]);
    }*/
    return *vec3;
}

int main(void){
    *ar3 = merge(ar1, ar2);
    for(i = 0; i <= 5; i++){
        printf("%d %f\n", i, ar3[i]);
    }
}

На выходе должен печатать, то что должен печатать закоментированный код, но печатает нули.
Поясните, пожалуйста, в чём ошибка.
Спасибо сказали:
MrSinister
Сообщения: 95

Re: Возвращение массива

Сообщение MrSinister »

Skaarj писал(а):
08.10.2009 20:21
Есть код на Си

На выходе должен печатать, то что должен печатать закоментированный код, но печатает нули.
Поясните, пожалуйста, в чём ошибка.


Возвратить массив просто так не получится. но можно передать указатель на массив и заполнить пустой оригинал. вот:

Код: Выделить всё

#include <stdio.h>

float ar1[3] = {0.0, 0.1, 0.2};
float ar2[3] = {0.3, 0.4, 0.5};
float ar3[6];

int i;

void merge(float vec1[], float vec2[], float* vec3){

    for(i = 0; i <= 5; i++){
        if(i <= 2){
            vec3[i] = vec1[i];
        }
        if(i >= 3){
            vec3[i] = vec2[i - 3];
        }
    }
    /*for(i = 0; i <= 5; i++){
        printf("%d %f\n", i, vec3[i]);
    }*/
}

int main(void){
    merge(ar1, ar2, ar3);
    for(i = 0; i <= 5; i++){
        printf("%d %f\n", i, ar3[i]);
    }
       return 0;
}
Спасибо сказали:
skmdeveloper
Сообщения: 70

Re: Возвращение массива

Сообщение skmdeveloper »

В Си массивы это указатели. В данном случае вы возврашаете зачение vec3[0];
Спасибо сказали:
Аватара пользователя
Skaarj
Сообщения: 311
ОС: Slackware

Re: Возвращение массива

Сообщение Skaarj »

Большое спасибо, я думал функция должна возвращать указатель на нулевой элемент и это должно работать.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Возвращение массива

Сообщение NickLion »

Skaarj писал(а):
08.10.2009 20:21
Есть код на Си
... skipped ...
На выходе должен печатать, то что должен печатать закоментированный код, но печатает нули.
Поясните, пожалуйста, в чём ошибка.

Здесь очень много ошибок и странного кода ;)
1. Вы возвращаете значение нулевого элемента массива
2. Массивы нельзя вернуть, можно вернуть указатель на начало
3. Нельзя возвращать указатель на локальные переменные - эти данные будут уничтожены и, возможно, переписаны
4. Использовать глобальную переменную для циклов - сверхзло
5. Странный код - а те 2 if разве нельзя заменить одним с веткой else?
6. Внутри функции неизвестен размер массивов, поэтому лучше передавать размер массива(ов) в функцию.

Можно делать так, как показал MrSinister, а можно так:

Код: Выделить всё

#include <stdio.h>

float ar1[3] = {0.0, 0.1, 0.2};
float ar2[3] = {0.3, 0.4, 0.5};
float ar3[6];

#define LENGTH( array ) ( sizeof( array ) / sizeof( array[0] ) )

bool merge( float dst[], int dst_size, const float vec1[], int size1, const float vec2[], int size2 ) {
    if( dst_size < size1 + size2 || size1 < 0 || size2 < 0 )
        return false;
    for( int i = 0; i < size1; i++ )
        dst[ i ] = vec1[ i ];
    for( int i = 0; i < size2; i++ )
        dst[ size1 + i ] = vec2[ i ];
    return true;
}

int main(void){
    merge( ar3, LENGTH( ar3 ), ar1, LENGTH( ar1 ), ar2, LENGTH( ar2 ) );
    for( int i = 0; i < LENGTH( ar3 ); i++){
        printf("%d %f\n", i, ar3[i]);
    }
}
Спасибо сказали:
Аватара пользователя
Skaarj
Сообщения: 311
ОС: Slackware

Re: Возвращение массива

Сообщение Skaarj »

NickLion писал(а):
08.10.2009 21:23
Здесь очень много ошибок и странного кода ;)

Знаю, я в лоб написал, что бы хоть как-то работало.
Спасибо сказали: