Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Не получается глобально... - C++

13.11.2011, 12:53. Просмотров 389. Ответов 8
Метки нет (Все метки)

Здравствуйте. Сразу к вопросу.
Вот написала вот такой код чтения числа из бинарного файла, все прекрасно работает, но вопрос вот в чем, почему когда я пытаюсь записать инструкцию fileName[32][0] = "data.bin"; не в майне, а в глобальных объявлениях, происходит ошибка.
Вот программа:

C++
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
#include <iostream>
#include <stdio.h>
 
void Load( const char* fileName );
 
int i;
FILE* file;
const char* fileName[32][256]; // 256 шт и все по 32
//----->  хочу поставить здесь fileName[32][0] = "data.bin";
 
//---------------------------------------
// Name: main()
// Desc: main, функция main...
//---------------------------------------
int main(int argc, char *argv[] )
{
    fileName[32][0] = "data.bin"; // как убрать из майна?
 
    Load( fileName[32][0] );
 
    system( "pause" );
    return 0;
}
 
//---------------------------------------
// Name: Load()
// Desc: открывает бин.файл, читает в
//       нем число и выводит на экран
//---------------------------------------
void Load( const char* fileName )
{
    file = fopen( fileName, "rb");
    fread( &i, sizeof(int), 1, file );
    printf( "%i \n", i );
    fclose( file );
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 12:53     Не получается глобально...
Посмотрите здесь:

не получается! C++
не видны переменные и объекты которые глобально объявлены в классе C++
Как глобально объявить массив не заданной размерности C++
C++ Как объявить переменную глобально?
Как объявить ofstream глобально C++
C++ Как передать в функцию указатель на структуру, если эта структура не определена глобально?
Почему нельзя объявить динамический массив глобально C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.11.2011, 13:35     Не получается глобально... #2
В общем тут сложно объяснить, но суть в том, что инициализация глобальных переменных должна быть в той же строке, что и объявление. Например:
C++
1
2
3
//global scope
int i;
i=5;
привет к такой же ошибки, как у тебя.
а так:
C++
1
2
//global scope 
int i = 5;
будет правильно.
Если в двух словах, то компилятор делает отдельную функцию для инициализации глобальных переменных. Сначала он видит строку
C++
1
const char* fileName[32][256];
и видит, что массиву не присвено ни каких значений, поэтому он создает код для заполнения массива нулями (глобальные переменные инициализируются нулями по умолчанию). Потом видит строку:
C++
1
fileName[32][0] = "data.bin";
и тут у него случается когнитивный диссонас, он думает :"какого хера, я же только что создал функцию для заполнения этого массива нулями, что тут делает эта строка?" И ругается на нее!

Добавлено через 6 минут
Вот статья не по теме, но там есть небольшое объяснение этого момента.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2011, 13:42  [ТС]     Не получается глобально... #3
А когда я вот так делаю тоже диссонанс?
C++
1
const char* fileName[32][256] = { "data.bin", "data1.bin", "data2.bin", "data3.bin", "data4.bin" };
Компилируется, но программа вылетает с ошибкой.
Все дата.бин на месте.
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
13.11.2011, 13:47     Не получается глобально... #4
programina, 256 - это для символов или как?
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2011, 13:49  [ТС]     Не получается глобально... #5
256 - это число элементов в массиве, каждый элемент по 32
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.11.2011, 13:54     Не получается глобально... #6
Цитата Сообщение от programina Посмотреть сообщение
Компилируется, но программа вылетает с ошибкой.
ошибка похоже здесь:
C++
1
Load( fileName[32][0] );
выход за пределы массива.
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
13.11.2011, 13:57     Не получается глобально... #7
Цитата Сообщение от programina Посмотреть сообщение
256 - это число элементов в массиве


Ладно по другому задам вопрос. По идее программа будет открывать 32 файла или 32*256 файлов?
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.11.2011, 14:05     Не получается глобально... #8
Да, тоже есть ощущение, что должно быть как то так:
C++
1
2
3
const char* fileName[32]= { "data.bin", "data1.bin", "data2.bin", "data3.bin", "data4.bin",/*...*/, "data31.bin" };
//...
Load( fileName[0] );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 15:04     Не получается глобально...
Еще ссылки по теме:

Как локальную переменную сделать глобально, при это сохранив накопленное в ней значение? C++
Не получается C++
Как глобально объявить указатель структуры, и переменные хранящиеся в ней? C++
C++ Не получается
C++ Как завести вектор и структуру глобально в заголовочном файле или в чем ошибка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2011, 15:04  [ТС]     Не получается глобально... #9
Спасибо вам Евгений М. и Kastaneda
Переписала вот так, все работает и все дата.бины вне майна

C++
1
2
3
4
5
6
7
const char* fileName[256]= { "data.bin", "data1.bin", "data2.bin", "data3.bin", "data4.bin", "data5.bin" };
 
int main()
{
    Load( fileName[0] );
 
    // ...
Yandex
Объявления
13.11.2011, 15:04     Не получается глобально...
Ответ Создать тему
Опции темы

Текущее время: 05:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru