double и ввод/вывод

vlfdimir58

с++
кусок

for (int i=0; i < n; ++i) {
for (int j=0; j < n+1; ++j) {

fscanf(fi,"%d", &t);
fprintf(fo,"%f\t", t);
if (j==n) fprintf(fo, "\n");
a[i][j] = (double) t;
}
}


Во входном файле целочисленная матрица. a - действительная матрица. t - double.
В выходном получаю 0.000000 для каждого элемента. Почему так и что сделать?

Chupa

t - int?
fprintf(fo,"%f\t", (double)t);

vlfdimir58

t - double

buba741

Лень проверять точно, но вроде косяк здесь:
fscanf(fi,"%d", &t);

vlfdimir58


fprintf(fo,"%f\t", (double)t);


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

buba741

Chupa

тогда
fscanf(fi,"%lf", &t);

buba741

Пояснения: %d - это флаг для целых, а ты ей суёшь адрес double.

vlfdimir58

спс!

smnikiforov

Лольный тред, книжка "С/C++ для самых маленьких" не нужна?

Dasar

Так ты пишешь на C или на C++?
На C++, обычно, пишут так:


for (int i = 0; I < n; ++i)
for (int j = 0; j < n + 1; ++j)
{
fin >> a[i][j];
}

ppplva


a[i][j]

- давно я такого не видел
Зачем тебе это нужно ?

buba741

Ещё один папка
Ну научи тогда уж сразу, как надо по-аццовски

ppplva

a[i*n+j]

Chupa

i*(n+1)+j тогда уж

buba741

Ты забыл аргументировать, чем это лучше

ppplva

Занимает меньше места в памяти, вероятно более плотно => лучшее кэширование
Вероятно, немного быстрее

ppplva

не понимаю
видимо у нас разные n ?

Dasar

не понял.
AFAIK, a[i*n + j] и a[ i][j] - разворачиваются в один и тот же набор asm-овских инструкций

Chupa

for (int i=0; i < n; ++i) {
for (int j=0; j < n+1; ++j) {
вероятно

ppplva

а, понятно. я без привязки к конкретному примеру

Chupa

эт почему ещё?

ppplva

Очень сомневаюсь. Только если в каких-нибудь частных случаях какой-нибудь зверски оптимизирующий компилятор.
Потому что эти два вида массивов даже хранятся по-разному.

buba741

>Занимает меньше места в памяти, вероятно более плотно => лучшее кэширование
>Вероятно, немного быстрее
Для отца ты употребил слишком много "вероятно".
Во-первых, из того, что написал товарищ, не следует, что он использует некомпактную схему хранения. Никто не мешает хранить строки встык в большом буфере + массив указателей на их начала (иногда это бывает удобно).
Оценивать влияние кэша на что-либо вообще, не проведя для данной конкретной задачи достаточно большое количество экспериментов - ИМХО несерьёзно.
Про память, конечно, не спорю (впрочем, о-малым можно пренебречь ).

buba741

Да, и ещё. Часто нужны "матрицы" с переменной (возможно, разной для разных строк) длинной строки.

Dasar

а почему нет?
вот debug-mode


arr[i][j] = 10;
00411A47 mov eax,dword ptr [i]
00411A4A imul eax,eax,190h
00411A50 lea ecx,arr[eax]
00411A57 mov edx,dword ptr [j]
00411A5A mov dword ptr [ecx+edx*4],0Ah
arr2[i * n + j] = 10;
00411A61 mov eax,dword ptr [i]
00411A64 imul eax,eax,64h
00411A67 add eax,dword ptr [j]
00411A6A mov dword ptr arr2[eax*4],0Ah


вот release-mode


for (int i = 0; i < n; ++i)
004014BB xor eax,eax
004014BD lea edx,[esp+4]
004014C1 push edi
for (int j = 0; j < n; ++j)
{
arr[i][j] = i;
004014C2 mov edi,edx
004014C4 mov ecx,64h
004014C9 rep stos dword ptr [edi]
004014CB inc eax
004014CC add edx,190h
004014D2 cmp eax,64h
004014D5 jl main+12h (4014C2h)
}
for (int i = 0; i < n; ++i)
004014D7 xor eax,eax
004014D9 lea edx,[esp+9C48h]
for (int j = 0; j < n; ++j)
{
arr2[i * n + j] = i;
004014E0 mov edi,edx
004014E2 mov ecx,64h
004014E7 rep stos dword ptr [edi]
004014E9 inc eax
004014EA add edx,190h
004014F0 cmp eax,64h
004014F3 jl main+30h (4014E0h)
}


Ты где-то видишь разницу?

smnikiforov

Ой ли? (или тут надо читать "нет компилятора, кроме микрософтовского и VS.net пророк его"? )

Chupa

читерство
как массив объявлен?

Dasar

обычный двумерный массив - хранится одним куском

Dasar

int arr[n][n];

buba741

>int arr[n][n];
Ты не понял. Тут везде (естественно) подразумевается, что речь идёт о "динамических" двумерных массивах. Для них это очевидно неверно.

Dasar

я вас понял.
Да, если обе размерности динамические, то массивы будут хранится по разному.

slonishka

членомеры блин
Оставить комментарий
Имя или ник:
Комментарий: