powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Много ли новых проектов пишется на C
25 сообщений из 101, страница 4 из 5
Много ли новых проектов пишется на C
    #35997621
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_nРабочий вариант на чистом Си (ну закроем глаза на cout)

Опять 25. Библиотечная ф-я должна компилироваться в отдельном модуле.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997635
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что по Вашему помешает ей откомпилироваться в отдельном модуле? Я правда не понимаю чего Вам ещё нужно...
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997651
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_nА что по Вашему помешает ей откомпилироваться в отдельном модуле? Я правда не понимаю чего Вам ещё нужно...
Тут собственно спор идет о причинах больших затруднений перевода библиотечных функций Ф. на С. Я взял максимально простой пример, чтобы, не загромождая деталями, показать сложности этого процесса.
А помешает откомпилироваться в отдельном модуле синтакис C. Хотел бы иметь компилятор, который это сделает.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997665
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА помешает откомпилироваться в отдельном модуле синтакис C. Хотел бы иметь компилятор, который это сделает.

А, нелинейные эффекты, понимаю...
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997723
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_n
А, нелинейные эффекты, понимаю...
Почему нелинейные? Отсутствие в ЯП какой-либо возможности - вещь весьма прямолинейная.
Я вот подготовил пример чуть более продвинутый.
Главная программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
#include <stdio.h>
#define  DIM1   2 
#define  DIM2   3 
#define  DIM3   4 
#define DIM4   20 
#define DIM5   10 
#define DIM6   15 
void sum_matr(int ,int, int, double*,double*,double*);
int main()
{
    int i,j,k;
    double a[DIM1][DIM2][DIM3],  b[DIM1][DIM2][DIM3], c[DIM1][DIM2][DIM3];
    double aa[DIM4][DIM5][DIM6],  bb[DIM4][DIM5][DIM6], cc[DIM4][DIM5][DIM6];
    for (i= 0 ; i < DIM1; i++) for(j= 0 ;j<DIM2; j++) for (k= 0 ; k < DIM3; k++)
    {
         a[i][j][k] = i+j + k;
         b[i][j][k] = i-j - k;
    }
    for (i= 0 ; i < DIM4; i++) for(j= 0 ;j<DIM5; j++) for (k= 0 ; k < DIM6; k++)
    {
         aa[i][j][k] = i+j + k;
         bb[i][j][k] = i-j - k;
    }

    sum_matr(DIM1,DIM2,DIM3,a[ 0 ][ 0 ],b[ 0 ][ 0 ],c[ 0 ][ 0 ]);
    sum_matr(DIM4,DIM5,DIM6,aa[ 0 ][ 0 ],bb[ 0 ][ 0 ],cc[ 0 ][ 0 ]);
    for (i= 0 ; i < DIM1; i++) for (j= 0 ; j < DIM2; j++) for (k= 0 ; k < DIM3; k++)
       if (a[i][j][k] + b[i][j][k] != c[i][j][k]) {
           printf("%s","\n  ivalid sum 1");
           goto exit;
           }
     for (i= 0 ; i < DIM4; i++) for (j= 0 ; j < DIM5; j++) for (k= 0 ; k < DIM6; k++)
        if (aa[i][j][k] + bb[i][j][k] != cc[i][j][k]) {
           printf("%s","\n invalid sum 2");
           goto exit;
           }
    printf("%s","\nOk");
exit:
    return  0 ;
};
И п/п (в отдельном модуле):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void sum_matr( DIM1, DIM2, DIM3, a, b, c)
int DIM1, DIM2, DIM3;
double *a, *b, *c;

{
   int i,j,k, ind;
   for (i= 0 ; i < DIM1; i++)   for(j= 0 ; j < DIM2; j++)    for(k =  0 ; k < DIM3; k++) {
      ind = i * DIM2 * DIM3 + j * DIM3 + k;
      c[ind] = a[ind] + b[ind];
      }
}
Одна и та же п/п используется и правильно работает для двух совершенно разных размеров массивов.
Процесс компляции и выполнения:
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997745
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И? Вы что, хотите сказать что если я вынесу свою функцию в отдельный файл, скомпилирую её в .obj, а потом буду линковать с main'ом для разных DIM1, DIM2, DIM3, то мой вариант не будет работать что ли? Я правильно Вас понял?
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997750
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_n,
Совершенно верно. Он не то что не будет правильно работать, но и вряд ли какой-нибудь компилятор создаст программу вообще.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997762
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну Вы и упёртый юноша. Может так будет понятней?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
#include <iostream.h>
#include <malloc.h>

void sum_matr(const int, const int, const int, double ***, double ***, double ***);

const int DIM1 =  10 ;
const int DIM2 =  15 ;
const int DIM3 =  20 ;

const int DIM11 =  3 ;
const int DIM22 =  4 ;
const int DIM33 =  5 ;

int main()
{
	double*** A = (double***)malloc(sizeof(double**)*DIM1);
	double*** B = (double***)malloc(sizeof(double**)*DIM1);
	double*** C = (double***)malloc(sizeof(double**)*DIM1);

	int i,j,k;

	for(i =  0 ; i < DIM1; i++)
	{
		A[i] = (double**)malloc(sizeof(double*)*DIM2);
		B[i] = (double**)malloc(sizeof(double*)*DIM2);
		C[i] = (double**)malloc(sizeof(double*)*DIM2);

		for(j=  0 ; j < DIM2; j++)
		{
			A[i][j] = (double*)malloc(sizeof(double)*DIM3);
			B[i][j] = (double*)malloc(sizeof(double)*DIM3);
			C[i][j] = (double*)malloc(sizeof(double)*DIM3);

			for(k= 0 ; k < DIM3; k++)
			{
				A[i][j][k] =  1 . 0 ;
				B[i][j][k] =  2 . 0 ;
				C[i][j][k] =  0 . 0 ;
			}
		}
	}

	double*** AA = (double***)malloc(sizeof(double**)*DIM11);
	double*** BB = (double***)malloc(sizeof(double**)*DIM11);
	double*** CC = (double***)malloc(sizeof(double**)*DIM11);

	for(i =  0 ; i < DIM11; i++)
	{
		AA[i] = (double**)malloc(sizeof(double*)*DIM22);
		BB[i] = (double**)malloc(sizeof(double*)*DIM22);
		CC[i] = (double**)malloc(sizeof(double*)*DIM22);

		for(j=  0 ; j < DIM22; j++)
		{
			AA[i][j] = (double*)malloc(sizeof(double)*DIM33);
			BB[i][j] = (double*)malloc(sizeof(double)*DIM33);
			CC[i][j] = (double*)malloc(sizeof(double)*DIM33);

			for(k= 0 ; k < DIM33; k++)
			{
				AA[i][j][k] =  1 . 0 ;
				BB[i][j][k] =  2 . 0 ;
				CC[i][j][k] =  0 . 0 ;
			}
		}
	}

	sum_matr(DIM1, DIM2, DIM3, A, B, C);
	sum_matr(DIM11, DIM22, DIM33, AA, BB, CC);

	for(i =  0 ; i < DIM1; i++)
		for(j=  0 ; j < DIM2; j++)
			for(k =  0 ; k < DIM3; k++)
				cout << "C[" << i << "][" << j << "][" << k << "] = " << C[i][j][k] << endl;

	for(i =  0 ; i < DIM11; i++)
		for(j=  0 ; j < DIM22; j++)
			for(k =  0 ; k < DIM33; k++)
				cout << "CC[" << i << "][" << j << "][" << k << "] = " << CC[i][j][k] << endl;

	for(i =  0 ; i < DIM1; i++)
	{
		for(j=  0 ; j < DIM2; j++)
		{
			free(A[i][j]);
			free(B[i][j]);
			free(C[i][j]);
		}

		free(A[i]);
		free(B[i]);
		free(C[i]);
	}

	free(A);
	free(B);
	free(C);

	for(i =  0 ; i < DIM11; i++)
	{
		for(j=  0 ; j < DIM22; j++)
		{
			free(AA[i][j]);
			free(BB[i][j]);
			free(CC[i][j]);
		}

		free(AA[i]);
		free(BB[i]);
		free(CC[i]);
	}

	free(AA);
	free(BB);
	free(CC);

	return  0 ;
}

void sum_matr(const int ind1, const int ind2, const int ind3, double ***a, double ***b, double ***c)
{
         for(int i =  0 ; i < ind1; i++)
              for(int j=  0 ; j < ind2; j++)
                   for(int k= 0 ; k < ind3; k++)
                        c[i][j][k] = a[i][j][k] + b[i][j][k];
}
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997785
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты в студию, плиз.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997801
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На каком же компиляторе? Мой скромный MS 2008 выдает следующее:
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997813
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пжалуйста...
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997816
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат...
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997821
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MS VS 6.0, дома юзаю Sun Studio 11 на Solaris 10х86 (64 бит), тоже без проблем...
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997832
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vowk , возможно я не понял вашу идею, но пример со СЛОЖЕНИЕМ матриц весьма неудачен. Проведя комплексную оптимизацию, можно три цикла свернуть в один и сделать реализацию тривиальной. Может быть пример с УМНОЖЕНИЕМ был-бы более показателен. Еще неплохо-бы лицезреть контр-пример на Ф., без которого сравнение получается несколько "серым" и "однообразным".
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997852
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык об оптимизации речь даже и не идёт. С одномерным массивом всё ясно, хотя при кодировании мат алгоритмов бывают ситуации когда удобнее использовать другие структуры, но да это всё банальные вещи. По сравнению с фортраном, вот лично мне на си не хватает такой фишки:

Сам метод:

Код: plaintext
1.
2.
3.
4.
5.
SUBROUTINE MATRIX(N,M,K,A)
  INTEGER N,M,K
  DOUBLE PRECISION A( 1 )
  .....
  тело метода
END

Вызов:

Код: plaintext
1.
DOUBLE PRESISION A( 100 , 200 , 300 )
CALL MATRIX( 100 , 200 , 300 ,A)

То есть я внутри метода работаю с A как с одномерным массивом размерности N*M*K, а в описании интерфейса говорю что это трехмерный массив A(N,M,K). У нас была очень большая математическая библиотека написана в таком стиле на фортране, вот при портировании её на чистый Си этот момент доставлял неудобства.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997854
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Vowk , возможно я не понял вашу идею,Да идея там всего одна - не умеет человек пользоваться языком, отсюда и все его возражения.

Vowk , хочешь отдельных модулей? Которые можно по отдельности компилировать и в разные проекты вставлять? Смотри приложенный архив.
Чистый ANSI C, никаких артефактов из С++. Я не знаю компилятора который с этой программой не справится. Но вот, чтоб ты не блуждал в трех соснах:
Код: plaintext
1.
2.
3.
4.
5.
  cl /c main.c
  cl /c make_matr.c
  cl /c prn_matr.c
  cl /c sum_matr.c
  link /out:test.exe main.obj make_matr.obj prn_matr.obj sum_matr.obj
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997857
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_n,
да, проверил, всё работает. Спасибо, теперь понял одно из различий между С и С++. Правда, несколько сложноватое объявление массивов, но всё же сильная вещь.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997867
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_nДык об оптимизации речь даже и не идёт. С одномерным массивом всё ясно, хотя при кодировании мат алгоритмов бывают ситуации когда удобнее использовать другие структуры, но да это всё банальные вещи. По сравнению с фортраном, вот лично мне на си не хватает такой фишки:

Сам метод:

Код: plaintext
1.
2.
3.
4.
5.
SUBROUTINE MATRIX(N,M,K,A)
  INTEGER N,M,K
  DOUBLE PRECISION A( 1 )
  .....
  тело метода
END

Вызов:

Код: plaintext
1.
DOUBLE PRESISION A( 100 , 200 , 300 )
CALL MATRIX( 100 , 200 , 300 ,A)

То есть я внутри метода работаю с A как с одномерным массивом размерности N*M*K, а в описании интерфейса говорю что это трехмерный массив A(N,M,K). У нас была очень большая математическая библиотека написана в таком стиле на фортране, вот при портировании её на чистый Си этот момент доставлял неудобства.
А что, приведение типов уже отменили?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void MATRIX(N, M, K, A)
int N, M, K;
double ***A;
{
     double *one_dimension_A = (double *)A;
     // а теперь можешь обращаться к одному и тому же массиву данных в любой размерности.
}
А как дополнительная конфетка: обрати внимание как параметры объявлены.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997876
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
тоже спасибо. Выходит, что это особенность не С++ даже, а обычного С. Пример внимательно изучил.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997879
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да понятно... Не ЭЛЕГАНТНО ЭТО.

double*** - вот это - не элегантно, много геморроя с аллокацией/инициализацией в вызывающей программе. В фортране компиллятор делает это за меня, к хорошему быстро привыкаешь.

авторПравда, несколько сложноватое объявление массивов, но всё же сильная вещь

А это не массивы. Массивы это такие легкие элегантные конструкции которые живут на стеке. А это - нечто что мы налобали из кучи, а СИ всего лишь подсластил нам пилюлю создав иллюзию что с этим нечто можно обращаться как с массивом.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997883
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА как дополнительная конфетка: обрати внимание как параметры объявлены.

А это разве не depricated фича? Чё то у меня смутное чуство что таки да.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997884
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчет Фортрана - то там использовались массивы с переменыыми размерами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DOUBLE PRESISION A( 100 , 200 , 300 ), B( 100 , 200 , 300 ), C( 100 , 200 , 300 )
CALL MATRIX( 100 , 200 , 300 ,A,B,C)
...
SUBROUTINE MATRIX(M,N,L,A,B,C)
DIMENSION A(M,N,*), B(M,N,*),C(M,N,*)
FOR I= 1 ,M
   FOR J= 1 ,N
      FOR K= 1 ,L
         C(I,J,K) = A(I,J,K) + B(I,J,K)
      END  
   END
END
Всё же попроще, чем на С.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997893
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_nавторА как дополнительная конфетка: обрати внимание как параметры объявлены.А это разве не depricated фича? Чё то у меня смутное чуство что таки да.Да, ее пытались объявить устаревшей, но даже сегодня любой компилятор ее прекрасно понимает. Хотя в классическом учебнике от K&R она уже не упоминается вообще.
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где декларируется связь между звёздочкой '*' и переменной 'L' ?
...
Рейтинг: 0 / 0
Много ли новых проектов пишется на C
    #35997909
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА где декларируется связь между звёздочкой '*' и переменной 'L' ?
* означает размер неопределенной длины (может быть, 1, а может быть и 100).
Для вычисления индекса последняя размерность массива не имеет значения. Это программист знает, что L - это третья размерность массива, а компилятору она не нужна.
Код: plaintext
1.
одномерный индекс A(I,J,K) = I + M*J + M*N*K 
- компилятору надо знать M и N, а последняя размерность L не участвует в вычислении одномерного индекса.
...
Рейтинг: 0 / 0
25 сообщений из 101, страница 4 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Много ли новых проектов пишется на C
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]