Имя: Пароль:
IT
 
Вопрос по Си
0 Сергей
 
20.05.04
11:21
Люди, помогите разобраться, где "косяк". Вот начало програмки.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <ctype.h>
#define M 281
#define C 143
#define P1 280
#define N1 280
#define Mem 65535
typedef struct
{    int nomer;
   char nazv[49];
   int kod;
   int znach;
} PRIZ;
void main(void)
{
FILE *f,*f1,*f2,*out,*out1,*out2,*out3,*w1;
PRIZ *priz;
int x[M][C];
и т.д.
Компилирую, ругается на - int x[M][C];
Говорит - Array size too large in function main. В чём дело, а ?
1 SnarkHunter
 
20.05.04
11:26
Тебе перевести?
2 Сергей
 
20.05.04
11:30
SnarkHunter, перевести не надо (острить не надо). Я в Си не силен, если можешь, подскажи чё здесь не правильно.
3 Z1
 
20.05.04
11:35
поставь числа например
int x[100][100];
4 SnarkHunter
 
20.05.04
11:38
Уменьши размерность...
5 Сергей
 
20.05.04
11:40
Z1, с твоим вариантом нет ошибки, но мне нужно разобраться, почему с int x[M][C] не получается.
6 Z1
 
20.05.04
11:44
(5) Тогда ответь (мне или себе) что такое M в твое случае.
Память выделяется массивам статически.
7 Сергей
 
20.05.04
11:45
SnarkHunter, с размерностью понятно, но ты не мог бы объяснить, почему такая хрень. Ведь в таком варианте у кого то работало (роюсь с дипломе). Вот только имеется текст программы. А самого exe нет.
8 SnarkHunter
 
20.05.04
11:48
(6) #define M 281 <--
9 Сергей
 
20.05.04
11:54
SnarkHunter, с тем, что М 281 мне понятно. Имеется ли конкретное ограничение, например для этого М?
10 Z1
 
20.05.04
11:55
(8) Сорри #define я даже не посмотрел.
(7)Тогда С набита не в том регистре скорее всего русская.
посмотри текст после препроцессора.
И вообще надо давать более осмысленные имена переменым.
11 Сергей
 
20.05.04
12:01
Z1, нет, набито не русскими. Если меняю на #define M 100, то пролитает ошибка с этого М. Но говорю же, роюсь в чужом дипломе, у него именно М 281. Чё за хрень?
12 Z1
 
20.05.04
12:12
(11) поменяй M на M_INDEX1
т.е #define M_INDEX1 281
#define M_INDEX2 143

и
int x[M_INDEX1][M_INDEX2];
Смотри текст после препроцессора.
13 spock
 
20.05.04
12:49
Ошибки в (0) нет. Уточни название компилятора.
14 User63
 
20.05.04
13:16
Попробовал у себя на компьютере откомпиллировать. Та же ошибка. Нормально компилируется когда М х С <32768. Может тут собака зарыта?
15 spock
 
20.05.04
13:22
2(14)А у меня нормально...
нозвание и версию компилятора в студию.
16 Сергей
 
20.05.04
13:25
spock, подскажи чем располагаешь, и адресок инструментов, если можно.
17 User63
 
20.05.04
13:26
Borland C++ v.5.02
18 Сергей
 
20.05.04
13:28
А адресом не располагаешь, где можно взять ?
19 spock
 
20.05.04
13:38
Я компилил на VC.
20 Сергей
 
20.05.04
13:41
spock, если адресом не располагаешь, то всё равно спасибо.
21 spock
 
20.05.04
13:43
Адрес VC это CD у меня в столе :)
22 User63
 
20.05.04
13:48
Сам не покупал,CD брал у знакомого. В(6) говорится, что память выделяется статически. Может где-то есть ограничение? В Си я тоже не силен. А может попробовать сперва сделать указатель на массив, а потом выделить память под этот массив.
23 Z1
 
20.05.04
14:02
(22) Либо поставь static либо объяви массив глобальным.
Проблемы реализации С на pc  компьютерах.
В (6) немного не правильно написал про статически.
Я просто в (6) не видел define и имел ввиду что нельзя определять массивы
без задания конкретного диапозона( длин) массива.
Т.е. если внутри модуля объявлен массив то память выделяется на стеке и пока
функция  выполняется массив существует.
Статические и глобальные массивы выделяются из других сегментов памяти и существуют пока существует процесс.
24
 
20.05.04
14:23
Чё-то припоминается, что в древних C-компилях было понятие модели памяти: от Tiny до Huge. Может, в этом гвоздь? Не настаиваю, больше 10 лет назад занимался...
25 Z1
 
20.05.04
15:00
(22)
распечатай в своем С строку
printf("sizeof int = %d\n", sizeof(int) );
Если размер равен 2 то все понятно на int отводиться 16 разрядов вместе со
знаком поэтому массив не может превышать страницу памяти.
Можно попробовать вместо int поставить long.
Также в pc компиляторах может стоять органичение на размер стека и модель
памяти.
Можно поискать это в опциях компилятора.

Т.е. это не ошибки языка С а ограничения конкретной реализации.
(0)Роюсь в дипломе - если ты поймешь ветку и сможешь изложить в своем дипломе то можешь претендовать на высшую оценку.
26 Сергей
 
23.05.04
14:10
Продолжая эту тему. Ребята подскажите почему ругается -
warning C4098: 'main' : 'void' function returning a value
на строчку
if(f1==NULL)
{printf("Ошибка в имени файла\n"); return(0);
}
В си не силен, поэтому строго не судите.
27 Волшебник
 
23.05.04
14:15
(26) return(0) замени на return;
28 Сергей
 
23.05.04
14:19
Волшебник, а это чё за хрень, не подскажешь
warning C4244: '=' : conversion from 'int ' to 'float ', possible loss of data
29 SnarkHunter
 
23.05.04
14:22
(26)У тебя функция f1 описАна как void, то есть не возвращающая значения, а ты пытаешься сравнивать возвращаемое значение с NULL...
(28)А здесь просто переведи с английского...
30 Волшебник
 
23.05.04
14:30
(29) действительно.
например 15.25 превращаются в 15 - явная потеря данных.
31 Сергей
 
23.05.04
14:34
Всем спасибочки!!!
32 SnarkHunter
 
23.05.04
14:35
... хотя в (28) говорится о преобразовании целого к плавающему...