Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив, Проблема с двумерным массивом 
:(
    Опции темы
adamo86
Дата 17.4.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.11.2008
Где: Deutschland

Репутация: нет
Всего: нет



Всем привет. При компиляции ниже изложенного кода компилятор никаких ошибок не выдает, а вот при запуске сразу выскакивает ошибка. Не знаю в чем дело. Отследил что беда в последней (очередной строке): "tmp[i][j] = 1;" Замысел программы таков, что сначала прога читает первую строку из файла "Graf3.txt". и на основании прочитанного числа N создает матрицу NxN. А затем я пытаюсь заполнить некоторые элементы матрицы. Помогите, я не понимаю что я не правильно делаю.
Содержание файла "Graf3.txt" таково:
 6
1 2
3 4
5 6
7 8
9 10
11 12

Код программы:
Код

#include <iostream>
#include <stdio.h>
#include <conio.h>

using namespace std;
int main()
{
        
    int N, i, j;
    FILE *f;
    f = fopen("c:/Graf3.txt","r");
    
    fscanf(f,"%d",&N);

    int **tmp;
    tmp = new int*[ N];
    for (int i = 0; i != N; ++i)
        tmp[i] = new int[N];
 
    for (int i = 0; i != N; ++i)
        for (int j = 0; j != N; ++j)
            tmp[i][j] = N;
        
        fscanf(f,"%d %d",&i,&j);
        tmp[i][j] = 1;

        fscanf(f,"%d %d",&i,&j);
        tmp[i][j] = 1;

        fscanf(f,"%d %d",&i,&j);
        tmp[i][j] = 1;

        fscanf(f,"%d %d",&i,&j);
        tmp[i][j] = 1;

        fclose (f);
        getch();
        return 0;
}

PM MAIL Skype   Вверх
volatile
Дата 18.4.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(adamo86 @  17.4.2011,  23:35 Найти цитируемый пост)
Содержание файла "Graf3.txt" таково:
 6
1 2
3 4
5 6
7 8
9 10
11 12

Ну давайте немножко рассуждать.
Цитата(adamo86 @  17.4.2011,  23:35 Найти цитируемый пост)
а основании прочитанного числа N создает матрицу NxN.

создали матрицу 6х6

и что делаем дальше:
tmp[1][2] = 1;
tmp[3][4] = 1;
tmp[5][6] = 1; // уже вышли за пределы массива
tmp[7][8] = 1; // совсем вышли за пределы массива
tmp[9][10] = 1; // пишем уже практически в космос



PM MAIL   Вверх
adamo86
Дата 18.4.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.11.2008
Где: Deutschland

Репутация: нет
Всего: нет



Спасибо volatile, ты меня спас. Надо же как я не доглядел.
PM MAIL Skype   Вверх
adamo86
Дата 18.4.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.11.2008
Где: Deutschland

Репутация: нет
Всего: нет



А как создать строковой массив используя STL? И соответственно как его заполнять?
PM MAIL Skype   Вверх
borisbn
Дата 19.4.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(adamo86 @  18.4.2011,  13:29 Найти цитируемый пост)
А как создать строковой массив используя STL? И соответственно как его заполнять?

Код

typedef std::vector< std::string > array_of_strings;
array_of_strings arr;

arr.push_back( "Hello " );
arr.push_back( "world " );
arr.push_back( "!" );
arr.push_back( "\n" );

for ( array_of_strings::const_iterator it = arr.begin(); it != arr.end(); ++it ) {
    std::cout << (*it);
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Буратиныч
Дата 23.4.2011, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



У меня немного другой вопрос. 
1) Как создать очень большой двумерный массив, типа float array[1000000][10000], и при этом не переполнить стэк, т.е. чтоб не выскакивало исключение Stack overflow?
2) Как его правильно объявить, если количество элементов заранее в нём не известно. В примере выше используется Вектор для типа string. Для флоат тоже самое?
PM MAIL   Вверх
borisbn
Дата 23.4.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Буратиныч @  23.4.2011,  09:36 Найти цитируемый пост)
1) Как создать очень большой двумерный массив, типа float array[1000000][10000], и при этом не переполнить стэк, т.е. чтоб не выскакивало исключение Stack overflow?

указать компилятору бОльший размер стека, но IMHO это неверное решение (см. ответ п.2)

Цитата(Буратиныч @  23.4.2011,  09:36 Найти цитируемый пост)
2) Как его правильно объявить, если количество элементов заранее в нём не известно. В примере выше используется Вектор для типа string. Для флоат тоже самое?

Код

typedef std::vector< float > FloatVector;
FloatVector array;
array.resize( needSize );
...
array[ i ] = 42.42f;
float x = array[ i ];


для двумерного случая:
Код

typedef std::vector< float > FloatVector;
typedef std::vector< FloatVector > FloatVector2D;
FloatVector2D array2D;
array2D.resize( needRows );
for ( int row = 0; row < needRows; row++ ) {
    array2D[ row ].resize( needCols );
}
...
array2D[ row ][ col ] = 42.42f;
float x = array2D[ row ][ col ];




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Буратиныч
Дата 23.4.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



borisbn, к векторам я ещё вернусь, а пока как в VS2010 изменять размер стэка?
PM MAIL   Вверх
borisbn
Дата 23.4.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Буратиныч @  23.4.2011,  09:55 Найти цитируемый пост)
как в VS2010 изменять размер стэка?

http://ru.lmgtfy.com/?q=%D0%BA%D0%B0%D0%BA...%B5%D0%BA%D0%B0


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Буратиныч
Дата 23.4.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



borisbn, запись типа
Код

STACK:99999999999999,99999999999;
float array[1000000][10000]

ничего не меняет. Переполняется.

Это сообщение отредактировал(а) Буратиныч - 23.4.2011, 10:29
PM MAIL   Вверх
borisbn
Дата 23.4.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Буратиныч, 1000000 * 10000 * sizeof( float ) = 1000000 * 10000 * 4 = 40000000000 = 40 ГБ
У тебя есть столько памяти на борту ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Буратиныч
Дата 23.4.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Ну я же не все сразу эти девятки запихивал, постепенно прибавлял. Ещё 2ГБ свободно.

Это сообщение отредактировал(а) Буратиныч - 23.4.2011, 10:42
PM MAIL   Вверх
borisbn
Дата 23.4.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(borisbn @  23.4.2011,  10:31 Найти цитируемый пост)
40 ГБ
У тебя есть столько памяти на борту ?

Цитата(Буратиныч @  23.4.2011,  10:42 Найти цитируемый пост)
Ещё 2ГБ свободно.

другими словами у тебя компьютер с 42 ГБ памяти. Хорошо, бывает. А что за задача, если не секрет, которая требует одновременно иметь в памяти 10 млрд float'ов ?

Это сообщение отредактировал(а) borisbn - 23.4.2011, 12:31


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Буратиныч
Дата 23.4.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



borisbn, вобщем, что сделать чтоб массив миллион на 10 тысяч выделялся? STACK не помогает, либо не правильно им пользуюсь.
PM MAIL   Вверх
Буратиныч
Дата 23.4.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Как правильно задать двумерный массив через new-delete?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.