for(i = 0; i < total; ++i)
fprintf(stdout, "%ld, %ld, %ld\n", parts_sizes, file_len, file_len);
fprintf - странный вывод
Код:
может порождать такой вывод:
Код:
13, 0, 131
13, 0, 131
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;
}
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
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
Спасибо!
Код:
fprintf(stdout, "%lld, %lld, %lld\n", parts_sizes, file_len, file_len);
Так в чем же фишка? Фишка в банке или стеке, кому как нравится. И в том как происходит интерпретация этого стека, а интерпретацию задаете вы, товарищ.
Ну ясно, разобрался. Спецификация %ld используется для вывода long, но не long long, потому что long long - расширение GNU. Исправил на %lld. Работает. Спасибо.
Цитата: igor_nf
long long - расширение GNU.
Это не расширение GNU, а уже давно как стандарт ISO/IEC 9899, просто некоторые его не соблюдают, полностью не соблюдают.