![]() |
![]() |
![]() |
|
Вопрос по Си | ☑ | ||
---|---|---|---|---|
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) говорится о преобразовании целого к плавающему...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |