Вход | Регистрация


Информационные технологии ::

Метки: 

Вопрос по Си

Я
   Сергей
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. В чём дело, а ?
 
 
   Z1
3 - 20.05.04 - 11:35
поставь числа например
int x[100][100];
   SnarkHunter
 
4 - 20.05.04 - 11:38
Уменьши размерность...
   Сергей
5 - 20.05.04 - 11:40
Z1, с твоим вариантом нет ошибки, но мне нужно разобраться, почему с int x[M][C] не получается.
   Z1
6 - 20.05.04 - 11:44
(5) Тогда ответь (мне или себе) что такое M в твое случае.
Память выделяется массивам статически.
   Сергей
7 - 20.05.04 - 11:45
SnarkHunter, с размерностью понятно, но ты не мог бы объяснить, почему такая хрень. Ведь в таком варианте у кого то работало (роюсь с дипломе). Вот только имеется текст программы. А самого exe нет.
   SnarkHunter
 
8 - 20.05.04 - 11:48
(6) #define M 281 <--
   Сергей
9 - 20.05.04 - 11:54
SnarkHunter, с тем, что М 281 мне понятно. Имеется ли конкретное ограничение, например для этого М?
   Z1
10 - 20.05.04 - 11:55
(8) Сорри #define я даже не посмотрел.
(7)Тогда С набита не в том регистре скорее всего русская.
посмотри текст после препроцессора.
И вообще надо давать более осмысленные имена переменым.
 
  Рекламное место пустует
   Сергей
11 - 20.05.04 - 12:01
Z1, нет, набито не русскими. Если меняю на #define M 100, то пролитает ошибка с этого М. Но говорю же, роюсь в чужом дипломе, у него именно М 281. Чё за хрень?
   Z1
12 - 20.05.04 - 12:12
(11) поменяй M на M_INDEX1
т.е #define M_INDEX1 281
#define M_INDEX2 143

и
int x[M_INDEX1][M_INDEX2];
Смотри текст после препроцессора.
   spock
 
13 - 20.05.04 - 12:49
Ошибки в (0) нет. Уточни название компилятора.
   User63
14 - 20.05.04 - 13:16
Попробовал у себя на компьютере откомпиллировать. Та же ошибка. Нормально компилируется когда М х С <32768. Может тут собака зарыта?
   spock
 
19 - 20.05.04 - 13:38
Я компилил на VC.
   User63
22 - 20.05.04 - 13:48
Сам не покупал,CD брал у знакомого. В(6) говорится, что память выделяется статически. Может где-то есть ограничение? В Си я тоже не силен. А может попробовать сперва сделать указатель на массив, а потом выделить память под этот массив.
   Z1
23 - 20.05.04 - 14:02
(22) Либо поставь static либо объяви массив глобальным.
Проблемы реализации С на pc  компьютерах.
В (6) немного не правильно написал про статически.
Я просто в (6) не видел define и имел ввиду что нельзя определять массивы
без задания конкретного диапозона( длин) массива.
Т.е. если внутри модуля объявлен массив то память выделяется на стеке и пока
функция  выполняется массив существует.
Статические и глобальные массивы выделяются из других сегментов памяти и существуют пока существует процесс.
  
24 - 20.05.04 - 14:23
Чё-то припоминается, что в древних C-компилях было понятие модели памяти: от Tiny до Huge. Может, в этом гвоздь? Не настаиваю, больше 10 лет назад занимался...
   Z1
25 - 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
   SnarkHunter
 
29 - 23.05.04 - 14:22
(26)У тебя функция f1 описАна как void, то есть не возвращающая значения, а ты пытаешься сравнивать возвращаемое значение с NULL...
(28)А здесь просто переведи с английского...
   Волшебник
 
30 - 23.05.04 - 14:30
(29) действительно.
например 15.25 превращаются в 15 - явная потеря данных.
   SnarkHunter
 
32 - 23.05.04 - 14:35
... хотя в (28) говорится о преобразовании целого к плавающему...



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует