правильный формат для прототипа функции - PullRequest
1 голос
/ 04 апреля 2010

Я пишу в текстовый файл, используя следующую декларацию:

void create_out_file(char file_name[],long double *z1){
    FILE *out;
    int i;

    if((out = fopen(file_name, "w+")) == NULL){
        fprintf(stderr, "***> Open error on output file %s", file_name);
        exit(-1);
    }

    for(i = 0; i < ARRAY_SIZE; i++)
    fprintf(out, "%.16Le\n", z1[i]);
    fclose(out);
}

Где z1 - длинный двойной массив длины ARRAY_SIZE. Вызывающая функция:

create_out_file("E:/first67/jz1.txt", z1);

Я определил прототип как:

void create_out_file(char file_name[], long double z1[]);

который я ставлю перед "int main", но после директив препроцессора. Мой код работает нормально.

Я думал о том, чтобы поставить прототип как

void create_out_file(char file_name[],long double *z1). 

Это правильно? *z1 будет указывать на первый элемент массива z1.

Является ли мое объявление и прототип хорошей практикой программирования?

Большое спасибо ...

Обновление : Чтобы сделать программу общей, я определил ARRAY_SiZE как:

const int ARRAY_SIZE = 11;

Прототип становится:

void create_out_file(const char *file_name, const long double *z1, size_t z_size)

вызываемая функция:

create_out_file("/tmp/myname", z1, ARRAY_SIZE);

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

void create_out_file(const char *file_name, const long double *z1, size_t z_size)

FILE *out;
int i;
    if((out = fopen(file_name, "w+")) == NULL){
    fprintf(stderr, "***> Open error on output file %s", file_name);
    exit(-1);
    }


for(i = 0; i < z_size; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}

Будет ли это работать?

Новое обновление При компиляции, для строки

for(i = 0; i < z_size; i++)

в объявлении я получаю предупреждение:: предупреждение C4018: '<': несоответствие со знаком / без знака </p>

Что здесь не так?

Спасибо ...

Последние новости : все отлично работает благодаря Джонатану Леффлеру

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Используйте 'const char file_name []' или 'const char * file_name' - вы не собираетесь изменять имя в функции.

Аналогично, используйте 'const long double * z1' или 'const long double z1 []'.

Выбор между указателем и обозначением массива в прототипе функции в значительной степени произвольный. Я почти всегда использую обозначение указателя - потому что в конечном итоге это то, что передается в функцию. Есть те, кто утверждает, что если вы собираетесь использовать указатель в качестве массива, используйте обозначение массива; это совершенно разумная точка зрения, но не та, которую я использую.

Ваш код будет более общим, если вы передадите размер массива в функцию:

void create_out_file(const char *file_name, const long double *z1, size_t z_size)
{
    ...
}

Обратите внимание, что выбор между указателем и обозначением массива не является произвольным для глобальных переменных. Существует большая разница между этими двумя:

extern char *something;
extern char  anotherthing[];

Кто-то говорит, что существует область памяти размером с указатель, которая содержит адрес строки символов (предположительно). Другой говорит, что где-то есть символьная строка, известная под именем «другое», значением которой является указатель. Это может быть немного неуловимым - но разница имеет решающее значение. Изоморфизм указателя == массива применяется только в списках аргументов функции.

0 голосов
/ 04 апреля 2010

декларации: long double z1[] и long double *z1 абсолютно одинаковы.

* z1 будет указывать на первый элемент массива z1

да. в c нет такого массива сущностей. Есть только указатели и немного тонкого синтаксического сахара для доступа к ним [ ].

...