Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

fprintf - странный вывод

1.8K
16 февраля 2008 года
igor_nf
256 / / 13.12.2006
Убейте меня ногами, но объясните, почему цикл вызовов

 
Код:
for(i = 0; i < total; ++i)
          fprintf(stdout, "%ld, %ld, %ld\n", parts_sizes, file_len, file_len);


может порождать такой вывод:

 
Код:
13, 0, 131
13, 0, 131
13, 0, 131
...


Выходит, переменная file_len в первом выводе принимает значение 0, а во втором - 131. У меня в голове не укладывается!!! Вот на всякий случай полный текст функции - может быть я замутил с автоматической памятью?

Код:
int truncate_all(char *fname, int total) {

    long long file_len = 0;
    struct stat *pst = file_info(fname);

    file_len = pst->st_size;

    long long part_len = file_len / total;

    long long *parts_sizes = (long long *)malloc(sizeof(long long) * total);

    long long sublen = file_len % total;

    memset_sizes_array(parts_sizes, total, part_len, sublen);

    int i;

    for(i = 0; i < total; ++i)
        fprintf(stdout, "%ld, %ld, %ld\n", parts_sizes, file_len, file_len);
   

    fprintf(stdout, "\n\nSize of %s = %d\n", fname, file_len);
    free(parts_sizes);

return 0;
}


Полный вывод всего этого:

Код:
Truncating..
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
13, 0, 131
14, 0, 131


Size of /home/src/debug.h = 131


Спасибо!
260
16 февраля 2008 года
Ramon
1.1K / / 16.08.2003
 
Код:
fprintf(stdout, "%lld, %lld, %lld\n", parts_sizes, file_len, file_len);


Так в чем же фишка? Фишка в банке или стеке, кому как нравится. И в том как происходит интерпретация этого стека, а интерпретацию задаете вы, товарищ.
1.8K
16 февраля 2008 года
igor_nf
256 / / 13.12.2006
Ну ясно, разобрался. Спецификация %ld используется для вывода long, но не long long, потому что long long - расширение GNU. Исправил на %lld. Работает. Спасибо.
260
16 февраля 2008 года
Ramon
1.1K / / 16.08.2003
Цитата: igor_nf
long long - расширение GNU.



Это не расширение GNU, а уже давно как стандарт ISO/IEC 9899, просто некоторые его не соблюдают, полностью не соблюдают.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог