double и ввод/вывод
fprintf(fo,"%f\t", (double)t);
t - double
fscanf(fi,"%d", &t);
fprintf(fo,"%f\t", (double)t);
изначально так и было.
я просто прежде чем постить стер, чтоб уж совсем не позориться.
fscanf(fi,"%lf", &t);
Пояснения: %d - это флаг для целых, а ты ей суёшь адрес double.
спс!
Лольный тред, книжка "С/C++ для самых маленьких" не нужна?
На C++, обычно, пишут так:
for (int i = 0; I < n; ++i)
for (int j = 0; j < n + 1; ++j)
{
fin >> a[i][j];
}
a[i][j]
- давно я такого не видел
Зачем тебе это нужно ?
Ну научи тогда уж сразу, как надо по-аццовски
a[i*n+j]
i*(n+1)+j тогда уж
Ты забыл аргументировать, чем это лучше
Вероятно, немного быстрее
видимо у нас разные n ?
AFAIK, a[i*n + j] и a[ i][j] - разворачиваются в один и тот же набор asm-овских инструкций
for (int i=0; i < n; ++i) {вероятно
for (int j=0; j < n+1; ++j) {
а, понятно. я без привязки к конкретному примеру
эт почему ещё?
Потому что эти два вида массивов даже хранятся по-разному.
>Вероятно, немного быстрее
Для отца ты употребил слишком много "вероятно".
Во-первых, из того, что написал товарищ, не следует, что он использует некомпактную схему хранения. Никто не мешает хранить строки встык в большом буфере + массив указателей на их начала (иногда это бывает удобно).
Оценивать влияние кэша на что-либо вообще, не проведя для данной конкретной задачи достаточно большое количество экспериментов - ИМХО несерьёзно.
Про память, конечно, не спорю (впрочем, о-малым можно пренебречь ).
Да, и ещё. Часто нужны "матрицы" с переменной (возможно, разной для разных строк) длинной строки.
вот 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)
}
Ты где-то видишь разницу?
Ой ли? (или тут надо читать "нет компилятора, кроме микрософтовского и VS.net пророк его"? )
как массив объявлен?
обычный двумерный массив - хранится одним куском
int arr[n][n];
Ты не понял. Тут везде (естественно) подразумевается, что речь идёт о "динамических" двумерных массивах. Для них это очевидно неверно.
Да, если обе размерности динамические, то массивы будут хранится по разному.
членомеры блин
Оставить комментарий
vlfdimir58
с++кусок
Во входном файле целочисленная матрица. a - действительная матрица. t - double.
В выходном получаю 0.000000 для каждого элемента. Почему так и что сделать?