|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.01.2015, 01:33 | #1 |
Пользователь
Регистрация: 09.11.2014
Сообщений: 40
|
Функция gets() не хочет читать строку в СИ.
Начал писать программу, в которой нужно ввести строку. Попытался ввести её с помощью функции gets(), а мне показало ошибку:
warning #2018: Undeclared function 'gets'; assuming 'extern' returning 'int'. Код:
|
05.01.2015, 04:18 | #2 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,601
|
char a[n]; должно быть в начале main до использования printf;
размер массива у вас не константа, то есть это ошибочное объявление. Размер массива должен быть константой, так как этот массив записывается по статическому количеству байт в исполняемый файл, то есть в образ исполняемого файла в памяти. С неизвестным размером массива неконстантным запись в файл невозможна. Архитектура операционной системы такая. Чтобы выделить под массив неконстантное количество байт нужно использовать динамическое выделение памяти, когда память выделяется из кучи. Вам нужно хорошо понять, что такое куча, так как в профессиональных программах создается пул из оперативной памяти в виде класса, и из этого пула выделяется необходимое количество байт. Создание кучи на winAPI осуществляется с помощью HeapAlloc. То есть действие с кучей нужно хорошо понимать. Например, в игре STALKER 2007 года реализован особый модуль для обработки кучи. Кроме того реализуется особый модуль для работы с указателями (т.н. умные указатели). Особый модуль для размера с массивами. Чтобы динамически выделить память, не создавая специальный профессиональный модуль, нужно использовать функцию malloc языка C, которая на самом деле в windows является оберткой (wrapper) над HeapAlloc. А на языке C++ используется оператор new. Дело в том, что в профессиональных программах, вам может понадобиться больше 16 гигабайт памяти, так как сейчас на некоторых компьютерах может быть 16 и больше гигабайт оперативной памяти, и ее нужно уметь использовать. Так как если в игре множество текстур, каждая из которых по 1 мегабайту, то для тысячи текстур в игре может понадобиться гигабайт оперативной памяти. Освобождение выделенной памяти осуществляется операторами delete иили функцией free языка C. Пример динамического выделения памяти char* a = (char*) malloc (n*sizeof(char)); char* b = new[a];
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
Последний раз редактировалось challengerr; 05.01.2015 в 04:29. |
05.01.2015, 18:59 | #3 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
gets(a); - Нельзя ввести сразу весь массив элементов.
Можно ввести элемент массива. Ввод элементов массива выполняется с использованием цикла. Массив следует описывать в начале программы,с явным указанием размера. Так понимаю, что до работы с динамической памятью ... Как-то так, ...
Как-то так, ...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
функция получае на вход строку чисел, выводит строку символов | DellOleg | Microsoft Office Access | 2 | 18.02.2012 11:17 |
Читать из файла случайную строку | KoBRaAndrey | Общие вопросы Delphi | 3 | 28.10.2009 21:38 |
ActiveX не хочет читать большой файл | Miklek | Общие вопросы Delphi | 0 | 02.04.2009 11:55 |
Программный шлюз не хочет читать | marain | Общие вопросы C/C++ | 0 | 07.01.2009 00:52 |
DVD-RW дисковод не хочет читать некоторые диски | ERASERROR | Компьютерное железо | 10 | 02.05.2008 01:00 |